diff options
author | William Jon McCann <jmccann@redhat.com> | 2010-10-30 12:16:58 -0400 |
---|---|---|
committer | William Jon McCann <jmccann@redhat.com> | 2010-10-30 14:48:55 -0400 |
commit | 6638e984ca743a7da842617346425b162bc1bb5d (patch) | |
tree | f4e448d26356441a6e886aadb1fb08e7971453f7 | |
parent | d0d96529f2bf7042c9394e637ef65bfbc62ce524 (diff) | |
download | gnome-control-center-6638e984ca743a7da842617346425b162bc1bb5d.tar.gz |
Initial import of sound panel
Copied from gnome-media. See that module for git history.
141 files changed, 42114 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac index 83a30cb3d..72f60a19f 100644 --- a/configure.ac +++ b/configure.ac @@ -75,13 +75,19 @@ dnl ============================================== dnl Check that we meet the dependencies dnl ============================================== -COMMON_MODULES="gtk+-3.0 >= 2.90.0 - glib-2.0 >= 2.25.11 +GLIB_REQUIRED_VERSION=2.25.11 +GTK_REQUIRED_VERSION=2.91.0 +DESKTOP_SCHEMAS_REQUIRED_VERSION=0.0.2 +PA_REQUIRED_VERSION=0.9.16 +CANBERRA_REQUIRED_VERSION=0.13 + +COMMON_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION gthread-2.0 gio-2.0 gconf-2.0 libxml-2.0 - gsettings-desktop-schemas >= 0.0.2" + gsettings-desktop-schemas >= $DESKTOP_SCHEMAS_REQUIRED_VERSION" PKG_CHECK_MODULES(CAPPLET, $COMMON_MODULES) PKG_CHECK_MODULES(GNOMECC_SHELL, $COMMON_MODULES libgnome-menu gio-unix-2.0) PKG_CHECK_MODULES(DBUS, dbus-1 dbus-glib-1) @@ -90,6 +96,14 @@ PKG_CHECK_MODULES(DEFAULT_APPLICATIONS_CAPPLET, libxml-2.0) PKG_CHECK_MODULES(GSD_DBUS, gnome-settings-daemon) PKG_CHECK_MODULES(GIO, gio-2.0) PKG_CHECK_MODULES(XML, libxml-2.0) +PKG_CHECK_MODULES(CANBERRA, libcanberra-gtk3 >= $CANBERRA_REQUIRED_VERSION) +AC_SUBST(CANBERRA_CFLAGS) +AC_SUBST(CANBERRA_LIBS) +PKG_CHECK_MODULES(PULSEAUDIO, + libpulse >= $PA_REQUIRED_VERSION + libpulse-mainloop-glib >= $PA_REQUIRED_VERSION) +AC_SUBST(PULSEAUDIO_CFLAGS) +AC_SUBST(PULSEAUDIO_LIBS) gtk_lib_dir=`$PKG_CONFIG --variable libdir gtk+-3.0` gtk_binary_version=`$PKG_CONFIG --variable gtk_binary_version gtk+-3.0` @@ -320,6 +334,31 @@ panels/mouse/Makefile panels/mouse/gnome-mouse-panel.desktop.in panels/network/Makefile panels/network/gnome-network-panel.desktop.in +panels/sound/Makefile +panels/sound/data/Makefile +panels/sound/data/gnome-sound-panel.desktop.in +panels/sound/data/symbolic-icons/Makefile +panels/sound/data/symbolic-icons/scalable/Makefile +panels/sound/data/symbolic-icons/scalable/status/Makefile +panels/sound/data/icons/Makefile +panels/sound/data/icons/16x16/Makefile +panels/sound/data/icons/16x16/apps/Makefile +panels/sound/data/icons/16x16/status/Makefile +panels/sound/data/icons/22x22/Makefile +panels/sound/data/icons/22x22/apps/Makefile +panels/sound/data/icons/22x22/status/Makefile +panels/sound/data/icons/24x24/Makefile +panels/sound/data/icons/24x24/apps/Makefile +panels/sound/data/icons/24x24/status/Makefile +panels/sound/data/icons/32x32/Makefile +panels/sound/data/icons/32x32/apps/Makefile +panels/sound/data/icons/32x32/status/Makefile +panels/sound/data/icons/48x48/Makefile +panels/sound/data/icons/48x48/apps/Makefile +panels/sound/data/icons/scalable/Makefile +panels/sound/data/icons/scalable/apps/Makefile +panels/sound/data/icons/scalable/devices/Makefile +panels/sound/data/sounds/Makefile panels/universal-access/Makefile panels/universal-access/gnome-universal-access-panel.desktop.in po/Makefile.in diff --git a/panels/Makefile.am b/panels/Makefile.am index 09814eea4..225fcbc2e 100644 --- a/panels/Makefile.am +++ b/panels/Makefile.am @@ -4,6 +4,7 @@ SUBDIRS= \ mouse \ keyboard \ network \ + sound \ default-applications \ keybindings \ universal-access \ diff --git a/panels/sound/Makefile.am b/panels/sound/Makefile.am new file mode 100644 index 000000000..c1ec3a77c --- /dev/null +++ b/panels/sound/Makefile.am @@ -0,0 +1,120 @@ +SUBDIRS = data + +# This is used in GNOMECC_CAPPLETS_CFLAGS +cappletname = sound +NULL = + +ccpanelsdir = $(PANELS_DIR) +ccpanels_LTLIBRARIES = libsound.la + +bin_PROGRAMS = \ + gnome-sound-applet \ + $(NULL) + +AM_CPPFLAGS = \ + $(GNOMECC_CAPPLETS_CFLAGS) \ + $(WARN_CFLAGS) \ + $(CANBERRA_CFLAGS) \ + $(PANEL_CFLAGS) \ + $(DISABLE_DEPRECATED) \ + $(PULSEAUDIO_CFLAGS) \ + -DLOCALE_DIR=\""$(datadir)/locale"\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ + -DGLADEDIR=\""$(pkgdatadir)"\" \ + -DSOUND_DATA_DIR="\"$(datadir)/sounds\"" \ + -DSOUND_SET_DIR="\"$(pkgdatadir)/sounds\"" \ + -DICON_DATA_DIR="\"$(pkgdatadir)/icons\"" \ + $(NULL) + +noinst_LTLIBRARIES = libgnomevolumecontrol.la +libgnomevolumecontrol_la_SOURCES = \ + gvc-mixer-card.h \ + gvc-mixer-card.c \ + gvc-mixer-card-private.h \ + gvc-mixer-stream.h \ + gvc-mixer-stream.c \ + gvc-mixer-stream-private.h \ + gvc-channel-map.h \ + gvc-channel-map.c \ + gvc-channel-map-private.h \ + gvc-mixer-sink.h \ + gvc-mixer-sink.c \ + gvc-mixer-source.h \ + gvc-mixer-source.c \ + gvc-mixer-sink-input.h \ + gvc-mixer-sink-input.c \ + gvc-mixer-source-output.h \ + gvc-mixer-source-output.c \ + gvc-mixer-event-role.h \ + gvc-mixer-event-role.c \ + gvc-mixer-control.h \ + gvc-mixer-control.c \ + gvc-mixer-control-private.h \ + gvc-channel-bar.h \ + gvc-channel-bar.c \ + gvc-log.h \ + gvc-log.c \ + gvc-pulseaudio-fake.h \ + $(NULL) + +gnome_sound_applet_LDADD = \ + -lm \ + libgnomevolumecontrol.la \ + $(CANBERRA_LIBS) \ + $(PULSEAUDIO_LIBS) \ + $(NULL) + +gnome_sound_applet_SOURCES = \ + gvc-stream-status-icon.h \ + gvc-stream-status-icon.c \ + gvc-applet.h \ + gvc-applet.c \ + applet-main.c \ + $(NULL) + +libsound_la_LIBADD = \ + -lm \ + libgnomevolumecontrol.la \ + $(PANEL_LIBS) \ + $(PULSEAUDIO_LIBS) \ + $(NULL) + +libsound_la_LDFLAGS = \ + $(PANEL_LDFLAGS) \ + $(CANBERRA_LIBS) \ + $(PULSEAUDIO_LIBS) \ + $(NULL) + +libsound_la_SOURCES = \ + gvc-balance-bar.h \ + gvc-balance-bar.c \ + gvc-mixer-dialog.h \ + gvc-mixer-dialog.c \ + gvc-level-bar.h \ + gvc-level-bar.c \ + gvc-combo-box.h \ + gvc-combo-box.c \ + gvc-speaker-test.h \ + gvc-speaker-test.c \ + gvc-sound-theme-chooser.c \ + gvc-sound-theme-chooser.h \ + sound-theme-file-utils.c \ + sound-theme-file-utils.h \ + cc-sound-panel.c \ + cc-sound-panel.h \ + $(NULL) + +EXTRA_DIST = gvc-sound-theme-editor.c gvc-sound-theme-editor.h + +BUILT_SOURCES = \ + $(NULL) + +CLEANFILES = \ + $(BUILT_SOURCES) \ + $(NULL) + +MAINTAINERCLEANFILES = \ + *~ \ + Makefile.in + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/applet-main.c b/panels/sound/applet-main.c new file mode 100644 index 000000000..0335fa143 --- /dev/null +++ b/panels/sound/applet-main.c @@ -0,0 +1,110 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 + * Lesser 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include "config.h" + +#include <libintl.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include <glib/gi18n.h> +#include <glib.h> +#include <gtk/gtk.h> +#include <gio/gio.h> + +#include "gvc-applet.h" +#include "gvc-log.h" + +#define GVCA_DBUS_NAME "org.gnome.VolumeControlApplet" + +static gboolean show_version = FALSE; +static gboolean debug = FALSE; + +int +main (int argc, char **argv) +{ + GError *error; + GvcApplet *applet; + GApplication *app = NULL; + static GOptionEntry entries[] = { + { "debug", 0, 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging code"), NULL }, + { "version", 0, 0, G_OPTION_ARG_NONE, &show_version, N_("Version of this application"), NULL }, + { NULL, 0, 0, 0, NULL, NULL, NULL } + }; + + bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + gvc_log_init (); + + error = NULL; + gtk_init_with_args (&argc, &argv, + (char *) _(" — GNOME Volume Control Applet"), + entries, GETTEXT_PACKAGE, + &error); + + if (error != NULL) { + g_warning ("%s", error->message); + exit (1); + } + + if (show_version) { + g_print ("%s %s\n", argv [0], VERSION); + exit (1); + } + + gvc_log_set_debug (debug); + + if (debug == FALSE) { + GError *error = NULL; + + app = g_application_new (GVCA_DBUS_NAME, + G_APPLICATION_FLAGS_NONE); + if (!g_application_register (app, NULL, &error)) { + g_warning ("%s", error->message); + g_error_free (error); + return 1; + } + if (g_application_get_is_remote (app)) { + g_warning ("Applet is already running, exiting"); + return 0; + } + } + + gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), + ICON_DATA_DIR); + + applet = gvc_applet_new (); + gvc_applet_start (applet); + + gtk_main (); + + if (applet != NULL) { + g_object_unref (applet); + } + if (app != NULL) { + g_object_unref (app); + } + + return 0; +} diff --git a/panels/sound/cc-sound-panel.c b/panels/sound/cc-sound-panel.c new file mode 100644 index 000000000..1ec93c870 --- /dev/null +++ b/panels/sound/cc-sound-panel.c @@ -0,0 +1,136 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 + * Lesser 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include "config.h" + +#include <libintl.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include <glib/gi18n-lib.h> +#include <glib.h> +#include <gtk/gtk.h> +#include <pulse/pulseaudio.h> + +#include "cc-sound-panel.h" +#include "gvc-mixer-dialog.h" +#include "gvc-log.h" + +G_DEFINE_DYNAMIC_TYPE (CcSoundPanel, cc_sound_panel, CC_TYPE_PANEL) + +static void cc_sound_panel_finalize (GObject *object); + +static void +cc_sound_panel_class_init (CcSoundPanelClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = cc_sound_panel_finalize; +} + +static void +cc_sound_panel_class_finalize (CcSoundPanelClass *klass) +{ +} + +static void +cc_sound_panel_finalize (GObject *object) +{ + CcSoundPanel *panel = CC_SOUND_PANEL (object); + + if (panel->dialog != NULL) + panel->dialog = NULL; + if (panel->connecting_label != NULL) + panel->connecting_label = NULL; + if (panel->control != NULL) { + g_object_unref (panel->control); + panel->control = NULL; + } + + G_OBJECT_CLASS (cc_sound_panel_parent_class)->finalize (object); +} + +static void +on_control_ready (GvcMixerControl *control, + CcSoundPanel *panel) +{ + if (panel->dialog != NULL) + return; + + if (panel->connecting_label) { + gtk_widget_destroy (panel->connecting_label); + panel->connecting_label = NULL; + } + + panel->dialog = gvc_mixer_dialog_new (control); + gtk_container_add (GTK_CONTAINER (panel), + GTK_WIDGET (panel->dialog)); + gtk_widget_show (GTK_WIDGET (panel->dialog)); +} + +static void +cc_sound_panel_init (CcSoundPanel *self) +{ + gvc_log_init (); + gvc_log_set_debug (TRUE); + + gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), + ICON_DATA_DIR); + gtk_window_set_default_icon_name ("multimedia-volume-control"); + + self->control = gvc_mixer_control_new ("GNOME Volume Control Dialog"); + g_signal_connect (self->control, + "ready", + G_CALLBACK (on_control_ready), + self); + gvc_mixer_control_open (self->control); + + self->connecting_label = gtk_label_new (_("Waiting for sound system to respond")); + gtk_container_add (GTK_CONTAINER (self), self->connecting_label); + gtk_widget_show (self->connecting_label); +} + +void +cc_sound_panel_register (GIOModule *module) +{ + cc_sound_panel_register_type (G_TYPE_MODULE (module)); + g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT, + CC_TYPE_SOUND_PANEL, + "sound", 0); +} + +/* GIO extension stuff */ +void +g_io_module_load (GIOModule *module) +{ + bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + + /* register the panel */ + cc_sound_panel_register (module); +} + +void +g_io_module_unload (GIOModule *module) +{ +} + diff --git a/panels/sound/cc-sound-panel.h b/panels/sound/cc-sound-panel.h new file mode 100644 index 000000000..fda5fb7e7 --- /dev/null +++ b/panels/sound/cc-sound-panel.h @@ -0,0 +1,60 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2010 Red Hat, Inc. + * + * 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 + * Lesser 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef _CC_SOUND_PANEL_H +#define _CC_SOUND_PANEL_H + +#include <libgnome-control-center/cc-panel.h> +#include "gvc-mixer-control.h" +#include "gvc-mixer-dialog.h" + +G_BEGIN_DECLS + +#define CC_TYPE_SOUND_PANEL cc_sound_panel_get_type() +#define CC_SOUND_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CC_TYPE_SOUND_PANEL, CcSoundPanel)) +#define CC_SOUND_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CC_TYPE_SOUND_PANEL, CcSoundPanelClass)) +#define CC_IS_SOUND_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CC_TYPE_SOUND_PANEL)) +#define CC_IS_SOUND_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CC_TYPE_SOUND_PANEL)) +#define CC_SOUND_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CC_TYPE_SOUND_PANEL, CcSoundPanelClass)) + +typedef struct _CcSoundPanel CcSoundPanel; +typedef struct _CcSoundPanelClass CcSoundPanelClass; +typedef struct _CcSoundPanelPrivate CcSoundPanelPrivate; + +struct _CcSoundPanel { + CcPanel parent; + + GvcMixerControl *control; + GvcMixerDialog *dialog; + GtkWidget *connecting_label; +}; + +struct _CcSoundPanelClass { + CcPanelClass parent_class; +}; + +GType cc_sound_panel_get_type (void) G_GNUC_CONST; + +void cc_sound_panel_register (GIOModule *module); + +G_END_DECLS + +#endif /* _CC_SOUND_PANEL_H */ + diff --git a/panels/sound/data/Makefile.am b/panels/sound/data/Makefile.am new file mode 100644 index 000000000..d5522b2c8 --- /dev/null +++ b/panels/sound/data/Makefile.am @@ -0,0 +1,44 @@ +NULL = + +SUBDIRS = \ + icons \ + symbolic-icons \ + sounds \ + $(NULL) + +@INTLTOOL_DESKTOP_RULE@ +autostartdir = $(sysconfdir)/xdg/autostart +autostart_in_files = gnome-sound-applet.desktop.in +autostart_DATA = $(autostart_in_files:.desktop.in=.desktop) + +appsdir = $(datadir)/applications +apps_in_files = gnome-sound-panel.desktop.in +apps_DATA = $(apps_in_files:.desktop.in=.desktop) + +EXTRA_DIST = \ + $(autostart_in_files) \ + gnome-sound-panel.desktop.in.in \ + $(NULL) + +gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor + +install-data-hook: update-icon-cache +uninstall-hook: update-icon-cache +update-icon-cache: + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After (un)install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi + +CLEANFILES = \ + gnome-sound-panel.desktop \ + $(NULL) + +DISTCLEANFILES = \ + gnome-sound-applet.desktop \ + $(NULL) + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/gnome-sound-applet.desktop.in b/panels/sound/data/gnome-sound-applet.desktop.in new file mode 100644 index 000000000..29792563f --- /dev/null +++ b/panels/sound/data/gnome-sound-applet.desktop.in @@ -0,0 +1,16 @@ +[Desktop Entry] +_Name=Volume Control +_Comment=Show desktop volume control +Icon=multimedia-volume-control +Exec=gnome-sound-applet +Terminal=false +Type=Application +Categories= +NoDisplay=true +OnlyShowIn=GNOME;XFCE; +X-GNOME-Bugzilla-Bugzilla=GNOME +X-GNOME-Bugzilla-Product=gnome-control-center +X-GNOME-Bugzilla-Component=sound +# See http://bugzilla.gnome.org/show_bug.cgi?id=568320 +#X-GNOME-Autostart-Phase=Panel +X-GNOME-Autostart-Notify=true diff --git a/panels/sound/data/gnome-sound-panel.desktop.in.in b/panels/sound/data/gnome-sound-panel.desktop.in.in new file mode 100644 index 000000000..af1ab074c --- /dev/null +++ b/panels/sound/data/gnome-sound-panel.desktop.in.in @@ -0,0 +1,15 @@ +[Desktop Entry] +_Name=Sound +_Comment=Change sound volume and sound events +Exec=gnome-control-center sound +Icon=multimedia-volume-control +Terminal=false +Type=Application +StartupNotify=true +Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel; +OnlyShowIn=GNOME; +X-GNOME-Bugzilla-Bugzilla=GNOME +X-GNOME-Bugzilla-Product=gnome-control-center +X-GNOME-Bugzilla-Component=sound +X-GNOME-Bugzilla-Version=@VERSION@ +X-GNOME-Settings-Panel=sound diff --git a/panels/sound/data/icons/16x16/Makefile.am b/panels/sound/data/icons/16x16/Makefile.am new file mode 100644 index 000000000..9ed74c7bf --- /dev/null +++ b/panels/sound/data/icons/16x16/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = status apps + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/16x16/apps/Makefile.am b/panels/sound/data/icons/16x16/apps/Makefile.am new file mode 100644 index 000000000..613c6b21d --- /dev/null +++ b/panels/sound/data/icons/16x16/apps/Makefile.am @@ -0,0 +1,19 @@ +NULL = + +themedir = $(datadir)/icons/hicolor +size = 16x16 +context = apps + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + multimedia-volume-control.png \ + multimedia-volume-control.svg + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/16x16/apps/multimedia-volume-control.png b/panels/sound/data/icons/16x16/apps/multimedia-volume-control.png Binary files differnew file mode 100644 index 000000000..13b4b7f9a --- /dev/null +++ b/panels/sound/data/icons/16x16/apps/multimedia-volume-control.png diff --git a/panels/sound/data/icons/16x16/apps/multimedia-volume-control.svg b/panels/sound/data/icons/16x16/apps/multimedia-volume-control.svg new file mode 100644 index 000000000..f8014bfa7 --- /dev/null +++ b/panels/sound/data/icons/16x16/apps/multimedia-volume-control.svg @@ -0,0 +1,585 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + id="svg2" + inkscape:label="PozadÃ" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\16x16" + sodipodi:docname="gnome-sound-properties.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\16x16\gnome-sound-properties.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + sodipodi:modified="TRUE"> + <defs + id="defs3"> + <linearGradient + inkscape:collect="always" + id="linearGradient3973"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop3975" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop3977" /> + </linearGradient> + <linearGradient + id="linearGradient6304" + inkscape:collect="always"> + <stop + id="stop6306" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1" /> + <stop + id="stop6308" + offset="1" + style="stop-color:#80827d;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6296"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6298" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6300" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6117"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop6119" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop6121" /> + </linearGradient> + <linearGradient + id="linearGradient6105"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop6107" /> + <stop + id="stop6113" + offset="0.45209709" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6109" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6091"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6093" /> + <stop + style="stop-color:#81837e;stop-opacity:0.98648649" + offset="1" + id="stop6095" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6077"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop6079" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop6081" /> + </linearGradient> + <linearGradient + id="linearGradient6041" + inkscape:collect="always"> + <stop + id="stop6043" + offset="0" + style="stop-color:#729fcf;stop-opacity:1" /> + <stop + id="stop6045" + offset="1" + style="stop-color:#235195;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6017"> + <stop + style="stop-color:#729fcf;stop-opacity:1" + offset="0" + id="stop6019" /> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="1" + id="stop6021" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6003"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6005" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop6007" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5995"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop5997" /> + <stop + style="stop-color:#888a85;stop-opacity:0;" + offset="1" + id="stop5999" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5995" + id="linearGradient6001" + x1="28.203571" + y1="25.09193" + x2="21.583036" + y2="35.983383" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6003" + id="linearGradient6009" + x1="15.741923" + y1="33.116215" + x2="36.696983" + y2="22.224764" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6041" + id="radialGradient6033" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6017" + id="radialGradient6037" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="23.597727" + cy="19.792301" + fx="23.597727" + fy="19.792301" + r="19.736389" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6077" + id="radialGradient6049" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="32.09296" + cy="33.488297" + fx="32.09296" + fy="33.488297" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient6097" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient6111" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3364103,0,0,0.3372732,-0.6774362,0.1274337)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient6123" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient6290" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.1930651,0,0,9.3410036e-2,2.1701348,6.6135966)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient6302" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3541113,0,0,0.3635233,-0.7432896,-1.8035221)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient5028" + gradientUnits="userSpaceOnUse" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient5030" + gradientUnits="userSpaceOnUse" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient5032" + gradientUnits="userSpaceOnUse" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientTransform="translate(-60,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6041" + id="radialGradient5034" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient5036" + gradientUnits="userSpaceOnUse" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientTransform="translate(-60,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient5038" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4228001,0,0,0.3113668,-47.60226,19.545318)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3973" + id="radialGradient6066" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="32.217553" + inkscape:cx="12.505516" + inkscape:cy="11.160076" + inkscape:document-units="px" + inkscape:current-layer="g6029" + width="16px" + height="16px" + inkscape:showpageshadow="false" + showgrid="true" + inkscape:window-width="973" + inkscape:window-height="849" + inkscape:window-x="150" + inkscape:window-y="57" + showborder="true" /> + <metadata + id="metadata6"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Sound CC applet</dc:title> + <dc:date>17.02.2007</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:creator> + <dc:rights> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:rights> + <dc:identifier>http://blog.vybiral.info</dc:identifier> + <dc:source>http://blog.vybiral.info</dc:source> + <dc:coverage>sound, reproductor, note</dc:coverage> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="Repros" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <path + transform="matrix(0.208749,0,0,0.1304682,1.8789228,9.6383004)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6051" + style="opacity:1;color:#000000;fill:url(#linearGradient6097);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:6.05948067;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.82422543;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6099" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.1565028,0,0,0.1043745,3.2846495,9.8106402)" /> + <path + style="opacity:0.56768559;fill:url(#linearGradient6111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 4.2234611,13.618367 C 4.2234611,13.618367 5.0415386,14.96746 7.396411,14.96746 L 7.396411,12.943819 L 4.2311244,12.943819 L 4.2234611,13.618367 z" + id="path6103" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:2.95696092;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6011" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.3652519,0,0,0.3131236,-2.3364281,-0.5680786)" /> + <path + transform="matrix(0.3652519,0,0,0.28597,-2.3364279,-0.3887379)" + d="M 46.089207 25.766438 A 19.161766 19.161766 0 1 1 7.7656746,25.766438 A 19.161766 19.161766 0 1 1 46.089207 25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6013" + style="opacity:1;color:#000000;fill:url(#radialGradient6066);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:3.09416509;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.5753541;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.27477477;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6015" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.3131236,0,0,0.2498308,-0.9316158,0.8499497)" /> + <path + style="fill:url(#linearGradient6302);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 5.288702,12.37359 C 7.1369466,13.339783 12.937407,12.9293 14.003827,8.0640329 C 14.003827,8.0640329 11.452841,13.318809 5.288702,12.37359 z" + id="path6039" + sodipodi:nodetypes="csc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.26576574;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 11.5,9.2396488 C 11.5,10.189213 9.9869494,11.092769 8.339297,11.092769 C 6.6916436,11.092769 5.6570637,10.322106 5.6570637,9.3725413 C 5.6570637,8.4229746 6.9942902,7.2700418 8.6419435,7.2700418 C 10.289597,7.2700418 11.5,8.2900852 11.5,9.2396488 z" + id="path6055" + sodipodi:nodetypes="csssc" /> + <path + style="color:#000000;fill:url(#radialGradient6290);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 10.436247,9.150001 C 10.436247,9.8952003 9.1065272,10.500001 7.4681246,10.500001 C 5.8297202,10.500001 4.5000003,9.8952003 4.5000003,9.150001 C 4.5000003,8.4048002 5.8297202,7.5000007 7.4681246,7.5000007 C 9.1065272,7.5000007 10.436247,8.4048002 10.436247,9.150001 z" + id="path6047" + sodipodi:nodetypes="csssc" /> + <g + id="g6029" + transform="matrix(0.4907271,0,0,0.4910531,3.9572021e-2,0.6295285)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#ce5c00;stroke-width:6.1113472;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 29.479615,9.1193715 L 29.479615,1.8976116" + id="path5052" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + id="path6023" + d="M 17.240597,8.1228714 L 17.240597,2.9873851" + style="fill:none;fill-rule:evenodd;stroke:#ce5c00;stroke-width:6.11134768;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:6.11134768;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.232473,1.8009824 L 29.459229,1.7943871" + id="path6025" + sodipodi:nodetypes="cc" /> + <path + transform="matrix(1.0394076,0,0,1.0793564,-17.878825,-8.7313604)" + d="M 35.740638 17.284103 A 3.9210651 1.8830575 0 1 1 27.898507,17.284103 A 3.9210651 1.8830575 0 1 1 35.740638 17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6125" + style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:1.92327011;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:1.92326987;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6127" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638 17.284103 A 3.9210651 1.8830575 0 1 1 27.898507,17.284103 A 3.9210651 1.8830575 0 1 1 35.740638 17.284103 z" + transform="matrix(1.0394077,0,0,1.0793564,-5.6520722,-8.7313603)" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:2.03711605;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 17.232473,10.050765 L 17.232473,1.8275403" + id="path6163" /> + <path + sodipodi:nodetypes="cc" + id="path6165" + d="M 29.467352,9.8622978 L 29.467352,1.5938" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:2.03711605;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:2.03711605;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 17.19717,1.8126936 L 29.499999,1.7643486" + id="path6167" + sodipodi:nodetypes="cc" /> + <path + transform="matrix(0.7630495,0,0,0.5396781,3.2062471,0.5964946)" + d="M 35.740638 17.284103 A 3.9210651 1.8830575 0 1 1 27.898507,17.284103 A 3.9210651 1.8830575 0 1 1 35.740638 17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6190" + style="color:#000000;fill:#ffffff;fill-opacity:0.32941176;fill-rule:evenodd;stroke:none;stroke-width:3.64232254;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="cc" + id="path6192" + d="M 17.22586,1.7943885 L 29.500001,1.7643483" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.03711557;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + id="path6212" + d="M 17.232473,8.2177037 L 17.232473,1.8711502" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.0371151;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.03711534;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 29.467352,7.9859064 L 29.467352,1.7943879" + id="path6214" + sodipodi:nodetypes="cc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:0.32941176;fill-rule:evenodd;stroke:none;stroke-width:3.64232254;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6069" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638 17.284103 A 3.9210651 1.8830575 0 1 1 27.898507,17.284103 A 3.9210651 1.8830575 0 1 1 35.740638 17.284103 z" + transform="matrix(0.7630495,0,0,0.5396781,-9.1499501,0.5964943)" /> + </g> + <path + transform="matrix(2.6334455e-2,0,0,1.557043e-2,6.2594829,7.8971624)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6206" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6208" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(3.9259173e-2,0,0,2.6213758e-2,5.695126,8.8222629)" /> + </g> +</svg> diff --git a/panels/sound/data/icons/16x16/status/Makefile.am b/panels/sound/data/icons/16x16/status/Makefile.am new file mode 100644 index 000000000..9ca7ba0b4 --- /dev/null +++ b/panels/sound/data/icons/16x16/status/Makefile.am @@ -0,0 +1,21 @@ +NULL = + +themedir = $(pkgdatadir)/icons/hicolor +size = 16x16 +context = status + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + audio-input-microphone-high.png \ + audio-input-microphone-low.png \ + audio-input-microphone-medium.png \ + audio-input-microphone-muted.png \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/16x16/status/audio-input-microphone-high.png b/panels/sound/data/icons/16x16/status/audio-input-microphone-high.png Binary files differnew file mode 100644 index 000000000..fc2c114aa --- /dev/null +++ b/panels/sound/data/icons/16x16/status/audio-input-microphone-high.png diff --git a/panels/sound/data/icons/16x16/status/audio-input-microphone-low.png b/panels/sound/data/icons/16x16/status/audio-input-microphone-low.png Binary files differnew file mode 100644 index 000000000..20f72113d --- /dev/null +++ b/panels/sound/data/icons/16x16/status/audio-input-microphone-low.png diff --git a/panels/sound/data/icons/16x16/status/audio-input-microphone-medium.png b/panels/sound/data/icons/16x16/status/audio-input-microphone-medium.png Binary files differnew file mode 100644 index 000000000..7f782bbe9 --- /dev/null +++ b/panels/sound/data/icons/16x16/status/audio-input-microphone-medium.png diff --git a/panels/sound/data/icons/16x16/status/audio-input-microphone-muted.png b/panels/sound/data/icons/16x16/status/audio-input-microphone-muted.png Binary files differnew file mode 100644 index 000000000..964347612 --- /dev/null +++ b/panels/sound/data/icons/16x16/status/audio-input-microphone-muted.png diff --git a/panels/sound/data/icons/22x22/Makefile.am b/panels/sound/data/icons/22x22/Makefile.am new file mode 100644 index 000000000..9ed74c7bf --- /dev/null +++ b/panels/sound/data/icons/22x22/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = status apps + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/22x22/apps/Makefile.am b/panels/sound/data/icons/22x22/apps/Makefile.am new file mode 100644 index 000000000..84943a41f --- /dev/null +++ b/panels/sound/data/icons/22x22/apps/Makefile.am @@ -0,0 +1,19 @@ +NULL = + +themedir = $(datadir)/icons/hicolor +size = 22x22 +context = apps + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + multimedia-volume-control.png \ + multimedia-volume-control.svg + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/22x22/apps/multimedia-volume-control.png b/panels/sound/data/icons/22x22/apps/multimedia-volume-control.png Binary files differnew file mode 100644 index 000000000..8d55f04d2 --- /dev/null +++ b/panels/sound/data/icons/22x22/apps/multimedia-volume-control.png diff --git a/panels/sound/data/icons/22x22/apps/multimedia-volume-control.svg b/panels/sound/data/icons/22x22/apps/multimedia-volume-control.svg new file mode 100644 index 000000000..7636a75ab --- /dev/null +++ b/panels/sound/data/icons/22x22/apps/multimedia-volume-control.svg @@ -0,0 +1,595 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="22" + height="22" + id="svg2" + inkscape:label="PozadÃ" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\22x22" + sodipodi:docname="gnome-sound-properties.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\22x22\gnome-sound-properties.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + sodipodi:modified="true"> + <defs + id="defs3"> + <linearGradient + inkscape:collect="always" + id="linearGradient3744"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop3746" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop3748" /> + </linearGradient> + <linearGradient + id="linearGradient6304" + inkscape:collect="always"> + <stop + id="stop6306" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1" /> + <stop + id="stop6308" + offset="1" + style="stop-color:#80827d;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6296"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6298" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6300" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6117"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop6119" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop6121" /> + </linearGradient> + <linearGradient + id="linearGradient6105"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop6107" /> + <stop + id="stop6113" + offset="0.45209709" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6109" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6091"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6093" /> + <stop + style="stop-color:#81837e;stop-opacity:0.98648649" + offset="1" + id="stop6095" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6077"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop6079" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop6081" /> + </linearGradient> + <linearGradient + id="linearGradient6041" + inkscape:collect="always"> + <stop + id="stop6043" + offset="0" + style="stop-color:#729fcf;stop-opacity:1" /> + <stop + id="stop6045" + offset="1" + style="stop-color:#235195;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6017"> + <stop + style="stop-color:#729fcf;stop-opacity:1" + offset="0" + id="stop6019" /> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="1" + id="stop6021" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6003"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6005" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop6007" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5995"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop5997" /> + <stop + style="stop-color:#888a85;stop-opacity:0;" + offset="1" + id="stop5999" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5995" + id="linearGradient6001" + x1="28.203571" + y1="25.09193" + x2="21.583036" + y2="35.983383" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6003" + id="linearGradient6009" + x1="15.741923" + y1="33.116215" + x2="36.696983" + y2="22.224764" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6041" + id="radialGradient6033" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6017" + id="radialGradient6037" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="23.597727" + cy="19.792301" + fx="23.597727" + fy="19.792301" + r="19.736389" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6077" + id="radialGradient6049" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="32.09296" + cy="33.488297" + fx="32.09296" + fy="33.488297" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient6097" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient6111" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4566304,0,0,0.4578007,-9.82064e-2,-0.1950787)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient6123" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient6290" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.2235424,0,0,0.1245467,4.9289984,8.3181279)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient6302" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.480657,0,0,0.4934313,-0.1875933,-2.8160779)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient5028" + gradientUnits="userSpaceOnUse" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient5030" + gradientUnits="userSpaceOnUse" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient5032" + gradientUnits="userSpaceOnUse" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientTransform="translate(-60,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6041" + id="radialGradient5034" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient5036" + gradientUnits="userSpaceOnUse" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientTransform="translate(-60,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient5038" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4228001,0,0,0.3113668,-47.60226,19.545318)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3744" + id="radialGradient6066" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="34.171876" + inkscape:cx="10.729483" + inkscape:cy="17.062453" + inkscape:document-units="px" + inkscape:current-layer="g6029" + width="22px" + height="22px" + inkscape:showpageshadow="false" + showgrid="true" + inkscape:window-width="757" + inkscape:window-height="575" + inkscape:window-x="221" + inkscape:window-y="374" + showborder="false" /> + <metadata + id="metadata6"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Sound CC applet</dc:title> + <dc:date>17.02.2007</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:creator> + <dc:rights> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:rights> + <dc:identifier>http://blog.vybiral.info</dc:identifier> + <dc:source>http://blog.vybiral.info</dc:source> + <dc:coverage>sound, reproductor, note</dc:coverage> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="Repros" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <path + transform="matrix(0.5218726,0,0,0.3914044,-3.0526925,4.4149024)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6115" + style="opacity:0.78165935;color:#000000;fill:url(#radialGradient6123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.04187703;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.2870299,0,0,0.1637207,3.2710188,13.144325)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6051" + style="opacity:1;color:#000000;fill:url(#linearGradient6097);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:4.61301279;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:5.82070923;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6099" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.2348426,0,0,0.1256814,4.6762892,13.853362)" /> + <path + style="opacity:0.56768559;fill:url(#linearGradient6111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 6.5540829,18.116953 C 6.5540829,18.116953 7.66451,19.948156 10.860923,19.948156 L 10.860923,17.20135 L 6.5644849,17.20135 L 6.5540829,18.116953 z" + id="path6103" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:2.16422367;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6011" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207 25.766438 A 19.161766 19.161766 0 1 1 7.7656746,25.766438 A 19.161766 19.161766 0 1 1 46.089207 25.766438 z" + transform="matrix(0.4957789,0,0,0.430633,-2.3500582,-1.34419)" /> + <path + transform="matrix(0.4957789,0,0,0.4174981,-2.3500579,-1.2574379)" + d="M 46.089207 25.766438 A 19.161766 19.161766 0 1 1 7.7656746,25.766438 A 19.161766 19.161766 0 1 1 46.089207 25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6013" + style="opacity:1;color:#000000;fill:url(#radialGradient6066);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:2.19800472;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.48414516;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35675675;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6015" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.4435917,0,0,0.3653108,-0.9447891,8.72424e-2)" /> + <path + style="fill:url(#linearGradient6302);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 8,16.427344 C 10.508736,17.738814 18.382058,17.181643 19.829575,10.577731 C 19.829575,10.577731 16.366965,17.710345 8,16.427344 z" + id="path6039" + sodipodi:nodetypes="csc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.26576574;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 14.500001,12.076181 C 14.500001,13.318181 12.946278,14.5 11.254335,14.5 C 9.5623909,14.5 8.5000002,13.491999 8.5000002,12.25 C 8.5000002,11.007998 9.873173,9.4999998 11.565117,9.4999998 C 13.257061,9.4999998 14.500001,10.834183 14.500001,12.076181 z" + id="path6055" + sodipodi:nodetypes="csssc" /> + <path + style="color:#000000;fill:url(#radialGradient6290);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 14.5,11.7 C 14.5,12.693599 12.96037,13.5 11.063329,13.5 C 9.1662861,13.5 7.6266566,12.693599 7.6266566,11.7 C 7.6266566,10.706399 9.1662861,9.5 11.063329,9.5 C 12.96037,9.5 14.5,10.706399 14.5,11.7 z" + id="path6047" + sodipodi:nodetypes="csssc" /> + <g + id="g6029" + transform="matrix(0.6660941,0,0,0.6678303,0.8804439,0.4696392)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#ce5c00;stroke-width:4.4980092;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 29.5,8.6499115 L 29.5,1.4935517" + id="path5052" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + id="path6023" + d="M 18.945615,7.5049013 L 18.945615,1.567109" + style="fill:none;fill-rule:evenodd;stroke:#ce5c00;stroke-width:4.49801016;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:4.4980092;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 18.945606,1.5722642 L 29.500001,1.4999998" + id="path6025" + sodipodi:nodetypes="cc" /> + <path + transform="matrix(0.9571947,0,0,1.186958,-13.763854,-10.748001)" + d="M 35.740638 17.284103 A 3.9210651 1.8830575 0 1 1 27.898507,17.284103 A 3.9210651 1.8830575 0 1 1 35.740638 17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6125" + style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:1.40663421;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:1.40319479;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6127" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + transform="matrix(0.957195,0,0,1.1927835,-3.2548378,-10.837719)" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1.49933648;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 18.945606,9.0297806 L 18.945606,0.93297361" + id="path6163" /> + <path + sodipodi:nodetypes="cc" + id="path6165" + d="M 29.5,9.596807 L 29.5,1.5" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1.49933648;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1.4993366;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 19.5,1.5797955 L 29.499999,1.5" + id="path6167" + sodipodi:nodetypes="cc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.13763928;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6188" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638 17.284103 A 3.9210651 1.8830575 0 1 1 27.898507,17.284103 A 3.9210651 1.8830575 0 1 1 35.740638 17.284103 z" + transform="matrix(0.574317,0,0,0.3975944,-1.5808514,2.9064109)" /> + <path + transform="matrix(0.574317,0,0,0.3975946,8.9281769,2.9064074)" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6190" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.13763881;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="cc" + id="path6192" + d="M 18.945606,1.5722642 L 29.500001,1.4999998" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.49933612;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + id="path6212" + d="M 18.945605,9.0297805 L 18.945605,0.97658404" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.49933589;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.499336;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 29.454632,9.0773723 L 29.454632,1.4952556" + id="path6214" + sodipodi:nodetypes="cc" /> + </g> + <path + transform="matrix(3.5745376e-2,0,0,2.1134654e-2,9.7316574,9.798915)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6206" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6208" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(5.3288892e-2,0,0,3.5581465e-2,8.2339412,10.513453)" /> + </g> +</svg> diff --git a/panels/sound/data/icons/22x22/status/Makefile.am b/panels/sound/data/icons/22x22/status/Makefile.am new file mode 100644 index 000000000..d855c3814 --- /dev/null +++ b/panels/sound/data/icons/22x22/status/Makefile.am @@ -0,0 +1,21 @@ +NULL = + +themedir = $(pkgdatadir)/icons/hicolor +size = 22x22 +context = status + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + audio-input-microphone-high.png \ + audio-input-microphone-low.png \ + audio-input-microphone-medium.png \ + audio-input-microphone-muted.png \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/22x22/status/audio-input-microphone-high.png b/panels/sound/data/icons/22x22/status/audio-input-microphone-high.png Binary files differnew file mode 100644 index 000000000..d04854be8 --- /dev/null +++ b/panels/sound/data/icons/22x22/status/audio-input-microphone-high.png diff --git a/panels/sound/data/icons/22x22/status/audio-input-microphone-low.png b/panels/sound/data/icons/22x22/status/audio-input-microphone-low.png Binary files differnew file mode 100644 index 000000000..f0a7f2d58 --- /dev/null +++ b/panels/sound/data/icons/22x22/status/audio-input-microphone-low.png diff --git a/panels/sound/data/icons/22x22/status/audio-input-microphone-medium.png b/panels/sound/data/icons/22x22/status/audio-input-microphone-medium.png Binary files differnew file mode 100644 index 000000000..4148dc29a --- /dev/null +++ b/panels/sound/data/icons/22x22/status/audio-input-microphone-medium.png diff --git a/panels/sound/data/icons/22x22/status/audio-input-microphone-muted.png b/panels/sound/data/icons/22x22/status/audio-input-microphone-muted.png Binary files differnew file mode 100644 index 000000000..6d14cc091 --- /dev/null +++ b/panels/sound/data/icons/22x22/status/audio-input-microphone-muted.png diff --git a/panels/sound/data/icons/24x24/Makefile.am b/panels/sound/data/icons/24x24/Makefile.am new file mode 100644 index 000000000..9ed74c7bf --- /dev/null +++ b/panels/sound/data/icons/24x24/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = status apps + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/24x24/apps/Makefile.am b/panels/sound/data/icons/24x24/apps/Makefile.am new file mode 100644 index 000000000..d59fb5ad3 --- /dev/null +++ b/panels/sound/data/icons/24x24/apps/Makefile.am @@ -0,0 +1,18 @@ +NULL = + +themedir = $(datadir)/icons/hicolor +size = 24x24 +context = apps + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + multimedia-volume-control.png \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/24x24/apps/multimedia-volume-control.png b/panels/sound/data/icons/24x24/apps/multimedia-volume-control.png Binary files differnew file mode 100644 index 000000000..3b873fa4c --- /dev/null +++ b/panels/sound/data/icons/24x24/apps/multimedia-volume-control.png diff --git a/panels/sound/data/icons/24x24/status/Makefile.am b/panels/sound/data/icons/24x24/status/Makefile.am new file mode 100644 index 000000000..6b9b71cfb --- /dev/null +++ b/panels/sound/data/icons/24x24/status/Makefile.am @@ -0,0 +1,21 @@ +NULL = + +themedir = $(pkgdatadir)/icons/hicolor +size = 24x24 +context = status + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + audio-input-microphone-high.png \ + audio-input-microphone-low.png \ + audio-input-microphone-medium.png \ + audio-input-microphone-muted.png \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/24x24/status/audio-input-microphone-high.png b/panels/sound/data/icons/24x24/status/audio-input-microphone-high.png Binary files differnew file mode 100644 index 000000000..0da5af3f0 --- /dev/null +++ b/panels/sound/data/icons/24x24/status/audio-input-microphone-high.png diff --git a/panels/sound/data/icons/24x24/status/audio-input-microphone-low.png b/panels/sound/data/icons/24x24/status/audio-input-microphone-low.png Binary files differnew file mode 100644 index 000000000..73e5c1119 --- /dev/null +++ b/panels/sound/data/icons/24x24/status/audio-input-microphone-low.png diff --git a/panels/sound/data/icons/24x24/status/audio-input-microphone-medium.png b/panels/sound/data/icons/24x24/status/audio-input-microphone-medium.png Binary files differnew file mode 100644 index 000000000..4d64ee1d5 --- /dev/null +++ b/panels/sound/data/icons/24x24/status/audio-input-microphone-medium.png diff --git a/panels/sound/data/icons/24x24/status/audio-input-microphone-muted.png b/panels/sound/data/icons/24x24/status/audio-input-microphone-muted.png Binary files differnew file mode 100644 index 000000000..85893d1e4 --- /dev/null +++ b/panels/sound/data/icons/24x24/status/audio-input-microphone-muted.png diff --git a/panels/sound/data/icons/32x32/Makefile.am b/panels/sound/data/icons/32x32/Makefile.am new file mode 100644 index 000000000..9ed74c7bf --- /dev/null +++ b/panels/sound/data/icons/32x32/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = status apps + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/32x32/apps/Makefile.am b/panels/sound/data/icons/32x32/apps/Makefile.am new file mode 100644 index 000000000..e209d40a7 --- /dev/null +++ b/panels/sound/data/icons/32x32/apps/Makefile.am @@ -0,0 +1,19 @@ +NULL = + +themedir = $(datadir)/icons/hicolor +size = 32x32 +context = apps + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + multimedia-volume-control.png \ + multimedia-volume-control.svg + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/32x32/apps/multimedia-volume-control.png b/panels/sound/data/icons/32x32/apps/multimedia-volume-control.png Binary files differnew file mode 100644 index 000000000..3a6c791fa --- /dev/null +++ b/panels/sound/data/icons/32x32/apps/multimedia-volume-control.png diff --git a/panels/sound/data/icons/32x32/apps/multimedia-volume-control.svg b/panels/sound/data/icons/32x32/apps/multimedia-volume-control.svg new file mode 100644 index 000000000..d1e308d38 --- /dev/null +++ b/panels/sound/data/icons/32x32/apps/multimedia-volume-control.svg @@ -0,0 +1,633 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="32" + height="32" + id="svg2" + inkscape:label="PozadÃ" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\32x32" + sodipodi:docname="gnome-sound-properties.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\32x32\gnome-sound-properties.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + sodipodi:modified="TRUE"> + <defs + id="defs3"> + <linearGradient + inkscape:collect="always" + id="linearGradient3478"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop3480" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop3482" /> + </linearGradient> + <linearGradient + id="linearGradient6304" + inkscape:collect="always"> + <stop + id="stop6306" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1" /> + <stop + id="stop6308" + offset="1" + style="stop-color:#80827d;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6296"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6298" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6300" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6117"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop6119" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop6121" /> + </linearGradient> + <linearGradient + id="linearGradient6105"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop6107" /> + <stop + id="stop6113" + offset="0.45209709" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6109" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6091"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6093" /> + <stop + style="stop-color:#81837e;stop-opacity:0.98648649" + offset="1" + id="stop6095" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6077"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop6079" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop6081" /> + </linearGradient> + <linearGradient + id="linearGradient6041" + inkscape:collect="always"> + <stop + id="stop6043" + offset="0" + style="stop-color:#729fcf;stop-opacity:1" /> + <stop + id="stop6045" + offset="1" + style="stop-color:#235195;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6017"> + <stop + style="stop-color:#729fcf;stop-opacity:1" + offset="0" + id="stop6019" /> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="1" + id="stop6021" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6003"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6005" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop6007" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5995"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop5997" /> + <stop + style="stop-color:#888a85;stop-opacity:0;" + offset="1" + id="stop5999" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5995" + id="linearGradient6001" + x1="28.203571" + y1="25.09193" + x2="21.583036" + y2="35.983383" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6003" + id="linearGradient6009" + x1="15.741923" + y1="33.116215" + x2="36.696983" + y2="22.224764" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3478" + id="radialGradient6033" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6017" + id="radialGradient6037" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="23.597727" + cy="19.792301" + fx="23.597727" + fy="19.792301" + r="19.736389" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6077" + id="radialGradient6049" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="32.09296" + cy="33.488297" + fx="32.09296" + fy="33.488297" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient6097" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient6111" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.6707857,0,0,0.6714555,0.1522499,-0.5175596)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient6123" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient6290" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.2927078,0,0,0.1868201,7.9676686,12.727192)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient6302" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.6707857,0,0,0.6714555,0.2643719,-0.8007536)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient5028" + gradientUnits="userSpaceOnUse" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient5030" + gradientUnits="userSpaceOnUse" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient5032" + gradientUnits="userSpaceOnUse" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientTransform="translate(-60,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6041" + id="radialGradient5034" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient5036" + gradientUnits="userSpaceOnUse" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientTransform="translate(-60,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient5038" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4228001,0,0,0.3113668,-47.60226,19.545318)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="11.390625" + inkscape:cx="4.3711817" + inkscape:cy="8.9010469" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + inkscape:showpageshadow="false" + showgrid="true" + inkscape:window-width="973" + inkscape:window-height="575" + inkscape:window-x="137" + inkscape:window-y="364" + showborder="true" /> + <metadata + id="metadata6"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Sound CC applet</dc:title> + <dc:date>17.02.2007</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:creator> + <dc:rights> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:rights> + <dc:identifier>http://blog.vybiral.info</dc:identifier> + <dc:source>http://blog.vybiral.info</dc:source> + <dc:coverage>sound, reproductor, note</dc:coverage> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="Repros" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <path + transform="matrix(0.7306216,0,0,0.550649,-3.6737696,7.2603278)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6115" + style="opacity:0.78165935;color:#000000;fill:url(#radialGradient6123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.04187703;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.3675679,0,0,0.2313647,6.3534448,19.105201)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6051" + style="opacity:1;color:#000000;fill:url(#linearGradient6097);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:3.4291203;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.00196743;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6099" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.3325614,0,0,0.1877503,7.2960798,20.064714)" /> + <path + style="opacity:0.56768559;fill:url(#linearGradient6111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 9.9244001,26.34066 C 9.9244001,26.34066 11.555607,29.026482 16.251108,29.026482 L 16.251108,24.997749 L 9.9396806,24.997749 L 9.9244001,26.34066 z" + id="path6103" /> + <path + transform="matrix(0.704528,0,0,0.6001535,-2.9711354,0.536183)" + d="M 46.089207 25.766438 A 19.161766 19.161766 0 1 1 7.7656746,25.766438 A 19.161766 19.161766 0 1 1 46.089207 25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6216" + style="opacity:1;color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.53786957;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.53786969;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6011" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.704528,0,0,0.6001535,-2.9711354,-0.4638168)" /> + <path + transform="matrix(0.6001535,0,0,0.5218726,-0.1605969,2.0532033)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6013" + style="opacity:1;color:#000000;fill:url(#radialGradient6033);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.78684342;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.37387384;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6089" + sodipodi:cx="19.378376" + sodipodi:cy="17.854717" + sodipodi:rx="0.44991162" + sodipodi:ry="0.72862023" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + transform="matrix(1.4909278,0,0,0.9215439,-11.969865,6.5294779)" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.67257559;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.27477477;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6015" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.6523407,0,0,0.5479662,-1.5658662,0.8808633)" /> + <path + style="fill:url(#linearGradient6302);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 11.690651,25.385463 C 14.622182,26.899688 25.803902,26.716115 28.437373,18 C 28.437373,18 24.656592,27.536969 11.690651,25.385463 z" + id="path6039" + sodipodi:nodetypes="csc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.26576574;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 21.499999,18.106655 C 21.499999,19.845455 19.185416,21.5 16.664922,21.5 C 14.144429,21.5 12.561783,20.088799 12.561783,18.35 C 12.561783,16.611199 14.607402,14.5 17.127895,14.5 C 19.648389,14.5 21.499999,16.367856 21.499999,18.106655 z" + id="path6055" + sodipodi:nodetypes="csssc" /> + <path + style="color:#000000;fill:url(#radialGradient6290);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 20.500001,17.800001 C 20.500001,19.290401 18.484,20.500001 16.000001,20.500001 C 13.516001,20.500001 11.5,19.290401 11.5,17.800001 C 11.5,16.3096 13.516001,14.500001 16.000001,14.500001 C 18.484,14.500001 20.500001,16.3096 20.500001,17.800001 z" + id="path6047" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(1.4909278,0,0,0.9215439,-13.982223,6.5294779)" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + sodipodi:ry="0.72862023" + sodipodi:rx="0.44991162" + sodipodi:cy="17.854717" + sodipodi:cx="19.378376" + id="path6087" + style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.37387384;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6083" + sodipodi:cx="19.378376" + sodipodi:cy="17.854717" + sodipodi:rx="0.44991162" + sodipodi:ry="0.72862023" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + transform="matrix(1.1113294,0,0,0.9215439,-6.0357588,6.8746387)" /> + <path + transform="matrix(1.1113294,0,0,0.9215439,-4.0357588,6.8746387)" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + sodipodi:ry="0.72862023" + sodipodi:rx="0.44991162" + sodipodi:cy="17.854717" + sodipodi:cx="19.378376" + id="path6085" + style="opacity:1;color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <g + id="g6029"> + <path + style="fill:none;fill-rule:evenodd;stroke:#ce5c00;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 29.5,9.596807 L 29.5,1.5" + id="path5052" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + id="path6023" + d="M 19.5,10.596807 L 19.5,2.5" + style="fill:none;fill-rule:evenodd;stroke:#ce5c00;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:1" + d="M 19.5,2.5000002 L 29.5,1.4999998" + id="path6025" + sodipodi:nodetypes="cc" /> + <path + transform="matrix(0.7698254,0,0,1.0621027,-7.0140504,-6.8574932)" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6125" + style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:1.10591173;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:1.10932291;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6127" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + transform="matrix(0.7650983,0,0,1.0621027,3.1548997,-7.8574931)" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 19.5,10.548403 L 19.5,2.4515964" + id="path6163" /> + <path + sodipodi:nodetypes="cc" + id="path6165" + d="M 29.5,9.596807 L 29.5,1.5" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 19.5,2.5 L 29.499999,1.5" + id="path6167" + sodipodi:nodetypes="cc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.91454017;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6188" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + transform="matrix(0.5100655,0,0,0.5348658,1.269933,2.2481411)" /> + <path + transform="matrix(0.5100655,0,0,0.5348658,11.269932,1.2481419)" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6190" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.91454005;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="cc" + id="path6192" + d="M 19.5,2.5000002 L 29.5,1.4999998" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999964;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + id="path6212" + d="M 19.5,10.550799 L 19.5,2.4976027" + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 29.5,9.596807 L 29.5,1.4999998" + id="path6214" + sodipodi:nodetypes="cc" /> + </g> + <path + transform="matrix(5.2509619e-2,0,0,3.0998156e-2,14.592227,15.607309)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6206" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6208" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(7.8280879e-2,0,0,5.2187263e-2,12.392096,16.65532)" /> + </g> +</svg> diff --git a/panels/sound/data/icons/32x32/status/Makefile.am b/panels/sound/data/icons/32x32/status/Makefile.am new file mode 100644 index 000000000..24d4e984f --- /dev/null +++ b/panels/sound/data/icons/32x32/status/Makefile.am @@ -0,0 +1,21 @@ +NULL = + +themedir = $(pkgdatadir)/icons/hicolor +size = 32x32 +context = status + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + audio-input-microphone-high.png \ + audio-input-microphone-low.png \ + audio-input-microphone-medium.png \ + audio-input-microphone-muted.png \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/32x32/status/audio-input-microphone-high.png b/panels/sound/data/icons/32x32/status/audio-input-microphone-high.png Binary files differnew file mode 100644 index 000000000..dc7288155 --- /dev/null +++ b/panels/sound/data/icons/32x32/status/audio-input-microphone-high.png diff --git a/panels/sound/data/icons/32x32/status/audio-input-microphone-low.png b/panels/sound/data/icons/32x32/status/audio-input-microphone-low.png Binary files differnew file mode 100644 index 000000000..467fff6c0 --- /dev/null +++ b/panels/sound/data/icons/32x32/status/audio-input-microphone-low.png diff --git a/panels/sound/data/icons/32x32/status/audio-input-microphone-medium.png b/panels/sound/data/icons/32x32/status/audio-input-microphone-medium.png Binary files differnew file mode 100644 index 000000000..8291c5c35 --- /dev/null +++ b/panels/sound/data/icons/32x32/status/audio-input-microphone-medium.png diff --git a/panels/sound/data/icons/32x32/status/audio-input-microphone-muted.png b/panels/sound/data/icons/32x32/status/audio-input-microphone-muted.png Binary files differnew file mode 100644 index 000000000..fda01ac13 --- /dev/null +++ b/panels/sound/data/icons/32x32/status/audio-input-microphone-muted.png diff --git a/panels/sound/data/icons/48x48/Makefile.am b/panels/sound/data/icons/48x48/Makefile.am new file mode 100644 index 000000000..237e20997 --- /dev/null +++ b/panels/sound/data/icons/48x48/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = apps + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/48x48/apps/Makefile.am b/panels/sound/data/icons/48x48/apps/Makefile.am new file mode 100644 index 000000000..8c80e3c7e --- /dev/null +++ b/panels/sound/data/icons/48x48/apps/Makefile.am @@ -0,0 +1,18 @@ +NULL = + +themedir = $(datadir)/icons/hicolor +size = 48x48 +context = apps + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + multimedia-volume-control.png \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/48x48/apps/multimedia-volume-control.png b/panels/sound/data/icons/48x48/apps/multimedia-volume-control.png Binary files differnew file mode 100644 index 000000000..61dd43b8c --- /dev/null +++ b/panels/sound/data/icons/48x48/apps/multimedia-volume-control.png diff --git a/panels/sound/data/icons/48x48/status/audio-input-microphone-high.png b/panels/sound/data/icons/48x48/status/audio-input-microphone-high.png Binary files differnew file mode 100644 index 000000000..e26b9d901 --- /dev/null +++ b/panels/sound/data/icons/48x48/status/audio-input-microphone-high.png diff --git a/panels/sound/data/icons/48x48/status/audio-input-microphone-low.png b/panels/sound/data/icons/48x48/status/audio-input-microphone-low.png Binary files differnew file mode 100644 index 000000000..4de2d5b5e --- /dev/null +++ b/panels/sound/data/icons/48x48/status/audio-input-microphone-low.png diff --git a/panels/sound/data/icons/48x48/status/audio-input-microphone-medium.png b/panels/sound/data/icons/48x48/status/audio-input-microphone-medium.png Binary files differnew file mode 100644 index 000000000..7cae08a31 --- /dev/null +++ b/panels/sound/data/icons/48x48/status/audio-input-microphone-medium.png diff --git a/panels/sound/data/icons/48x48/status/audio-input-microphone-muted.png b/panels/sound/data/icons/48x48/status/audio-input-microphone-muted.png Binary files differnew file mode 100644 index 000000000..ba3ddf99a --- /dev/null +++ b/panels/sound/data/icons/48x48/status/audio-input-microphone-muted.png diff --git a/panels/sound/data/icons/Makefile.am b/panels/sound/data/icons/Makefile.am new file mode 100644 index 000000000..35e2de2d6 --- /dev/null +++ b/panels/sound/data/icons/Makefile.am @@ -0,0 +1,12 @@ +NULL = + +SUBDIRS = \ + scalable \ + 16x16 \ + 22x22 \ + 24x24 \ + 32x32 \ + 48x48 \ + $(NULL) + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/render-icon-theme.py b/panels/sound/data/icons/render-icon-theme.py new file mode 100755 index 000000000..9e6a476c3 --- /dev/null +++ b/panels/sound/data/icons/render-icon-theme.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python + +import os +import sys +import xml.sax +import subprocess + +INKSCAPE = '/usr/bin/inkscape' +OPTIPNG = '/usr/bin/optipng' +SRC = os.path.join('.', 'src') + +inkscape_process = None + +def optimize_png(png_file): + if os.path.exists(OPTIPNG): + process = subprocess.Popen([OPTIPNG, '-quiet', '-o7', png_file]) + process.wait() + +def wait_for_prompt(process, command=None): + if command is not None: + process.stdin.write(command+'\n') + + # This is kinda ugly ... + # Wait for just a '>', or '\n>' if some other char appearead first + output = process.stdout.read(1) + if output == '>': + return + + output += process.stdout.read(1) + while output != "\n>": + output += process.stdout.read(1) + output = output[1:] + +def start_inkscape(): + process = subprocess.Popen([INKSCAPE, '--shell'], bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + wait_for_prompt(process) + return process + +def inkscape_render_rect(icon_file, rect, output_file): + global inkscape_process + if inkscape_process is None: + inkscape_process = start_inkscape() + wait_for_prompt(inkscape_process, '%s -i %s -e %s' % (icon_file, rect, output_file)) + optimize_png(output_file) + +class ContentHandler(xml.sax.ContentHandler): + ROOT = 0 + SVG = 1 + LAYER = 2 + OTHER = 3 + TEXT = 4 + def __init__(self, path, force=False, filter=None): + self.stack = [self.ROOT] + self.inside = [self.ROOT] + self.path = path + self.rects = [] + self.state = self.ROOT + self.chars = "" + self.force = force + self.filter = filter + + def endDocument(self): + pass + + def startElement(self, name, attrs): + if self.inside[-1] == self.ROOT: + if name == "svg": + self.stack.append(self.SVG) + self.inside.append(self.SVG) + return + elif self.inside[-1] == self.SVG: + if (name == "g" and attrs.has_key('inkscape:groupmode') and attrs.has_key('inkscape:label') + and attrs['inkscape:groupmode'] == 'layer' and attrs['inkscape:label'].startswith('baseplate')): + self.stack.append(self.LAYER) + self.inside.append(self.LAYER) + self.context = None + self.icon_name = None + self.rects = [] + return + elif self.inside[-1] == self.LAYER: + if name == "text" and attrs.has_key('inkscape:label') and attrs['inkscape:label'] == 'context': + self.stack.append(self.TEXT) + self.inside.append(self.TEXT) + self.text='context' + self.chars = "" + return + elif name == "text" and attrs.has_key('inkscape:label') and attrs['inkscape:label'] == 'icon-name': + self.stack.append(self.TEXT) + self.inside.append(self.TEXT) + self.text='icon-name' + self.chars = "" + return + elif name == "rect": + self.rects.append(attrs) + + self.stack.append(self.OTHER) + + + def endElement(self, name): + stacked = self.stack.pop() + if self.inside[-1] == stacked: + self.inside.pop() + + if stacked == self.TEXT and self.text is not None: + assert self.text in ['context', 'icon-name'] + if self.text == 'context': + self.context = self.chars + elif self.text == 'icon-name': + self.icon_name = self.chars + self.text = None + elif stacked == self.LAYER: + assert self.icon_name + assert self.context + + if self.filter is not None and not self.icon_name in self.filter: + return + + print '%s %s' % (self.context, self.icon_name) + for rect in self.rects: + width = rect['width'] + height = rect['height'] + id = rect['id'] + + dir = os.path.join("%sx%s" % (width, height), self.context) + outfile = os.path.join(dir, self.icon_name+'.png') + if not os.path.exists(dir): + os.makedirs(dir) + # Do a time based check! + if self.force or not os.path.exists(outfile): + inkscape_render_rect(self.path, id, outfile) + sys.stdout.write('.') + else: + stat_in = os.stat(self.path) + stat_out = os.stat(outfile) + if stat_in.st_mtime > stat_out.st_mtime: + inkscape_render_rect(self.path, id, outfile) + sys.stdout.write('.') + else: + sys.stdout.write('-') + sys.stdout.flush() + sys.stdout.write('\n') + sys.stdout.flush() + + def characters(self, chars): + self.chars += chars.strip() + +if len(sys.argv) == 1: + if not os.path.exists('gnome'): + os.mkdir('gnome') + print 'Rendering from SVGs in %s' % SRC + for file in os.listdir(SRC): + if file[-4:] == '.svg': + file = os.path.join(SRC, file) + handler = ContentHandler(file) + xml.sax.parse(open(file), handler) +else: + file = os.path.join(SRC, sys.argv[1] + '.svg') + if len(sys.argv) > 2: + icons = sys.argv[2:] + else: + icons = None + if os.path.exists(os.path.join(file)): + handler = ContentHandler(file, True, filter=icons) + xml.sax.parse(open(file), handler) + else: + print "Error: No such file %s" % file + sys.exit(1) + + diff --git a/panels/sound/data/icons/scalable/Makefile.am b/panels/sound/data/icons/scalable/Makefile.am new file mode 100644 index 000000000..eb00566d4 --- /dev/null +++ b/panels/sound/data/icons/scalable/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = apps devices + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/scalable/apps/Makefile.am b/panels/sound/data/icons/scalable/apps/Makefile.am new file mode 100644 index 000000000..3c97ab1ba --- /dev/null +++ b/panels/sound/data/icons/scalable/apps/Makefile.am @@ -0,0 +1,18 @@ +NULL = + +themedir = $(datadir)/icons/hicolor +size = scalable +context = apps + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + multimedia-volume-control.svg \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/scalable/apps/multimedia-volume-control.svg b/panels/sound/data/icons/scalable/apps/multimedia-volume-control.svg new file mode 100644 index 000000000..b22a9543d --- /dev/null +++ b/panels/sound/data/icons/scalable/apps/multimedia-volume-control.svg @@ -0,0 +1,554 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2" + inkscape:label="PozadÃ" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="C:\Documents and Settings\nevim\Plocha\gnome-sound-properties\scalable" + sodipodi:docname="gnome-sound-properties.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="C:\Documents and Settings\nevim\Plocha\git-sound.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + sodipodi:modified="true"> + <defs + id="defs3"> + <linearGradient + id="linearGradient6304" + inkscape:collect="always"> + <stop + id="stop6306" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1" /> + <stop + id="stop6308" + offset="1" + style="stop-color:#80827d;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6296"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6298" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6300" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6117"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop6119" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop6121" /> + </linearGradient> + <linearGradient + id="linearGradient6105"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop6107" /> + <stop + id="stop6113" + offset="0.45209709" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6109" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6091"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6093" /> + <stop + style="stop-color:#81837e;stop-opacity:0.98648649" + offset="1" + id="stop6095" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6077"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop6079" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop6081" /> + </linearGradient> + <linearGradient + id="linearGradient6041" + inkscape:collect="always"> + <stop + id="stop6043" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + id="stop6045" + offset="1" + style="stop-color:#2e3436;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6017"> + <stop + style="stop-color:#729fcf;stop-opacity:1" + offset="0" + id="stop6019" /> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="1" + id="stop6021" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6003"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop6005" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop6007" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5995"> + <stop + style="stop-color:#eeeeec;stop-opacity:1" + offset="0" + id="stop5997" /> + <stop + style="stop-color:#888a85;stop-opacity:0;" + offset="1" + id="stop5999" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5995" + id="linearGradient6001" + x1="28.203571" + y1="25.09193" + x2="21.583036" + y2="35.983383" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6003" + id="linearGradient6009" + x1="15.741923" + y1="33.116215" + x2="36.696983" + y2="22.224764" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6041" + id="radialGradient6033" + cx="29.922518" + cy="32.704834" + fx="29.922518" + fy="32.704834" + r="19.736389" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0244195,0,0,1.014266,-0.5092741,0.685707)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6017" + id="radialGradient6037" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="23.597727" + cy="19.792301" + fx="23.597727" + fy="19.792301" + r="19.736389" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6077" + id="radialGradient6049" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2463993,0,0,1.3258525,-7.2755971,-10.235034)" + cx="32.09296" + cy="33.488297" + fx="32.09296" + fy="33.488297" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6091" + id="linearGradient6097" + x1="10.602306" + y1="35.894798" + x2="47.001671" + y2="35.690231" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6105" + id="linearGradient6111" + x1="15.551565" + y1="41" + x2="23.73423" + y2="41" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6117" + id="radialGradient6123" + cx="26.927441" + cy="25.766438" + fx="26.927441" + fy="25.766438" + r="19.161766" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6304" + id="radialGradient6290" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4228001,0,0,0.3113668,12.39774,19.545318)" + cx="17.831682" + cy="18.914896" + fx="17.831682" + fy="18.914896" + r="19.736389" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6296" + id="linearGradient6302" + x1="34.825703" + y1="42.345951" + x2="28.763092" + y2="32.737347" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.0625" + inkscape:cx="66.935794" + inkscape:cy="36.523345" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="48px" + height="48px" + inkscape:showpageshadow="false" + showgrid="true" + inkscape:window-width="973" + inkscape:window-height="849" + inkscape:window-x="0" + inkscape:window-y="26" + showborder="false" /> + <metadata + id="metadata6"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Sound CC applet</dc:title> + <dc:date>17.02.2007</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:creator> + <dc:rights> + <cc:Agent> + <dc:title>Josef vybÃral</dc:title> + </cc:Agent> + </dc:rights> + <dc:identifier>http://blog.vybiral.info</dc:identifier> + <dc:source>http://blog.vybiral.info</dc:source> + <dc:coverage>sound, reproductor, note</dc:coverage> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="Repros" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <path + transform="matrix(1.0959323,0,0,0.8089025,-5.5106536,11.657465)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6115" + style="opacity:0.78165935;color:#000000;fill:url(#radialGradient6123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.04187703;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.5479662,0,0,0.3392172,9.2446732,29.259582)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6051" + style="opacity:1;color:#000000;fill:url(#linearGradient6097);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:2.31944561;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.65089345;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6099" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.4957789,0,0,0.2870299,10.649943,30.604261)" /> + <path + style="opacity:0.56768559;fill:url(#linearGradient6111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 14.568214,40 C 14.568214,40 17,44 24,44 L 24,38 L 14.590994,38 L 14.568214,40 z" + id="path6103" /> + <path + transform="matrix(1.0176515,0,0,0.8871834,-3.4027508,1.6404446)" + d="M 46.089207 25.766438 A 19.161766 19.161766 0 1 1 7.7656746,25.766438 A 19.161766 19.161766 0 1 1 46.089207 25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6216" + style="opacity:1;color:#000000;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.05243087;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.05243087;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6011" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(1.0176515,0,0,0.8871834,-3.4027508,0.6404459)" /> + <path + transform="matrix(0.9230621,0,0,0.8089025,-0.6682001,3.1574644)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6013" + style="opacity:1;color:#000000;fill:url(#radialGradient6033);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.15727437;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.37387384;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6089" + sodipodi:cx="19.378376" + sodipodi:cy="17.854717" + sodipodi:rx="0.44991162" + sodipodi:ry="0.72862023" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + transform="matrix(2.2226587,0,0,1.3724571,-18.071516,10.495167)" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.1150111;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.27477477;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6015" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.9632898,0,0,0.8349961,-1.9805954,1.985125)" /> + <path + style="fill:url(#linearGradient6302);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 17.034171,38.999185 C 21.404465,41.254322 38.074051,40.980927 42,28 C 42,28 36.363653,42.203426 17.034171,38.999185 z" + id="path6039" + sodipodi:nodetypes="csc" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.26576574;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.223824,28.652367 C 31.223824,31.136367 27.928944,33.500002 24.340943,33.500002 C 20.752943,33.500002 18.499998,31.484001 18.499998,29.000001 C 18.499998,26.516 21.411999,23.5 24.999999,23.5 C 28.588,23.5 31.223824,26.168366 31.223824,28.652367 z" + id="path6055" + sodipodi:nodetypes="csssc" /> + <path + style="color:#000000;fill:url(#radialGradient6290);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 30.5,28.000001 C 30.5,30.484001 27.588,32.500002 23.999999,32.500002 C 20.411999,32.500002 17.499998,30.484001 17.499998,28.000001 C 17.499998,25.516 20.411999,22.5 23.999999,22.5 C 27.588,22.5 30.5,25.516 30.5,28.000001 z" + id="path6047" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(2.2226587,0,0,1.3724571,-21.071516,10.495167)" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + sodipodi:ry="0.72862023" + sodipodi:rx="0.44991162" + sodipodi:cy="17.854717" + sodipodi:cx="19.378376" + id="path6087" + style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.37387384;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6083" + sodipodi:cx="19.378376" + sodipodi:cy="17.854717" + sodipodi:rx="0.44991162" + sodipodi:ry="0.72862023" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + transform="matrix(1.1113294,0,0,1.3724571,0.9642417,11.495167)" /> + <path + transform="matrix(1.1113294,0,0,1.3724571,3.9642417,11.495167)" + d="M 19.828288,17.854717 A 0.44991162,0.72862023 0 1 1 18.928464,17.854717 A 0.44991162,0.72862023 0 1 1 19.828288,17.854717 z" + sodipodi:ry="0.72862023" + sodipodi:rx="0.44991162" + sodipodi:cy="17.854717" + sodipodi:cx="19.378376" + id="path6085" + style="opacity:1;color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35585584;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <g + id="g6194" + transform="translate(1,-1)"> + <path + sodipodi:nodetypes="cccssssccssccccssccssssssc" + id="path6129" + d="M 43.46875,1.96875 C 43.341028,1.9713959 43.211505,1.998755 43.09375,2.03125 L 29.625,3 C 29.574046,2.9958278 29.520341,2.9676689 29.46875,2.96875 C 29.027926,2.9778822 28.643139,3.1915368 28.375,3.5 C 28.202199,3.6987874 28.080462,3.9184764 28.03125,4.1875 C 28.010332,4.2875967 27.999825,4.3942071 28,4.5 C 28.000051,4.5307141 27.998058,4.562684 28,4.59375 L 28,18.5 C 27.99235,19.040954 28.282754,19.53979 28.75,19.8125 C 29.217247,20.085209 29.782753,20.085209 30.25,19.8125 C 30.717246,19.53979 31.00765,19.040954 31,18.5 L 31,7.90625 L 42,7.125 L 42,17.5 C 41.99235,18.040954 42.282754,18.53979 42.75,18.8125 C 43.217247,19.085209 43.782753,19.085209 44.25,18.8125 C 44.717246,18.53979 45.00765,18.040954 45,17.5 L 45,3.71875 C 45.009715,3.6495233 45.000118,3.5716662 45,3.5 C 45.000636,3.4696526 45.001192,3.4364034 45,3.40625 C 44.993528,3.3026966 44.963584,3.1901475 44.9375,3.09375 C 44.91387,3.0012937 44.884391,2.9299172 44.84375,2.84375 C 44.80019,2.7563932 44.7464,2.670181 44.6875,2.59375 C 44.644141,2.5354224 44.614528,2.4582776 44.5625,2.40625 C 44.273456,2.1172076 43.877428,1.960186 43.46875,1.96875 z" + style="fill:#ce5c00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + transform="matrix(1.1476473,0,0,1.3276281,-10.517647,-3.9468619)" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6125" + style="opacity:1;color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:0.81013507;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:#ce5c00;stroke-width:0.81013507;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6127" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + transform="matrix(1.1476473,0,0,1.3276281,3.4823534,-4.9468619)" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 29.5,19.5 L 29.5,4.5" + id="path6163" /> + <path + sodipodi:nodetypes="cc" + id="path6165" + d="M 43.5,18.5 L 43.5,3.5" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 29.5,4.5 L 43.5,3.5" + id="path6167" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + id="path6186" + d="M 29.5,6.5 L 43.5,5.5" + style="fill:none;fill-rule:evenodd;stroke:#f57900;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.1859163;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6188" + sodipodi:cx="31.819572" + sodipodi:cy="17.284103" + sodipodi:rx="3.9210651" + sodipodi:ry="1.8830575" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + transform="matrix(0.8926147,0,0,0.7965768,-2.4026189,5.2318838)" /> + <path + transform="matrix(0.8926146,0,0,0.7965769,11.597384,4.2318822)" + d="M 35.740638,17.284103 A 3.9210651,1.8830575 0 1 1 27.898507,17.284103 A 3.9210651,1.8830575 0 1 1 35.740638,17.284103 z" + sodipodi:ry="1.8830575" + sodipodi:rx="3.9210651" + sodipodi:cy="17.284103" + sodipodi:cx="31.819572" + id="path6190" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.18591619;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="cc" + id="path6192" + d="M 29.5,4.5 L 43.5,3.5" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999964;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + id="path6212" + d="M 29.5,19.5 L 29.5,4.5" + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999964;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cc" /> + <path + style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999964;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.32882882;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 43.5,18.5 L 43.5,3.5" + id="path6214" + sodipodi:nodetypes="cc" /> + </g> + <path + transform="matrix(7.8280762e-2,0,0,4.6165615e-2,23.392097,23.925862)" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + sodipodi:ry="19.161766" + sodipodi:rx="19.161766" + sodipodi:cy="25.766438" + sodipodi:cx="26.927441" + id="path6206" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54301095;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6208" + sodipodi:cx="26.927441" + sodipodi:cy="25.766438" + sodipodi:rx="19.161766" + sodipodi:ry="19.161766" + d="M 46.089207,25.766438 A 19.161766,19.161766 0 1 1 7.7656746,25.766438 A 19.161766,19.161766 0 1 1 46.089207,25.766438 z" + transform="matrix(0.1043744,0,0,7.828089e-2,19.189462,25.48298)" /> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/Makefile.am b/panels/sound/data/icons/scalable/devices/Makefile.am new file mode 100644 index 000000000..404f6e5e4 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/Makefile.am @@ -0,0 +1,35 @@ +NULL = + +themedir = $(pkgdatadir)/icons/hicolor +size = 48x48 +context = devices + +iconsdir = $(themedir)/$(size)/$(context) + +icons_DATA = \ + audio-speaker-center.svg \ + audio-speaker-center-testing.svg \ + audio-speaker-left-back.svg \ + audio-speaker-left-back-testing.svg \ + audio-speaker-left.svg \ + audio-speaker-left-side.svg \ + audio-speaker-left-side-testing.svg \ + audio-speaker-left-testing.svg \ + audio-speaker-right-back.svg \ + audio-speaker-right-back-testing.svg \ + audio-speaker-right.svg \ + audio-speaker-right-side.svg \ + audio-speaker-right-side-testing.svg \ + audio-speaker-right-testing.svg \ + audio-speaker-center-back-testing.svg \ + audio-speaker-center-back.svg \ + audio-subwoofer.svg \ + audio-subwoofer-testing.svg \ + $(NULL) + +EXTRA_DIST = \ + $(icons_DATA) \ + $(NULL) + + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-center-back-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-center-back-testing.svg new file mode 100644 index 000000000..6b067d693 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-center-back-testing.svg @@ -0,0 +1,539 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.47 r22583" + version="1.0" + sodipodi:docname="audio-speaker-center-back-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-side-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="977" + inkscape:window-x="0" + inkscape:window-y="27" + showguides="false" + inkscape:guide-bbox="true" + inkscape:window-maximized="1"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>center</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-center-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(1,0,0,-1,-50.334601,47.958369)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="m 64.325669,10.506413 c 6.07143,-3.4821397 13.14286,-3.3928497 19.39286,0 l 2,4.39286 -23.39286,0 2,-4.39286 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="m 95.897099,27.934983 c 0,0 -4.54743,-8.68677 -9.8613,-12.93926 -0.21063,-0.16856 -0.42247,-0.33016 -0.63527,-0.48397 -0.50204,-0.36286 -1.00946,-0.68239 -1.51919,-0.94787 -0.56896,-0.29634 -1.14078,-0.52533 -1.71117,-0.67205 -3.88321,-1.01934 -11.71652,-1.06249 -15.58966,-0.04613 -0.83989,0.21914 -1.6816,0.61173 -2.51203,1.13191 -0.62524,0.39166 -1.24409,0.85564 -1.85095,1.37236 -1.87112,1.5932 -3.628309,3.68784 -5.107769,5.71001 -2.59659,3.54911 -4.33766,6.875 -4.33766,6.875" + style="fill:none;stroke:none" + id="path8494" /> + <path + style="fill:none;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 62.827469,15.979023 2.18704,-4.766 c 5.261057,-2.7432797 11.220313,-3.3671697 17.939063,-0.0056 l 1.96851,4.2035" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="m 95.001579,28.523883 c 0,0 -6.30803,-12.92857 -13.07068,-14.66816 -3.88321,-1.01933 -11.18527,-1.06248 -15.05841,-0.04613 -6.84412,1.78572 -11.839659,12.46429 -11.839659,12.46429" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="m 43.214285,32.24107 c 0,2.736768 -9.374038,4.955357 -20.9375,4.955357 -11.563462,0 -20.9375001,-2.218589 -20.9375001,-4.955357 0,-2.736768 9.3740381,-4.955357 20.9375001,-4.955357 11.563462,0 20.9375,2.218589 20.9375,4.955357 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="m 95.16001,29.859216 c 0.1894,4.408221 -8.80985,9.066057 -20.909493,9.066057 -12.099643,0 -21.130461,-4.594701 -20.90949,-9.066057 -0.189403,-4.566056 8.809847,-9.034489 20.90949,-9.034489 12.099643,0 20.941063,4.37373 20.909493,9.034489 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 82.142459,27.943913 c -0.67407,2.18776 -3.2897,3.38538 -7.80786,3.38538 -4.51815,0 -7.3487,-1.37717 -7.80786,-3.38538 -0.07073,-1.70502 3.28971,-3.37359 7.80786,-3.37359 4.51816,0 7.81965,1.63321 7.80786,3.37359 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 67.476989,27.764793 c 0.9704,3.07926 3.66898,5.29604 6.84343,5.29605 3.19412,0 5.90648,-2.24438 6.86128,-5.35345 -0.90064,-1.50063 -4.28117,-2.23685 -6.89061,-2.19358 -3.30434,-0.08574 -5.85648,0.85968 -6.8141,2.25098 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 62.722179,14.847493 c -0.12704,0.1026 -0.3786,0.39515 -0.50465,0.50248 -1.87112,1.5932 -3.628309,3.68784 -5.107769,5.71001 -2.59659,3.54911 -4.33766,6.875 -4.33766,6.875 m 43.124999,0 c 0,0 -4.54743,-8.68677 -9.8613,-12.93926 -0.21063,-0.16856 -0.42247,-0.33016 -0.63527,-0.48397 -0.10052,-0.07265 -0.648157,-0.29253 -0.749077,-0.36162" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 81.930899,13.855723 c -3.88321,-1.01933 -11.18527,-1.06248 -15.05841,-0.04613" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-center-back.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-center-back.svg new file mode 100644 index 000000000..2d162c45d --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-center-back.svg @@ -0,0 +1,506 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.47 r22583" + version="1.0" + sodipodi:docname="audio-speaker-center-back.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-53.025818" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="977" + inkscape:window-x="0" + inkscape:window-y="27" + showguides="false" + inkscape:guide-bbox="true" + inkscape:window-maximized="1"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>center</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-center</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(1,0,0,-1,-0.04163061,47.958369)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="m 14.032699,10.506413 c 6.07143,-3.4821397 13.14286,-3.3928497 19.39286,0 l 2,4.39286 -23.39286,0 2,-4.39286 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="m 45.604129,27.934983 c 0,0 -4.54743,-8.68677 -9.8613,-12.93926 -0.21063,-0.16856 -0.42247,-0.33016 -0.63527,-0.48397 -0.50204,-0.36286 -1.00946,-0.68239 -1.51919,-0.94787 -0.56896,-0.29634 -1.14078,-0.52533 -1.71117,-0.67205 -3.88321,-1.01934 -11.71652,-1.06249 -15.58966,-0.04613 -0.83989,0.21914 -1.6816,0.61173 -2.51203,1.13191 -0.62524,0.39166 -1.24409,0.85564 -1.85095,1.37236 -1.87112,1.5932 -3.6283094,3.68784 -5.1077694,5.71001 -2.59659,3.54911 -4.33766,6.875 -4.33766,6.875" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none" + id="path5367" /> + <path + style="fill:none;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 12.534499,15.979023 2.18704,-4.766 c 5.261057,-2.7432797 11.220313,-3.3671697 17.939063,-0.0056 l 1.96851,4.2035" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="m 44.708609,28.523883 c 0,0 -6.30803,-12.92857 -13.07068,-14.66816 -3.88321,-1.01933 -11.18527,-1.06248 -15.05841,-0.04613 -6.8441198,1.78572 -11.8396594,12.46429 -11.8396594,12.46429" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="m 43.214285,32.24107 c 0,2.736768 -9.374038,4.955357 -20.9375,4.955357 -11.563462,0 -20.9375001,-2.218589 -20.9375001,-4.955357 0,-2.736768 9.3740381,-4.955357 20.9375001,-4.955357 11.563462,0 20.9375,2.218589 20.9375,4.955357 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 44.951119,29.943913 c 0.18941,4.40822 -8.80985,9.06606 -20.90949,9.06606 -12.09964,0 -21.1304594,-4.5947 -20.9094894,-9.06606 -0.1894,-4.56606 8.8098494,-9.03449 20.9094894,-9.03449 12.09964,0 20.94106,4.37373 20.90949,9.03449 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 31.849489,27.943913 c -0.67407,2.18776 -3.2897,3.38538 -7.80786,3.38538 -4.51815,0 -7.3487,-1.37717 -7.80786,-3.38538 -0.07073,-1.70502 3.28971,-3.37359 7.80786,-3.37359 4.51816,0 7.81965,1.63321 7.80786,3.37359 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 17.184019,27.764793 c 0.9704,3.07926 3.66898,5.29604 6.84343,5.29605 3.19412,0 5.90648,-2.24438 6.86128,-5.35345 -0.90064,-1.50063 -4.28117,-2.23685 -6.89061,-2.19358 -3.30434,-0.08574 -5.85648,0.85968 -6.8141,2.25098 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 12.429209,14.847493 c -0.12704,0.1026 -0.3786,0.39515 -0.50465,0.50248 -1.87112,1.5932 -3.6283094,3.68784 -5.1077694,5.71001 -2.59659,3.54911 -4.33766,6.875 -4.33766,6.875 m 43.1249994,0 c 0,0 -4.54743,-8.68677 -9.8613,-12.93926 -0.21063,-0.16856 -0.42247,-0.33016 -0.63527,-0.48397 -0.10052,-0.07265 -0.648157,-0.29253 -0.749077,-0.36162" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 31.637929,13.855723 c -3.88321,-1.01933 -11.18527,-1.06248 -15.05841,-0.04613" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-center-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-center-testing.svg new file mode 100644 index 000000000..544384a1a --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-center-testing.svg @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-center-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-side-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>center</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-center-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="translate(-50.334601,4.1631076e-2)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-center.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-center.svg new file mode 100644 index 000000000..77426fdb8 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-center.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-center.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-53.025818" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="25" + inkscape:window-y="21" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>center</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-center</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="translate(-4.1630606e-2,4.1631076e-2)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-left-back-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-left-back-testing.svg new file mode 100644 index 000000000..4ab4a3740 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-left-back-testing.svg @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-left-back-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>left-back</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-left-b-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(-0.7071068,-0.7071068,0.7071068,-0.7071068,57.052876,95.851156)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-left-back.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-left-back.svg new file mode 100644 index 000000000..f82c536f2 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-left-back.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-left-back.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-53.376308" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1601" + inkscape:window-height="942" + inkscape:window-x="5" + inkscape:window-y="1" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>left-back</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-left-back</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(-0.7071068,-0.7071068,0.7071068,-0.7071068,21.490375,60.288654)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-left-side-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-left-side-testing.svg new file mode 100644 index 000000000..1d06aa9b4 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-left-side-testing.svg @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-left-side-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-right-side-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>left-side</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-left-side-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(0,-1,1,0,4.1631076e-2,98.334601)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-left-side.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-left-side.svg new file mode 100644 index 000000000..bfbd3a370 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-left-side.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-left-side.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-side.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-15.988037" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1601" + inkscape:window-height="942" + inkscape:window-x="5" + inkscape:window-y="1" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>left-side</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-left-side</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(0,-1,1,0,4.1631076e-2,48.041631)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-left-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-left-testing.svg new file mode 100644 index 000000000..947c2e82a --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-left-testing.svg @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-left-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-back-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>left</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-left-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(-0.7071068,0.7071068,0.7071068,0.7071068,57.052876,-47.851155)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-left.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-left.svg new file mode 100644 index 000000000..a9080445a --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-left.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-left.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-right.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-53.376308" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1601" + inkscape:window-height="942" + inkscape:window-x="5" + inkscape:window-y="1" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>left</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-left</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(-0.7071068,0.7071068,0.7071068,0.7071068,21.490375,-12.288654)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-right-back-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-right-back-testing.svg new file mode 100644 index 000000000..a641a4aca --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-right-back-testing.svg @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-right-back-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-back-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right-back</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right-back-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(0.7071068,-0.7071068,-0.7071068,-0.7071068,-9.0528759,95.851156)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-right-back.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-right-back.svg new file mode 100644 index 000000000..051246480 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-right-back.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-right-back.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-left-back.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-53.376308" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1601" + inkscape:window-height="942" + inkscape:window-x="5" + inkscape:window-y="1" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right-back</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right-back</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(0.7071068,-0.7071068,-0.7071068,-0.7071068,26.509625,60.288654)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-right-side-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-right-side-testing.svg new file mode 100644 index 000000000..a15a08f80 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-right-side-testing.svg @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-right-side-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-right-back-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right-side</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right-side-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(0,-1,-1,0,47.958369,98.334601)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-right-side.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-right-side.svg new file mode 100644 index 000000000..1419c0294 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-right-side.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-right-side.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-right-back.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-15.988037" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1601" + inkscape:window-height="942" + inkscape:window-x="5" + inkscape:window-y="1" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right-side</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right-side</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(0,-1,-1,0,47.958369,48.041631)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-right-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-right-testing.svg new file mode 100644 index 000000000..9d8482091 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-right-testing.svg @@ -0,0 +1,913 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-right-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker-right-testing.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5941" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(11.322482,0,0,3.7410569,-790.12434,122.56351)" + cx="14.790665" + cy="29.860626" + fx="14.790665" + fy="29.860626" + r="1.1399525" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5939" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(10.171038,0,0,5.2502725,-797.43964,77.21735)" + cx="17.797972" + cy="29.948833" + fx="17.797972" + fy="29.948833" + r="1.945146" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6377"> + <stop + style="stop-color:#729fcf;stop-opacity:1" + offset="0" + id="stop6379" /> + <stop + style="stop-color:#204a87;stop-opacity:1" + offset="1" + id="stop6381" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5937" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(15.4058,0,0,6.5714191,-930.81786,37.58535)" + cx="20.818829" + cy="29.948536" + fx="20.818829" + fy="29.948536" + r="2.5451017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5935" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,-677.47231,206.91558)" + x1="21.875" + y1="9.6335878" + x2="20.5" + y2="41.744865" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5933" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,-677.47231,206.91558)" + x1="20.087172" + y1="6.6629219" + x2="20.91938" + y2="38.337017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5931" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.6831088,0,0,1.0329054,-652.67404,212.26374)" + x1="4.5961943" + y1="14.456622" + x2="4.5961943" + y2="30.313524" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5929" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.7679166,0,0,1.687933,-652.72155,185.35433)" + x1="2.6850162" + y1="24.367676" + x2="2.9248238" + y2="35.053852" /> + <linearGradient + inkscape:collect="always" + id="linearGradient21582"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop21584" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop21586" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21582" + id="linearGradient5927" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.2565202,-654.12827,206.16954)" + x1="21.875" + y1="26.625" + x2="18.187626" + y2="26" /> + <linearGradient + inkscape:collect="always" + id="linearGradient21598"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop21600" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop21602" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21598" + id="linearGradient5925" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7830101,0,0,0.9810567,-652.01527,212.32101)" + x1="12.25" + y1="19.75" + x2="10.875" + y2="33.125" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="radialGradient5923" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.433087,-0.596698,0.798238,1.917124,-20.96864,-16.43019)" + cx="7.001297" + cy="22.470087" + fx="7.001297" + fy="22.470087" + r="6.4940691" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10872" + id="linearGradient5921" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.0172401,-654.21562,212.46274)" + x1="3.8890872" + y1="18.937069" + x2="3.8890872" + y2="25.947107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5919" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,-655.42965,207.54612)" + x1="11.875" + y1="20.375" + x2="13.125" + y2="34.13559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6371" + id="linearGradient5917" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,-655.42965,207.54612)" + x1="14.241117" + y1="26.996773" + x2="15.125" + y2="20.976084" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21608" + id="linearGradient5915" + gradientUnits="userSpaceOnUse" + x1="23.272787" + y1="18.525478" + x2="23.272787" + y2="22.811184" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient15341" + id="radialGradient5913" + gradientUnits="userSpaceOnUse" + cx="22.624176" + cy="20.880224" + fx="22.624176" + fy="20.880224" + r="3.3177083" /> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3529" + id="radialGradient5911" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2876712,0,13.845354)" + cx="7.9549513" + cy="19.436747" + fx="7.9549513" + fy="19.436747" + r="6.4523492" /> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3529" + id="radialGradient5708" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2876712,0,13.845354)" + cx="7.9549513" + cy="19.436747" + fx="7.9549513" + fy="19.436747" + r="6.4523492" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient15341" + id="radialGradient5710" + gradientUnits="userSpaceOnUse" + cx="22.624176" + cy="20.880224" + fx="22.624176" + fy="20.880224" + r="3.3177083" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21608" + id="linearGradient5712" + gradientUnits="userSpaceOnUse" + x1="23.272787" + y1="18.525478" + x2="23.272787" + y2="22.811184" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="radialGradient5720" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.433087,-0.596698,0.798238,1.917124,-20.96864,-16.43019)" + cx="7.001297" + cy="22.470087" + fx="7.001297" + fy="22.470087" + r="6.4940691" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5744" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-8.0062038,8.0062038,-2.6453267,-2.6453267,292.61535,-42.156174)" + cx="14.790665" + cy="29.860626" + fx="14.790665" + fy="29.860626" + r="1.1399525" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5747" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-7.1920099,7.1920099,-3.7125033,-3.7125033,329.85262,-15.264295)" + cx="17.797972" + cy="29.948833" + fx="17.797972" + fy="29.948833" + r="1.945146" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5750" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-10.893546,10.893546,-4.646695,-4.646695,452.18932,-81.552883)" + cx="20.818829" + cy="29.948536" + fx="20.818829" + fy="29.948536" + r="2.5451017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5753" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,31.77769,-26.9466)" + x1="20.087172" + y1="6.6629219" + x2="20.91938" + y2="38.337017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5755" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,31.77769,-26.9466)" + x1="21.875" + y1="9.6335878" + x2="20.5" + y2="41.744865" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5758" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.7679166,0,0,1.687933,56.52845,-48.50785)" + x1="2.6850162" + y1="24.367676" + x2="2.9248238" + y2="35.053852" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5760" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.6831088,0,0,1.0329054,56.57596,-21.59844)" + x1="4.5961943" + y1="14.456622" + x2="4.5961943" + y2="30.313524" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21582" + id="linearGradient5763" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.2565202,55.12173,-27.69264)" + x1="21.875" + y1="26.625" + x2="18.187626" + y2="26" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21598" + id="linearGradient5766" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7830101,0,0,0.9810567,57.23473,-21.54117)" + x1="12.25" + y1="19.75" + x2="10.875" + y2="33.125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10872" + id="linearGradient5770" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.0172401,55.03438,-21.39944)" + x1="3.8890872" + y1="18.937069" + x2="3.8890872" + y2="25.947107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6371" + id="linearGradient5773" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,53.82035,-26.31606)" + x1="14.241117" + y1="26.996773" + x2="15.125" + y2="20.976084" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5775" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,53.82035,-26.31606)" + x1="11.875" + y1="20.375" + x2="13.125" + y2="34.13559" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5928" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,-9.0528759,-47.851156)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-right.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-right.svg new file mode 100644 index 000000000..04b30a05a --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-right.svg @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-right.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-speaker.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient7260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.516569,40.378763)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="-90.590866" + inkscape:cy="20.556657" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1601" + inkscape:window-height="942" + inkscape:window-x="5" + inkscape:window-y="1" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g7248" + transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,26.509625,-12.288654)"> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="M 14.032699,10.506413 C 20.104129,7.0242733 27.175559,7.1135633 33.425559,10.506413 L 35.425559,14.899273 L 12.032699,14.899273 L 14.032699,10.506413 z" + style="fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 34.605519,14.148893 34.098099,13.829363 33.588369,13.563883 C 33.019409,13.267543 32.447589,13.038553 31.877199,12.891833 C 27.993989,11.872493 20.160679,11.829343 16.287539,12.845703 C 15.447649,13.064843 14.605939,13.457433 13.775509,13.977613 C 13.150269,14.369273 12.531419,14.833253 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983" + style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5367" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#888a83;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 12.534499,15.979023 L 14.721539,11.213023 C 19.982596,8.4697433 25.941852,7.8458533 32.660602,11.207463 L 34.629112,15.410963" + id="path5369" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 44.708609,28.523883 C 44.708609,28.523883 38.400579,15.595313 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593 C 9.7353992,15.595313 4.7398596,26.273883 4.7398596,26.273883" + style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path5371" /> + <path + transform="matrix(1.0469083,0,0,2.027027,0.7198796,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path5373" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:url(#radialGradient7260);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 44.951119,29.943913 C 45.140529,34.352133 36.141269,39.009973 24.041629,39.009973 C 11.941989,39.009973 2.9111696,34.415273 3.1321396,29.943913 C 2.9427396,25.377853 11.941989,20.909423 24.041629,20.909423 C 36.141269,20.909423 44.982689,25.283153 44.951119,29.943913 z" + id="path5375" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 31.849489,27.943913 C 31.175419,30.131673 28.559789,31.329293 24.041629,31.329293 C 19.523479,31.329293 16.692929,29.952123 16.233769,27.943913 C 16.163039,26.238893 19.523479,24.570323 24.041629,24.570323 C 28.559789,24.570323 31.861279,26.203533 31.849489,27.943913 z" + id="path5377" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 17.184019,27.764793 C 18.154419,30.844053 20.852999,33.060833 24.027449,33.060843 C 27.221569,33.060843 29.933929,30.816463 30.888729,27.707393 C 29.988089,26.206763 26.607559,25.470543 23.998119,25.513813 C 20.693779,25.428073 18.141639,26.373493 17.184019,27.764793 z" + id="path5379" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path5381" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.429209,14.847493 C 12.302169,14.950093 12.050609,15.242643 11.924559,15.349973 C 10.053439,16.943173 8.2962496,19.037813 6.8167896,21.059983 C 4.2201996,24.609093 2.4791296,27.934983 2.4791296,27.934983 M 45.604129,27.934983 C 45.604129,27.934983 41.056699,19.248213 35.742829,14.995723 C 35.532199,14.827163 35.320359,14.665563 35.107559,14.511753 C 35.007039,14.439103 34.459402,14.219223 34.358482,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path5383" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 31.637929,13.855723 C 27.754719,12.836393 20.452659,12.793243 16.579519,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-speaker-testing.svg b/panels/sound/data/icons/scalable/devices/audio-speaker-testing.svg new file mode 100644 index 000000000..79b1ff274 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-speaker-testing.svg @@ -0,0 +1,913 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-speaker-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_speaker.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5941" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(11.322482,0,0,3.7410569,-790.12434,122.56351)" + cx="14.790665" + cy="29.860626" + fx="14.790665" + fy="29.860626" + r="1.1399525" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5939" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(10.171038,0,0,5.2502725,-797.43964,77.21735)" + cx="17.797972" + cy="29.948833" + fx="17.797972" + fy="29.948833" + r="1.945146" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6377"> + <stop + style="stop-color:#729fcf;stop-opacity:1" + offset="0" + id="stop6379" /> + <stop + style="stop-color:#204a87;stop-opacity:1" + offset="1" + id="stop6381" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5937" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(15.4058,0,0,6.5714191,-930.81786,37.58535)" + cx="20.818829" + cy="29.948536" + fx="20.818829" + fy="29.948536" + r="2.5451017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5935" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,-677.47231,206.91558)" + x1="21.875" + y1="9.6335878" + x2="20.5" + y2="41.744865" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5933" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,-677.47231,206.91558)" + x1="20.087172" + y1="6.6629219" + x2="20.91938" + y2="38.337017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5931" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.6831088,0,0,1.0329054,-652.67404,212.26374)" + x1="4.5961943" + y1="14.456622" + x2="4.5961943" + y2="30.313524" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5929" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.7679166,0,0,1.687933,-652.72155,185.35433)" + x1="2.6850162" + y1="24.367676" + x2="2.9248238" + y2="35.053852" /> + <linearGradient + inkscape:collect="always" + id="linearGradient21582"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop21584" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop21586" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21582" + id="linearGradient5927" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.2565202,-654.12827,206.16954)" + x1="21.875" + y1="26.625" + x2="18.187626" + y2="26" /> + <linearGradient + inkscape:collect="always" + id="linearGradient21598"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop21600" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop21602" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21598" + id="linearGradient5925" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7830101,0,0,0.9810567,-652.01527,212.32101)" + x1="12.25" + y1="19.75" + x2="10.875" + y2="33.125" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="radialGradient5923" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.433087,-0.596698,0.798238,1.917124,-20.96864,-16.43019)" + cx="7.001297" + cy="22.470087" + fx="7.001297" + fy="22.470087" + r="6.4940691" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10872" + id="linearGradient5921" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.0172401,-654.21562,212.46274)" + x1="3.8890872" + y1="18.937069" + x2="3.8890872" + y2="25.947107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5919" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,-655.42965,207.54612)" + x1="11.875" + y1="20.375" + x2="13.125" + y2="34.13559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6371" + id="linearGradient5917" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,-655.42965,207.54612)" + x1="14.241117" + y1="26.996773" + x2="15.125" + y2="20.976084" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21608" + id="linearGradient5915" + gradientUnits="userSpaceOnUse" + x1="23.272787" + y1="18.525478" + x2="23.272787" + y2="22.811184" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient15341" + id="radialGradient5913" + gradientUnits="userSpaceOnUse" + cx="22.624176" + cy="20.880224" + fx="22.624176" + fy="20.880224" + r="3.3177083" /> + <linearGradient + id="linearGradient3529"> + <stop + id="stop3531" + offset="0" + style="stop-color:#fefefe;stop-opacity:1;" /> + <stop + id="stop3533" + offset="1" + style="stop-color:#e8e7e6;stop-opacity:1;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3529" + id="radialGradient5911" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2876712,0,13.845354)" + cx="7.9549513" + cy="19.436747" + fx="7.9549513" + fy="19.436747" + r="6.4523492" /> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4325"> + <stop + id="stop4327" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4329" /> + </linearGradient> + <linearGradient + id="linearGradient21608"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop21610" /> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="1" + id="stop21612" /> + </linearGradient> + <linearGradient + id="linearGradient15341"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop15343" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop15345" /> + </linearGradient> + <linearGradient + id="linearGradient6371"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop6373" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="1" + id="stop6375" /> + </linearGradient> + <linearGradient + id="linearGradient10872"> + <stop + id="stop10874" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + style="stop-color:#9e9e92;stop-opacity:1;" + offset="0.25301206" + id="stop10876" /> + <stop + id="stop10878" + offset="1" + style="stop-color:#555753;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5254"> + <stop + id="stop5256" + offset="0" + style="stop-color:#707469;stop-opacity:1;" /> + <stop + id="stop5258" + offset="1" + style="stop-color:#2e3335;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient10055"> + <stop + style="stop-color:#bebebe;stop-opacity:1;" + offset="0" + id="stop10057" /> + <stop + id="stop10061" + offset="0.375" + style="stop-color:#e8e8e8;stop-opacity:1;" /> + <stop + style="stop-color:#5c5c5c;stop-opacity:1;" + offset="1" + id="stop10059" /> + </linearGradient> + <linearGradient + id="linearGradient4841"> + <stop + id="stop4843" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:0.94117647;" + offset="0" + id="stop4845" /> + <stop + id="stop4847" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop4849" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4813" + offset="0" + style="stop-color:#ad7fa8;stop-opacity:1;" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop4815" /> + <stop + id="stop4817" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient3223"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3225" /> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="1" + id="stop3227" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop3239" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3501" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2366258,0,24.617945)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient3232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,47.474934,42.420392)" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" + spreadMethod="reflect" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0469084,0,0,0.4796469,270.37856,38.427671)" + cx="22.276291" + cy="32.248856" + fx="22.276291" + fy="32.248856" + r="20.319138" /> + <inkscape:perspective + id="perspective3474" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient4359" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-52.447261,-106.14795)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5015" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,42.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5062" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4325" + id="radialGradient5064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,98.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5110" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,142.72007,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3863" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3865" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient3906" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,92.720075,-107.89847)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3345" + id="radialGradient5554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.725459,40.419065)" + spreadMethod="pad" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient8512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3529" + id="radialGradient5708" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.2876712,0,13.845354)" + cx="7.9549513" + cy="19.436747" + fx="7.9549513" + fy="19.436747" + r="6.4523492" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient15341" + id="radialGradient5710" + gradientUnits="userSpaceOnUse" + cx="22.624176" + cy="20.880224" + fx="22.624176" + fy="20.880224" + r="3.3177083" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21608" + id="linearGradient5712" + gradientUnits="userSpaceOnUse" + x1="23.272787" + y1="18.525478" + x2="23.272787" + y2="22.811184" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="radialGradient5720" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.433087,-0.596698,0.798238,1.917124,-20.96864,-16.43019)" + cx="7.001297" + cy="22.470087" + fx="7.001297" + fy="22.470087" + r="6.4940691" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5744" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-8.0062038,8.0062038,-2.6453267,-2.6453267,292.61535,-42.156174)" + cx="14.790665" + cy="29.860626" + fx="14.790665" + fy="29.860626" + r="1.1399525" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5747" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-7.1920099,7.1920099,-3.7125033,-3.7125033,329.85262,-15.264295)" + cx="17.797972" + cy="29.948833" + fx="17.797972" + fy="29.948833" + r="1.945146" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6377" + id="radialGradient5750" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-10.893546,10.893546,-4.646695,-4.646695,452.18932,-81.552883)" + cx="20.818829" + cy="29.948536" + fx="20.818829" + fy="29.948536" + r="2.5451017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5753" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,31.77769,-26.9466)" + x1="20.087172" + y1="6.6629219" + x2="20.91938" + y2="38.337017" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5755" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0714931,0,0,1.2212999,31.77769,-26.9466)" + x1="21.875" + y1="9.6335878" + x2="20.5" + y2="41.744865" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10055" + id="linearGradient5758" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.7679166,0,0,1.687933,56.52845,-48.50785)" + x1="2.6850162" + y1="24.367676" + x2="2.9248238" + y2="35.053852" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5760" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.6831088,0,0,1.0329054,56.57596,-21.59844)" + x1="4.5961943" + y1="14.456622" + x2="4.5961943" + y2="30.313524" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21582" + id="linearGradient5763" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.2565202,55.12173,-27.69264)" + x1="21.875" + y1="26.625" + x2="18.187626" + y2="26" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient21598" + id="linearGradient5766" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7830101,0,0,0.9810567,57.23473,-21.54117)" + x1="12.25" + y1="19.75" + x2="10.875" + y2="33.125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10872" + id="linearGradient5770" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0102994,0,0,1.0172401,55.03438,-21.39944)" + x1="3.8890872" + y1="18.937069" + x2="3.8890872" + y2="25.947107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6371" + id="linearGradient5773" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,53.82035,-26.31606)" + x1="14.241117" + y1="26.996773" + x2="15.125" + y2="20.976084" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5254" + id="linearGradient5775" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99664,0,0,1.1932745,53.82035,-26.31606)" + x1="11.875" + y1="20.375" + x2="13.125" + y2="34.13559" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient5928" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,97.72545,40.294064)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="126.80533" + inkscape:cy="41.532441" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="-12" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="-14.142136,73.185552" + id="guide3490" /> + <sodipodi:guide + orientation="1,0" + position="-21,-23.25" + id="guide5857" /> + <sodipodi:guide + orientation="1,0" + position="-49.5,-22.625" + id="guide5859" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>speaker</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>right</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-speaker-right-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g8490" + transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,-9.0528759,-47.851156)"> + <path + sodipodi:nodetypes="ccccc" + id="path8492" + d="M 64.325669,10.506413 C 70.397099,7.0242733 77.468529,7.1135633 83.718529,10.506413 L 85.718529,14.899273 L 62.325669,14.899273 L 64.325669,10.506413 z" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccsssc" + d="M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 84.898489,14.148893 84.391069,13.829363 83.881339,13.563883 C 83.312379,13.267543 82.740559,13.038553 82.170169,12.891833 C 78.286959,11.872493 70.453649,11.829343 66.580509,12.845703 C 65.740619,13.064843 64.898909,13.457433 64.068479,13.977613 C 63.443239,14.369273 62.824389,14.833253 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8494" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.827469,15.979023 L 65.014509,11.213023 C 70.275566,8.4697433 76.234822,7.8458533 82.953572,11.207463 L 84.922082,15.410963" + id="path8496" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + d="M 95.001579,28.523883 C 95.001579,28.523883 88.693549,15.595313 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593 C 60.028369,15.595313 55.03283,26.273883 55.03283,26.273883" + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path8498" /> + <path + transform="matrix(1.0469083,0,0,2.027027,51.01285,-35.409607)" + d="M 43.214285,32.24107 A 20.9375,4.9553571 0 1 1 1.3392849,32.24107 A 20.9375,4.9553571 0 1 1 43.214285,32.24107 z" + sodipodi:ry="4.9553571" + sodipodi:rx="20.9375" + sodipodi:cy="32.24107" + sodipodi:cx="22.276785" + id="path8500" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.68646109;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="ccccc" + id="path8502" + d="M 95.16001,29.859216 C 95.34941,34.267437 86.35016,38.925273 74.250517,38.925273 C 62.150874,38.925273 53.120056,34.330572 53.341027,29.859216 C 53.151624,25.29316 62.150874,20.824727 74.250517,20.824727 C 86.35016,20.824727 95.19158,25.198457 95.16001,29.859216 z" + style="fill:url(#radialGradient8512);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 82.142459,27.943913 C 81.468389,30.131673 78.852759,31.329293 74.334599,31.329293 C 69.816449,31.329293 66.985899,29.952123 66.526739,27.943913 C 66.456009,26.238893 69.816449,24.570323 74.334599,24.570323 C 78.852759,24.570323 82.154249,26.203533 82.142459,27.943913 z" + id="path8504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.96596354;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 67.476989,27.764793 C 68.447389,30.844053 71.145969,33.060833 74.320419,33.060843 C 77.514539,33.060843 80.226899,30.816463 81.181699,27.707393 C 80.281059,26.206763 76.900529,25.470543 74.291089,25.513813 C 70.986749,25.428073 68.434609,26.373493 67.476989,27.764793 z" + id="path8506" + sodipodi:nodetypes="csccc" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_Test.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998" /> + <path + id="path8508" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 62.722179,14.847493 C 62.595139,14.950093 62.343579,15.242643 62.217529,15.349973 C 60.346409,16.943173 58.58922,19.037813 57.10976,21.059983 C 54.51317,24.609093 52.7721,27.934983 52.7721,27.934983 M 95.897099,27.934983 C 95.897099,27.934983 91.349669,19.248213 86.035799,14.995723 C 85.825169,14.827163 85.613329,14.665563 85.400529,14.511753 C 85.300009,14.439103 84.752372,14.219223 84.651452,14.150133" + sodipodi:nodetypes="cssccsss" /> + <path + id="path8510" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#bfd8f3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 81.930899,13.855723 C 78.047689,12.836393 70.745629,12.793243 66.872489,13.809593" + sodipodi:nodetypes="cc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-subwoofer-testing.svg b/panels/sound/data/icons/scalable/devices/audio-subwoofer-testing.svg new file mode 100644 index 000000000..2e1dd7818 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-subwoofer-testing.svg @@ -0,0 +1,240 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-subwoofer-testing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/audio-subwoofer-testing.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient6718"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop6720" /> + <stop + id="stop6724" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3503"> + <stop + id="stop3505" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6984" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8284271" + inkscape:cx="-48.821714" + inkscape:cy="66.867859" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>subwoofer</rdf:li> + <rdf:li>output</rdf:li> + <rdf:li>testing</rdf:li> + <rdf:li>highlighted</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-subwoofer-testing</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g6973" + transform="translate(-51.375,9.0155254e-8)"> + <path + style="fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 94.217316,39.045143 C 93.839661,41.471941 92.789441,43.219015 91.55403,43.219015 C 90.310955,43.219015 89.255378,41.450202 88.883794,38.999908 C 89.234301,37.817247 90.549918,37.23702 91.565441,37.271125 C 92.851403,37.203551 93.844629,37.948644 94.217316,39.045143 z" + id="path6730" + sodipodi:nodetypes="csccc" /> + <path + sodipodi:nodetypes="csccc" + id="path6732" + d="M 62.393985,39.045143 C 62.016329,41.471941 60.96611,43.219015 59.730698,43.219015 C 58.487624,43.219015 57.432046,41.450202 57.060462,38.999908 C 57.410969,37.817247 58.726586,37.23702 59.742109,37.271125 C 61.028072,37.203551 62.021297,37.948644 62.393985,39.045143 z" + style="fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1.28661346;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 62.953967,6.9788731 C 73.409478,4.1293728 77.293929,4.3517447 87.917557,6.9788731 L 95.317117,13.152471 L 55.554408,13.152471 L 62.953967,6.9788731 z" + id="path6734" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 55.289577,13.137135 C 67.861736,9.7856746 82.504598,9.8716096 95.446529,13.137135 L 95.389975,39.76734 C 82.177445,42.114593 68.287824,42.159732 55.346132,39.902758 L 55.289577,13.137135 z" + id="path6736" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient6984);fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.05839419;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6738" + sodipodi:cx="84.365685" + sodipodi:cy="64.927307" + sodipodi:rx="21.396112" + sodipodi:ry="21.396112" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + transform="matrix(0,0.4858156,-0.4858156,0,100.43255,-14.78506)" /> + <path + transform="matrix(0,0.2827849,-0.2827849,0,105.0933,2.3437637)" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + sodipodi:ry="21.396112" + sodipodi:rx="21.396112" + sodipodi:cy="64.927307" + sodipodi:cx="84.365685" + id="path6740" + style="fill:#bfd8f3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.53625679;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:5.06734753;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6742" + sodipodi:cx="84.365685" + sodipodi:cy="64.927307" + sodipodi:rx="21.396112" + sodipodi:ry="21.396112" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + transform="matrix(0,0.1973419,-0.1973419,0,99.523923,9.5522206)" /> + <path + sodipodi:nodetypes="ccccc" + id="path6744" + d="M 56.321159,13.950789 C 67.82398,10.961669 81.161179,10.935259 94.415609,13.950789 L 94.359059,38.893489 C 81.01047,40.978079 68.381909,41.160879 56.377709,39.028909 L 56.321159,13.950789 z" + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfd8f3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + transform="matrix(0,0.1973419,-0.1973419,0,81.702733,9.5522212)" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + sodipodi:ry="21.396112" + sodipodi:rx="21.396112" + sodipodi:cy="64.927307" + sodipodi:cx="84.365685" + id="path6746" + style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:5.06734753;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/scalable/devices/audio-subwoofer.svg b/panels/sound/data/icons/scalable/devices/audio-subwoofer.svg new file mode 100644 index 000000000..fb3646800 --- /dev/null +++ b/panels/sound/data/icons/scalable/devices/audio-subwoofer.svg @@ -0,0 +1,325 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2643" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docname="audio-subwoofer.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/eve/Documents/GNOME/SpeakerIcon_subwoofer.png" + inkscape:export-xdpi="67.489998" + inkscape:export-ydpi="67.489998"> + <defs + id="defs2645"> + <linearGradient + id="linearGradient6718"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop6720" /> + <stop + id="stop6724" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3345"> + <stop + id="stop3347" + offset="0" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop3351" /> + <stop + id="stop3355" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3349" /> + </linearGradient> + <linearGradient + id="linearGradient4389"> + <stop + style="stop-color:#555753;stop-opacity:1;" + offset="0" + id="stop4391" /> + <stop + id="stop4393" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient5385" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.0538312,-6.3027391e-8,1.2877417e-8,-0.7232676,-9.0519739,70.961132)" + spreadMethod="pad" + cx="22.276297" + cy="21.099283" + fx="22.276297" + fy="21.099283" + r="20.319138" /> + <linearGradient + id="linearGradient3503"> + <stop + id="stop3505" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop3507" + offset="1" + style="stop-color:#babdb6;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2651" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6516" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6612" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6645" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3503" + id="radialGradient6705" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7451713,-0.7451712,0.5114274,0.5114274,10.506623,78.557248)" + spreadMethod="reflect" + cx="22.276291" + cy="21.520338" + fx="22.276291" + fy="21.520338" + r="20.319138" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6718" + id="radialGradient6716" + gradientUnits="userSpaceOnUse" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" + gradientTransform="matrix(0.8545182,0,0,0.753115,12.273671,16.029579)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6728" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6748" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4389" + id="radialGradient6781" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7191227,0,0,0.7191227,23.696408,18.236608)" + cx="84.365685" + cy="64.927307" + fx="84.365685" + fy="64.927307" + r="22.334578" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="-397.88007" + inkscape:cy="205.69941" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-global="false" + inkscape:window-width="1680" + inkscape:window-height="1028" + inkscape:window-x="20" + inkscape:window-y="20" + showguides="false" + inkscape:guide-bbox="true"> + <inkscape:grid + type="xygrid" + id="grid2653" + visible="true" + enabled="true" + color="#ff00ff" + opacity="0.1254902" + empcolor="#0000f2" + empopacity="0.25098039" /> + <sodipodi:guide + orientation="1,0" + position="23.969062,28.50558" + id="guide3488" /> + <sodipodi:guide + orientation="0,1" + position="17.401268,34.125445" + id="guide3490" /> + </sodipodi:namedview> + <metadata + id="metadata2648"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:subject> + <rdf:Bag> + <rdf:li>audio</rdf:li> + <rdf:li>device</rdf:li> + <rdf:li>subwoofer</rdf:li> + <rdf:li>output</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>audio-subwoofer</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Evangeline McGlynn</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g6770"> + <path + sodipodi:nodetypes="csccc" + id="path3286" + d="M 42.842316,39.045143 C 42.464661,41.471941 41.414441,43.219015 40.17903,43.219015 C 38.935955,43.219015 37.880378,41.450202 37.508794,38.999908 C 37.859301,37.817247 39.174918,37.23702 40.190441,37.271125 C 41.476403,37.203551 42.469629,37.948644 42.842316,39.045143 z" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 11.018985,39.045143 C 10.641329,41.471941 9.5911095,43.219015 8.3556983,43.219015 C 7.1126243,43.219015 6.0570463,41.450202 5.6854623,38.999908 C 6.0359693,37.817247 7.3515863,37.23702 8.3671093,37.271125 C 9.6530715,37.203551 10.646297,37.948644 11.018985,39.045143 z" + id="path3288" + sodipodi:nodetypes="csccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path3264" + d="M 11.578967,6.9788731 C 22.034478,4.1293728 25.918929,4.3517447 36.542557,6.9788731 L 43.942117,13.152471 L 4.1794077,13.152471 L 11.578967,6.9788731 z" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1.28661346;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path3266" + d="M 3.9145768,13.137135 C 16.486736,9.7856746 31.129598,9.8716096 44.071529,13.137135 L 44.014975,39.76734 C 30.802445,42.114593 16.912824,42.159732 3.9711319,39.902758 L 3.9145768,13.137135 z" + style="fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + transform="matrix(0,0.4858156,-0.4858156,0,49.057554,-14.78506)" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + sodipodi:ry="21.396112" + sodipodi:rx="21.396112" + sodipodi:cy="64.927307" + sodipodi:cx="84.365685" + id="path3238" + style="fill:url(#radialGradient6781);fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:2.05839419;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.53625679;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3260" + sodipodi:cx="84.365685" + sodipodi:cy="64.927307" + sodipodi:rx="21.396112" + sodipodi:ry="21.396112" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + transform="matrix(0,0.2827849,-0.2827849,0,53.7183,2.3437637)" /> + <path + transform="matrix(0,0.1973419,-0.1973419,0,48.148923,9.5522206)" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + sodipodi:ry="21.396112" + sodipodi:rx="21.396112" + sodipodi:cy="64.927307" + sodipodi:cx="84.365685" + id="path6518" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:5.06734753;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 4.9461591,13.950789 C 16.44898,10.961669 29.786179,10.935259 43.040609,13.950789 L 42.984059,38.893489 C 29.63547,40.978079 17.006909,41.160879 5.0027091,39.028909 L 4.9461591,13.950789 z" + id="path6561" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:type="arc" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:5.06734753;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path6581" + sodipodi:cx="84.365685" + sodipodi:cy="64.927307" + sodipodi:rx="21.396112" + sodipodi:ry="21.396112" + d="M 105.7618,64.927307 A 21.396112,21.396112 0 1 1 62.969572,64.927307 A 21.396112,21.396112 0 1 1 105.7618,64.927307 z" + transform="matrix(0,0.1973419,-0.1973419,0,30.327733,9.5522212)" /> + </g> + </g> +</svg> diff --git a/panels/sound/data/icons/src/microphone-levels.svg b/panels/sound/data/icons/src/microphone-levels.svg new file mode 100644 index 000000000..c6b7222a0 --- /dev/null +++ b/panels/sound/data/icons/src/microphone-levels.svg @@ -0,0 +1,11448 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="348" + id="svg11300" + inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png" + inkscape:export-xdpi="90.000000" + inkscape:export-ydpi="90.000000" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:version="0.47 r22583" + sodipodi:docname="microphone-levels.svg" + sodipodi:version="0.32" + style="display:inline;enable-background:new" + version="1.0" + width="672"> + <sodipodi:namedview + bordercolor="#666666" + borderopacity="0.25490196" + fill="#f57900" + gridtolerance="12" + guidetolerance="13" + height="300px" + id="base" + inkscape:current-layer="layer2" + inkscape:cx="270.77412" + inkscape:cy="104.07692" + inkscape:document-units="px" + inkscape:grid-bbox="true" + inkscape:guide-bbox="true" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:showpageshadow="false" + inkscape:snap-bbox="true" + inkscape:snap-nodes="false" + inkscape:window-height="876" + inkscape:window-width="968" + inkscape:window-x="132" + inkscape:window-y="8" + inkscape:zoom="1" + objecttolerance="7" + pagecolor="#ffffff" + showgrid="false" + showguides="true" + stroke="#ef2929" + width="400px"> + <inkscape:grid + visible="true" + type="xygrid" + spacingy="0.5px" + spacingx="0.5px" + id="grid5883" + enabled="true" + empspacing="2" + snapvisiblegridlinesonly="true" /> + </sodipodi:namedview> + <title + id="title8836">Optical Drive</title> + <metadata + id="metadata154"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Optical Drive</dc:title> + <dc:creator> + <cc:Agent> + <dc:title /> + </cc:Agent> + </dc:creator> + <dc:contributor> + <cc:Agent> + <dc:title /> + </cc:Agent> + </dc:contributor> + <dc:source /> + <cc:license + rdf:resource="" /> + <dc:subject> + <rdf:Bag /> + </dc:subject> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs3"> + <linearGradient + inkscape:collect="always" + id="linearGradient25422"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient25414"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418" /> + </linearGradient> + <inkscape:path-effect + is_visible="true" + id="path-effect20273" + effect="spiro" /> + <linearGradient + id="linearGradient20265" + inkscape:collect="always"> + <stop + id="stop20267" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop20269" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient20205" + inkscape:collect="always"> + <stop + id="stop20207" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop20209" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient20041" + inkscape:collect="always"> + <stop + id="stop20043" + offset="0" + style="stop-color:#606060;stop-opacity:1;" /> + <stop + id="stop20045" + offset="1" + style="stop-color:#a8a8a8;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient19969"> + <stop + id="stop19971" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop19973" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient13655" + inkscape:collect="always"> + <stop + id="stop13657" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop13659" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient11071" + inkscape:collect="always"> + <stop + id="stop11073" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop11075" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <inkscape:perspective + id="perspective171" + inkscape:persp3d-origin="200 : 100 : 1" + inkscape:vp_z="400 : 150 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 150 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2920"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2922" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop2924" /> + </linearGradient> + <linearGradient + id="linearGradient2904"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop2906" /> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0.21551724" + id="stop2910" /> + <stop + style="stop-color:#c3c4c2;stop-opacity:1;" + offset="0.70243758" + id="stop2912" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop2908" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2877"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2879" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop2881" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2867"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2869" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop2871" /> + </linearGradient> + <linearGradient + id="linearGradient2981"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop2983" /> + <stop + style="stop-color:white;stop-opacity:1" + offset="1" + id="stop2985" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2965"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop2967" /> + <stop + style="stop-color:#888a85;stop-opacity:0;" + offset="1" + id="stop2969" /> + </linearGradient> + <linearGradient + id="linearGradient2943"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop2945" /> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="1" + id="stop2947" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4499"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop4501" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop4503" /> + </linearGradient> + <linearGradient + id="linearGradient4481"> + <stop + style="stop-color:#3e403d;stop-opacity:1" + offset="0" + id="stop4483" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop4485" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4475"> + <stop + style="stop-color:black;stop-opacity:1" + offset="0" + id="stop4477" /> + <stop + style="stop-color:black;stop-opacity:0" + offset="1" + id="stop4479" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4465"> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="0" + id="stop4467" /> + <stop + style="stop-color:#2e3436;stop-opacity:0" + offset="1" + id="stop4469" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3815"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3817" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop3819" /> + </linearGradient> + <linearGradient + id="linearGradient3795"> + <stop + style="stop-color:white;stop-opacity:1" + offset="0" + id="stop3797" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop3799" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3779"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3781" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop3783" /> + </linearGradient> + <linearGradient + id="linearGradient3734"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop3736" /> + <stop + style="stop-color:white;stop-opacity:1" + offset="1" + id="stop3738" /> + </linearGradient> + <linearGradient + id="linearGradient3726"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop3728" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop3730" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3711"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop3713" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop3715" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3703"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3705" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3707" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3579"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3581" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3583" /> + </linearGradient> + <linearGradient + id="linearGradient3228"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3230" /> + <stop + style="stop-color:black;stop-opacity:0.42857143;" + offset="0.06770357" + id="stop3573" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0.29894069" + id="stop3569" /> + <stop + style="stop-color:black;stop-opacity:0.49803922;" + offset="0.77437174" + id="stop3571" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="1" + id="stop3232" /> + </linearGradient> + <linearGradient + y2="10.081399" + y1="10.081399" + xlink:href="#linearGradient3228" + x2="30" + x1="17.999674" + inkscape:collect="always" + id="linearGradient3567" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,3)" /> + <linearGradient + y2="25.991137" + y1="3.4711361" + xlink:href="#linearGradient3579" + x2="28.357954" + x1="20.483149" + inkscape:collect="always" + id="linearGradient3585" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" /> + <radialGradient + xlink:href="#linearGradient3711" + r="13.08399" + inkscape:collect="always" + id="radialGradient3691" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + fy="40.578671" + fx="18.753521" + cy="40.578671" + cx="18.753521" /> + <linearGradient + y2="28.590008" + y1="41.836731" + xlink:href="#linearGradient3703" + x2="27.272261" + x1="23.8125" + inkscape:collect="always" + id="linearGradient3709" + gradientUnits="userSpaceOnUse" /> + <linearGradient + y2="30.421146" + y1="36.722809" + xlink:href="#linearGradient3726" + x2="23.640165" + x1="25.606806" + inkscape:collect="always" + id="linearGradient3732" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" /> + <linearGradient + y2="28.617105" + y1="36.75" + xlink:href="#linearGradient3734" + x2="24.6875" + x1="24.6875" + inkscape:collect="always" + id="linearGradient3740" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" /> + <linearGradient + y2="32.355263" + y1="37.835339" + xlink:href="#linearGradient3779" + x2="29.74268" + x1="23.997437" + inkscape:collect="always" + id="linearGradient3785" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" /> + <linearGradient + y2="19.231655" + y1="18.432873" + xlink:href="#linearGradient3795" + x2="13.567612" + x1="13.567612" + inkscape:collect="always" + id="linearGradient3801" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" /> + <linearGradient + y2="19.231655" + y1="18.432873" + xlink:href="#linearGradient3795" + x2="13.567612" + x1="13.567612" + inkscape:collect="always" + id="linearGradient3805" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(20,-1)" /> + <linearGradient + y2="5.5441942" + y1="13.794194" + xlink:href="#linearGradient4465" + x2="32.864544" + x1="32.864544" + inkscape:collect="always" + id="linearGradient4460" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.25,12.5)" /> + <linearGradient + y2="5.5441942" + y1="13.794194" + xlink:href="#linearGradient4475" + x2="32.864544" + x1="32.864544" + inkscape:collect="always" + id="linearGradient4473" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.25,13.5)" /> + <linearGradient + y2="5.125" + y1="20.814491" + xlink:href="#linearGradient4481" + x2="17.625" + x1="17.625" + inkscape:collect="always" + id="linearGradient4487" + gradientUnits="userSpaceOnUse" /> + <radialGradient + xlink:href="#linearGradient4499" + r="12.59534" + inkscape:collect="always" + id="radialGradient4505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" /> + <linearGradient + y2="20.381033" + y1="16.14632" + xlink:href="#linearGradient2943" + x2="16.65625" + x1="16.65625" + inkscape:collect="always" + id="linearGradient2949" + gradientUnits="userSpaceOnUse" /> + <linearGradient + y2="20.381033" + y1="16.14632" + xlink:href="#linearGradient2943" + x2="16.65625" + x1="16.65625" + inkscape:collect="always" + id="linearGradient2953" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(14,0)" /> + <radialGradient + xlink:href="#linearGradient2965" + r="12.59534" + inkscape:collect="always" + id="radialGradient2971" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" /> + <linearGradient + y2="25.229111" + y1="19.452076" + xlink:href="#linearGradient2981" + x2="21.649811" + x1="23.374121" + inkscape:collect="always" + id="linearGradient2987" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" /> + <radialGradient + xlink:href="#linearGradient4499" + r="12.59534" + inkscape:collect="always" + id="radialGradient3012" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" /> + <linearGradient + y2="10.76408" + y1="10.76408" + xlink:href="#linearGradient2867" + x2="23.176371" + x1="19.583334" + inkscape:collect="always" + id="linearGradient2890" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" /> + <linearGradient + y2="15.94703" + y1="24.761473" + xlink:href="#linearGradient3815" + x2="23.246162" + x1="23.246162" + inkscape:collect="always" + id="linearGradient2892" + gradientUnits="userSpaceOnUse" /> + <linearGradient + y2="10.75" + y1="6.3608937" + xlink:href="#linearGradient2877" + x2="24.508121" + x1="21.961548" + inkscape:collect="always" + id="linearGradient2894" + gradientUnits="userSpaceOnUse" /> + <linearGradient + y2="13.351768" + y1="13.351768" + xlink:href="#linearGradient2904" + x2="30.230837" + x1="18.737373" + inkscape:collect="always" + id="linearGradient2902" + gradientUnits="userSpaceOnUse" /> + <radialGradient + xlink:href="#linearGradient2920" + r="6.46875" + inkscape:collect="always" + id="radialGradient2926" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + fy="10.432782" + fx="22.553526" + cy="10.432782" + cx="22.553526" /> + <linearGradient + y2="5.125" + x2="17.625" + y1="15.314491" + x1="17.375" + gradientUnits="userSpaceOnUse" + id="linearGradient10904" + xlink:href="#linearGradient4481" + inkscape:collect="always" /> + <radialGradient + r="12.59534" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient10966" + xlink:href="#linearGradient4499" + inkscape:collect="always" /> + <radialGradient + r="12.59534" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient10968" + xlink:href="#linearGradient4499" + inkscape:collect="always" /> + <linearGradient + y2="5.5441942" + x2="32.864544" + y1="13.794194" + x1="32.864544" + gradientTransform="translate(-0.25,13.5)" + gradientUnits="userSpaceOnUse" + id="linearGradient10970" + xlink:href="#linearGradient4475" + inkscape:collect="always" /> + <linearGradient + y2="5.5441942" + x2="32.864544" + y1="13.794194" + x1="32.864544" + gradientTransform="translate(-0.25,12.5)" + gradientUnits="userSpaceOnUse" + id="linearGradient10972" + xlink:href="#linearGradient4465" + inkscape:collect="always" /> + <radialGradient + r="13.08399" + fy="40.578671" + fx="18.753521" + cy="40.578671" + cx="18.753521" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + gradientUnits="userSpaceOnUse" + id="radialGradient10974" + xlink:href="#linearGradient3711" + inkscape:collect="always" /> + <radialGradient + r="12.59534" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient10976" + xlink:href="#linearGradient2965" + inkscape:collect="always" /> + <linearGradient + y2="32.355263" + x2="29.74268" + y1="37.835339" + x1="23.997437" + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + gradientUnits="userSpaceOnUse" + id="linearGradient10978" + xlink:href="#linearGradient3779" + inkscape:collect="always" /> + <linearGradient + y2="28.590008" + x2="27.272261" + y1="41.836731" + x1="23.8125" + gradientUnits="userSpaceOnUse" + id="linearGradient10980" + xlink:href="#linearGradient3703" + inkscape:collect="always" /> + <linearGradient + y2="18.992922" + x2="16.365026" + y1="27.198471" + x1="16.396276" + gradientTransform="translate(-0.5837775,-0.800515)" + gradientUnits="userSpaceOnUse" + id="linearGradient10982" + xlink:href="#linearGradient3726" + inkscape:collect="always" /> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="translate(-0.3749995,-0.923861)" + gradientUnits="userSpaceOnUse" + id="linearGradient10984" + xlink:href="#linearGradient3795" + inkscape:collect="always" /> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="translate(18.59884,-0.923861)" + gradientUnits="userSpaceOnUse" + id="linearGradient10986" + xlink:href="#linearGradient3795" + inkscape:collect="always" /> + <linearGradient + y2="25.229111" + x2="21.649811" + y1="19.452076" + x1="23.374121" + gradientTransform="matrix(0.93365598,0,0,0.94630428,0.1070789,1.560429)" + gradientUnits="userSpaceOnUse" + id="linearGradient10988" + xlink:href="#linearGradient2981" + inkscape:collect="always" /> + <linearGradient + y2="20.381033" + x2="16.65625" + y1="16.14632" + x1="16.65625" + gradientTransform="matrix(1.2486592,0,0,1.0113615,11.508715,-0.56075794)" + gradientUnits="userSpaceOnUse" + id="linearGradient10990" + xlink:href="#linearGradient2943" + inkscape:collect="always" /> + <linearGradient + gradientTransform="matrix(0.98788104,0,0,1.0113615,-0.23976961,-0.56075794)" + y2="20.381033" + x2="16.65625" + y1="16.14632" + x1="16.65625" + gradientUnits="userSpaceOnUse" + id="linearGradient10992" + xlink:href="#linearGradient2943" + inkscape:collect="always" /> + <linearGradient + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" + y2="13.351768" + x2="30.230837" + y1="13.351768" + x1="18.737373" + gradientUnits="userSpaceOnUse" + id="linearGradient10994" + xlink:href="#linearGradient2904" + inkscape:collect="always" /> + <linearGradient + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" + y2="5.125" + x2="17.625" + y1="15.314491" + x1="17.375" + gradientUnits="userSpaceOnUse" + id="linearGradient10996" + xlink:href="#linearGradient4481" + inkscape:collect="always" /> + <linearGradient + y2="28.617105" + x2="24.6875" + y1="36.75" + x1="24.6875" + gradientTransform="matrix(1.0625002,0,0,0.76351725,-1.5382359,3.9735816)" + gradientUnits="userSpaceOnUse" + id="linearGradient10998" + xlink:href="#linearGradient3734" + inkscape:collect="always" /> + <linearGradient + y2="10.76408" + x2="23.176371" + y1="10.76408" + x1="19.583334" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + gradientUnits="userSpaceOnUse" + id="linearGradient11000" + xlink:href="#linearGradient2867" + inkscape:collect="always" /> + <linearGradient + y2="15.94703" + x2="23.246162" + y1="24.761473" + x1="23.246162" + gradientUnits="userSpaceOnUse" + id="linearGradient11002" + xlink:href="#linearGradient3815" + inkscape:collect="always" /> + <linearGradient + y2="10.75" + x2="24.508121" + y1="6.3608937" + x1="21.961548" + gradientUnits="userSpaceOnUse" + id="linearGradient11004" + xlink:href="#linearGradient2877" + inkscape:collect="always" /> + <radialGradient + r="6.46875" + fy="10.432782" + fx="22.553526" + cy="10.432782" + cx="22.553526" + gradientTransform="matrix(1.580773,0,0,0.75692381,-14.17818,0.21133448)" + gradientUnits="userSpaceOnUse" + id="radialGradient11006" + xlink:href="#linearGradient2920" + inkscape:collect="always" /> + <linearGradient + y2="25.991137" + x2="28.357954" + y1="3.4711361" + x1="20.483149" + gradientTransform="matrix(0.9517316,0,0,0.94372518,-0.44251773,3.1419782)" + gradientUnits="userSpaceOnUse" + id="linearGradient11008" + xlink:href="#linearGradient3579" + inkscape:collect="always" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective11018" /> + <linearGradient + y2="18.305422" + x2="16.271276" + y1="23.729721" + x1="16.271276" + gradientTransform="translate(-0.5837775,-0.800515)" + gradientUnits="userSpaceOnUse" + id="linearGradient10982-1" + xlink:href="#linearGradient3726-4" + inkscape:collect="always" /> + <linearGradient + id="linearGradient3726-4"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop3728-9" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop3730-2" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4" + id="linearGradient11027" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-13.271278,-18.305421)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective11057" /> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.5,0,75.8125)" + r="1.875" + fy="151.625" + fx="317.625" + cy="151.625" + cx="317.625" + id="radialGradient11077" + xlink:href="#linearGradient11071" + inkscape:collect="always" /> + <linearGradient + y2="23.652916" + x2="9.249608" + y1="23.530848" + x1="14.547704" + gradientTransform="matrix(0,1,-1.8541642,0,56.847505,8.8537229)" + gradientUnits="userSpaceOnUse" + id="linearGradient11083" + xlink:href="#linearGradient3726" + inkscape:collect="always" /> + <linearGradient + y2="23.518084" + x2="12.968358" + y1="23.530848" + x1="14.547704" + gradientTransform="matrix(0,1,-1.8541642,0,56.847505,8.8537229)" + gradientUnits="userSpaceOnUse" + id="linearGradient11093" + xlink:href="#linearGradient3726" + inkscape:collect="always" /> + <linearGradient + y2="18.305422" + x2="16.271276" + y1="23.729721" + x1="16.271276" + gradientTransform="matrix(0.85553658,0,0,0.77385304,0.52441214,2.4879707)" + gradientUnits="userSpaceOnUse" + id="linearGradient13115" + xlink:href="#linearGradient3726-4" + inkscape:collect="always" /> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="translate(-0.3749995,-0.923861)" + gradientUnits="userSpaceOnUse" + id="linearGradient13117" + xlink:href="#linearGradient3795" + inkscape:collect="always" /> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="matrix(0.86359943,0,0,1,16.977403,-0.923861)" + gradientUnits="userSpaceOnUse" + id="linearGradient13119" + xlink:href="#linearGradient3795" + inkscape:collect="always" /> + <linearGradient + y2="25.229111" + x2="21.649811" + y1="19.452076" + x1="23.374121" + gradientTransform="matrix(0.79373266,0,0,0.7916132,1.1565043,3.4403526)" + gradientUnits="userSpaceOnUse" + id="linearGradient13121" + xlink:href="#linearGradient2981" + inkscape:collect="always" /> + <linearGradient + y2="20.381033" + x2="16.65625" + y1="16.14632" + x1="16.65625" + gradientTransform="matrix(0.98788104,0,0,0.98347786,-0.23976961,-0.44878866)" + gradientUnits="userSpaceOnUse" + id="linearGradient13125" + xlink:href="#linearGradient2943" + inkscape:collect="always" /> + <linearGradient + y2="13.351768" + x2="30.230837" + y1="13.351768" + x1="18.737373" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + gradientUnits="userSpaceOnUse" + id="linearGradient13127" + xlink:href="#linearGradient2904" + inkscape:collect="always" /> + <linearGradient + y2="5.125" + x2="17.625" + y1="15.314491" + x1="17.375" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + gradientUnits="userSpaceOnUse" + id="linearGradient13129" + xlink:href="#linearGradient4481" + inkscape:collect="always" /> + <linearGradient + y2="10.76408" + x2="23.176371" + y1="10.76408" + x1="19.583334" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + gradientUnits="userSpaceOnUse" + id="linearGradient13131" + xlink:href="#linearGradient2867" + inkscape:collect="always" /> + <linearGradient + y2="15.94703" + x2="23.246162" + y1="24.761473" + x1="23.246162" + gradientUnits="userSpaceOnUse" + id="linearGradient13133" + xlink:href="#linearGradient3815" + inkscape:collect="always" /> + <linearGradient + y2="10.75" + x2="24.508121" + y1="6.3608937" + x1="21.961548" + gradientUnits="userSpaceOnUse" + id="linearGradient13135" + xlink:href="#linearGradient2877" + inkscape:collect="always" /> + <radialGradient + r="6.46875" + fy="10.432782" + fx="22.553526" + cy="10.432782" + cx="22.553526" + gradientTransform="matrix(1.3831764,0,0,0.73605512,-11.304892,0.24124002)" + gradientUnits="userSpaceOnUse" + id="radialGradient13137" + xlink:href="#linearGradient2920" + inkscape:collect="always" /> + <linearGradient + y2="25.991137" + x2="28.357954" + y1="3.4711361" + x1="20.483149" + gradientTransform="matrix(0.95796767,0,0,0.91036433,-1.6428678,3.1920195)" + gradientUnits="userSpaceOnUse" + id="linearGradient13139" + xlink:href="#linearGradient3579" + inkscape:collect="always" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective13158" /> + <linearGradient + inkscape:collect="always" + id="linearGradient4499-8"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop4501-6" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop4503-4" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4499-8" + r="12.59534" + inkscape:collect="always" + id="radialGradient4505-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" /> + <linearGradient + inkscape:collect="always" + id="linearGradient4465-6"> + <stop + style="stop-color:#2e3436;stop-opacity:1" + offset="0" + id="stop4467-8" /> + <stop + style="stop-color:#2e3436;stop-opacity:0" + offset="1" + id="stop4469-2" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3711-6"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop3713-6" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop3715-7" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2965-7"> + <stop + style="stop-color:#888a85;stop-opacity:1;" + offset="0" + id="stop2967-3" /> + <stop + style="stop-color:#888a85;stop-opacity:0;" + offset="1" + id="stop2969-9" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3779-9"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3781-5" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop3783-3" /> + </linearGradient> + <linearGradient + id="linearGradient3726-0"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop3728-1" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop3730-6" /> + </linearGradient> + <linearGradient + id="linearGradient3795-5"> + <stop + style="stop-color:white;stop-opacity:1" + offset="0" + id="stop3797-0" /> + <stop + style="stop-color:#c1c1c1;stop-opacity:1" + offset="1" + id="stop3799-6" /> + </linearGradient> + <linearGradient + id="linearGradient13206"> + <stop + style="stop-color:white;stop-opacity:1" + offset="0" + id="stop13208" /> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="1" + id="stop13210" /> + </linearGradient> + <linearGradient + id="linearGradient2981-9"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop2983-8" /> + <stop + style="stop-color:white;stop-opacity:1" + offset="1" + id="stop2985-4" /> + </linearGradient> + <linearGradient + id="linearGradient2943-2"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop2945-0" /> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="1" + id="stop2947-4" /> + </linearGradient> + <linearGradient + id="linearGradient13221"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop13223" /> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="1" + id="stop13225" /> + </linearGradient> + <linearGradient + id="linearGradient2904-5"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop2906-7" /> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0.21551724" + id="stop2910-2" /> + <stop + style="stop-color:#c3c4c2;stop-opacity:1;" + offset="0.70243758" + id="stop2912-6" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop2908-9" /> + </linearGradient> + <linearGradient + id="linearGradient4481-3"> + <stop + style="stop-color:#3e403d;stop-opacity:1" + offset="0" + id="stop4483-2" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop4485-8" /> + </linearGradient> + <linearGradient + id="linearGradient3734-1"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop3736-6" /> + <stop + style="stop-color:white;stop-opacity:1" + offset="1" + id="stop3738-0" /> + </linearGradient> + <linearGradient + y2="15.94703" + y1="24.761473" + xlink:href="#linearGradient3815-9" + x2="23.246162" + x1="23.246162" + inkscape:collect="always" + id="linearGradient2892-7" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient3815-9"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3817-7" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop3819-9" /> + </linearGradient> + <linearGradient + y2="10.75" + y1="6.3608937" + xlink:href="#linearGradient2877-7" + x2="24.508121" + x1="21.961548" + inkscape:collect="always" + id="linearGradient2894-7" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2877-7"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2879-9" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop2881-3" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2920-3"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2922-4" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop2924-1" /> + </linearGradient> + <linearGradient + id="linearGradient3228-3"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3230-8" /> + <stop + style="stop-color:black;stop-opacity:0.42857143;" + offset="0.06770357" + id="stop3573-3" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0.29894069" + id="stop3569-6" /> + <stop + style="stop-color:black;stop-opacity:0.49803922;" + offset="0.77437174" + id="stop3571-6" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="1" + id="stop3232-4" /> + </linearGradient> + <linearGradient + y2="25.991137" + y1="3.4711361" + xlink:href="#linearGradient3579-9" + x2="28.357954" + x1="20.483149" + inkscape:collect="always" + id="linearGradient3585-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient3579-9"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3581-9" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3583-0" /> + </linearGradient> + <radialGradient + r="6.46875" + fy="10.432782" + fx="22.553526" + cy="10.432782" + cx="22.553526" + gradientTransform="matrix(7.8522058,0,0,4.7763119,-42.877754,26.136979)" + gradientUnits="userSpaceOnUse" + id="radialGradient13575" + xlink:href="#linearGradient2920-3" + inkscape:collect="always" /> + <linearGradient + y2="28.617105" + x2="24.6875" + y1="36.75" + x1="24.6875" + gradientTransform="matrix(4.9673203,0,0,4.9673203,21.300648,38.398692)" + gradientUnits="userSpaceOnUse" + id="linearGradient13586" + xlink:href="#linearGradient3734-1" + inkscape:collect="always" /> + <linearGradient + gradientTransform="matrix(4.9673203,0,0,4.9673203,21.589798,42.679612)" + y2="13.351768" + x2="30.230837" + y1="13.351768" + x1="18.737373" + gradientUnits="userSpaceOnUse" + id="linearGradient13589" + xlink:href="#linearGradient2904-5" + inkscape:collect="always" /> + <linearGradient + y2="20.381033" + x2="16.65625" + y1="16.14632" + x1="16.65625" + gradientTransform="matrix(2.7646499,0,0,2.196487,129.67901,95.617106)" + gradientUnits="userSpaceOnUse" + id="linearGradient13598" + xlink:href="#linearGradient2943-2" + inkscape:collect="always" /> + <linearGradient + y2="25.229111" + x2="21.649811" + y1="19.452076" + x1="23.374121" + gradientTransform="matrix(4.9673203,0,0,4.6739851,21.589798,50.452937)" + gradientUnits="userSpaceOnUse" + id="linearGradient13601" + xlink:href="#linearGradient2981-9" + inkscape:collect="always" /> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="matrix(4.9673203,0,0,4.7202881,120.9362,46.715632)" + gradientUnits="userSpaceOnUse" + id="linearGradient13604" + xlink:href="#linearGradient3795-5" + inkscape:collect="always" /> + <linearGradient + y2="32.355263" + x2="29.74268" + y1="37.835339" + x1="23.997437" + gradientTransform="matrix(1.5330832,0,0,1.5232424,106.26355,166.38059)" + gradientUnits="userSpaceOnUse" + id="linearGradient13615" + xlink:href="#linearGradient3779-9" + inkscape:collect="always" /> + <linearGradient + y2="5.5441942" + x2="32.864544" + y1="13.794194" + x1="32.864544" + gradientTransform="matrix(4.9673203,0,0,4.1857158,20.347968,125.94353)" + gradientUnits="userSpaceOnUse" + id="linearGradient13620" + xlink:href="#linearGradient4465-6" + inkscape:collect="always" /> + <linearGradient + y2="20.381033" + x2="16.65625" + y1="16.14632" + x1="16.65625" + gradientTransform="matrix(2.6339873,0,0,2.092677,-154.04079,97.485687)" + gradientUnits="userSpaceOnUse" + id="linearGradient13649" + xlink:href="#linearGradient2943-2" + inkscape:collect="always" /> + <radialGradient + r="12.59534" + fy="36.907261" + fx="23.82066" + cy="36.907261" + cx="23.82066" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient13651" + xlink:href="#linearGradient2965-7" + inkscape:collect="always" /> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5836547,0,0,0.81072247,-82.339489,27.071966)" + r="59.41787" + fy="276.92752" + fx="141.0757" + cy="276.92752" + cx="141.0757" + id="radialGradient13661" + xlink:href="#linearGradient13655" + inkscape:collect="always" /> + <radialGradient + r="59.41787" + fy="276.92752" + fx="141.0757" + cy="276.92752" + cx="141.0757" + gradientTransform="matrix(1.5836547,0,0,0.81072247,-82.339489,27.071966)" + gradientUnits="userSpaceOnUse" + id="radialGradient13665" + xlink:href="#linearGradient13655" + inkscape:collect="always" /> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.5672045,-0.00538496,0.00169719,0.80911626,-224.49175,22.131973)" + r="34.296837" + fy="181.54195" + fx="143.04683" + cy="181.54195" + cx="143.04683" + id="radialGradient19975" + xlink:href="#linearGradient19969" + inkscape:collect="always" /> + <clipPath + id="clipPath20033" + clipPathUnits="userSpaceOnUse"> + <rect + y="50.130592" + x="108.51788" + width="69.542503" + style="fill:url(#linearGradient20037);fill-opacity:1;stroke:none" + ry="34.825241" + rx="34.771252" + id="rect20035" + height="119.21573" /> + </clipPath> + <linearGradient + y2="13.351768" + x2="30.230837" + y1="13.351768" + x1="18.737373" + gradientTransform="matrix(4.9673203,0,0,4.9673203,21.589798,42.679612)" + gradientUnits="userSpaceOnUse" + id="linearGradient20037" + xlink:href="#linearGradient2904-5" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="133.52888" + x2="192.89699" + y1="137.15388" + x1="192.90271" + id="linearGradient20047" + xlink:href="#linearGradient20041" + inkscape:collect="always" /> + <clipPath + id="clipPath20059" + clipPathUnits="userSpaceOnUse"> + <rect + y="132.7654" + x="179.02771" + width="17.119282" + style="fill:url(#linearGradient20063);fill-opacity:1;stroke:url(#linearGradient20065);stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + id="rect20061" + height="4.7769966" /> + </clipPath> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="matrix(4.9673203,0,0,4.7202881,120.9362,46.715632)" + gradientUnits="userSpaceOnUse" + id="linearGradient20063" + xlink:href="#linearGradient3795-5" + inkscape:collect="always" /> + <linearGradient + y2="133.52888" + x2="192.89699" + y1="137.15388" + x1="192.90271" + gradientUnits="userSpaceOnUse" + id="linearGradient20065" + xlink:href="#linearGradient20041" + inkscape:collect="always" /> + <linearGradient + y2="19.231655" + x2="13.567612" + y1="18.432873" + x1="13.567612" + gradientTransform="matrix(4.9673203,0,0,4.7202881,120.9362,46.715632)" + gradientUnits="userSpaceOnUse" + id="linearGradient20069" + xlink:href="#linearGradient3795-5" + inkscape:collect="always" /> + <linearGradient + y2="133.52888" + x2="192.89699" + y1="137.15388" + x1="192.90271" + gradientUnits="userSpaceOnUse" + id="linearGradient20071" + xlink:href="#linearGradient20041" + inkscape:collect="always" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective20081" /> + <linearGradient + id="linearGradient3228-3-3"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3230-8-6" /> + <stop + style="stop-color:black;stop-opacity:0.42857143;" + offset="0.06770357" + id="stop3573-3-2" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0.29894069" + id="stop3569-6-8" /> + <stop + style="stop-color:black;stop-opacity:0.49803922;" + offset="0.77437174" + id="stop3571-6-3" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="1" + id="stop3232-4-9" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3228-3-3" + id="linearGradient20093" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2750126,0,0,2.2750126,-40.95023,0)" + x1="17.999674" + y1="10.081399" + x2="30" + y2="10.081399" /> + <clipPath + id="clipPath20163" + clipPathUnits="userSpaceOnUse"> + <rect + height="119.21573" + id="rect20165" + rx="34.771252" + ry="34.825241" + style="fill:none;stroke:#000000;stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + width="69.542503" + x="108.51788" + y="50.130592" /> + </clipPath> + <clipPath + id="clipPath20193" + clipPathUnits="userSpaceOnUse"> + <rect + y="56.130592" + x="-278.98212" + width="69.542503" + style="fill:url(#linearGradient20197);fill-opacity:1;stroke:none" + ry="34.825241" + rx="34.771252" + id="rect20195" + height="119.21573" /> + </clipPath> + <linearGradient + y2="13.351768" + x2="30.230837" + y1="13.351768" + x1="18.737373" + gradientTransform="matrix(4.9673203,0,0,4.9673203,-365.9102,48.679612)" + gradientUnits="userSpaceOnUse" + id="linearGradient20197" + xlink:href="#linearGradient2904-5" + inkscape:collect="always" /> + <linearGradient + y2="85.685379" + x2="14.61547" + y1="85.685379" + x1="-26.835243" + gradientTransform="matrix(1.8870302,0,0,1.8776146,-235.67019,7.1456846)" + gradientUnits="userSpaceOnUse" + id="linearGradient20199" + xlink:href="#linearGradient3228-3-3" + inkscape:collect="always" /> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.99978338,0.02081323,-0.09005515,4.3258853,8.3120531,-320.05743)" + r="34.771252" + fy="92.905838" + fx="-252.0392" + cy="92.905838" + cx="-252.0392" + id="radialGradient20211" + xlink:href="#linearGradient20205" + inkscape:collect="always" /> + <radialGradient + r="13.08399" + fy="38.343433" + fx="19.558981" + cy="38.343433" + cx="19.558981" + gradientTransform="matrix(1.1812972,0,0,0.62268269,-3.4824832,13.649379)" + gradientUnits="userSpaceOnUse" + id="radialGradient20239" + xlink:href="#linearGradient3711-6" + inkscape:collect="always" /> + <clipPath + id="clipPath20245" + clipPathUnits="userSpaceOnUse"> + <path + d="m 36.415999,36.907261 a 12.59534,6.4081554 0 1 1 -25.190679,0 12.59534,6.4081554 0 1 1 25.190679,0 z" + id="path20247" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" /> + </clipPath> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.3491052,0,0,1.1951588,-32.399717,-15.770463)" + r="12.59534" + fy="49.389561" + fx="24.015709" + cy="49.389561" + cx="24.015709" + id="radialGradient20271" + xlink:href="#linearGradient20265" + inkscape:collect="always" /> + <linearGradient + y2="5.5441942" + x2="32.864544" + y1="13.794194" + x1="32.864544" + gradientTransform="matrix(4.9673203,0,0,4.1857158,20.347968,126.94353)" + gradientUnits="userSpaceOnUse" + id="linearGradient20277" + xlink:href="#linearGradient4465-6" + inkscape:collect="always" /> + <linearGradient + y2="30.421146" + x2="23.640165" + y1="36.722809" + x1="25.606806" + gradientTransform="matrix(4.8418564,0,0,5.4752157,24.446802,19.661954)" + gradientUnits="userSpaceOnUse" + id="linearGradient20291" + xlink:href="#linearGradient3726-0" + inkscape:collect="always" /> + <inkscape:perspective + id="perspective13771" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient3726-4-1"> + <stop + id="stop3728-9-8" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-2-5" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient3795-9"> + <stop + id="stop3797-07" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop3799-60" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient13784"> + <stop + id="stop13786" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop13788" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2981-3"> + <stop + id="stop2983-2" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop2985-7" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient2943-7"> + <stop + id="stop2945-1" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop2947-3" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2904-7"> + <stop + id="stop2906-6" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop2910-3" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2912-9" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop2908-6" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient4481-5"> + <stop + id="stop4483-9" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop4485-81" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient2867-5" + inkscape:collect="always"> + <stop + id="stop2869-3" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2871-8" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3815-7" + inkscape:collect="always"> + <stop + id="stop3817-73" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3819-4" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2877-5" + inkscape:collect="always"> + <stop + id="stop2879-5" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2881-5" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2920-9" + inkscape:collect="always"> + <stop + id="stop2922-3" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2924-9" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3579-6" + inkscape:collect="always"> + <stop + id="stop3581-4" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3583-1" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0" + id="radialGradient10966-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient4499-0" + inkscape:collect="always"> + <stop + id="stop4501-7" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop4503-6" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8" + id="linearGradient10982-6" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.396276" + y1="27.198471" + x2="16.365026" + y2="18.992922" /> + <linearGradient + id="linearGradient3726-8"> + <stop + id="stop3728-16" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-8" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient13837"> + <stop + id="stop13839" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop13841" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient13844"> + <stop + id="stop13846" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop13848" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient10986-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(18.59884,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient13851"> + <stop + id="stop13853" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop13855" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3" + id="linearGradient10988-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.93365598,0,0,0.94630428,0.1070789,1.560429)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient13858"> + <stop + id="stop13860" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop13862" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7" + id="linearGradient10990-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2486592,0,0,1.0113615,11.508715,-0.56075794)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient13865"> + <stop + id="stop13867" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop13869" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7" + id="linearGradient10992-5" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" + gradientTransform="matrix(0.98788104,0,0,1.0113615,-0.23976961,-0.56075794)" /> + <linearGradient + id="linearGradient13872"> + <stop + id="stop13874" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop13876" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7" + id="linearGradient10994-5" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient13879"> + <stop + id="stop13881" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop13883" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop13885" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop13887" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5" + id="linearGradient10996-1" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient13890"> + <stop + id="stop13892" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop13894" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5" + id="linearGradient11000-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7" + id="linearGradient11002-1" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5" + id="linearGradient11004-7" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9" + id="radialGradient11006-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.75692381,-14.17818,0.21133448)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6" + id="linearGradient11008-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9517316,0,0,0.94372518,-0.44251773,3.1419782)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8" + id="linearGradient11093-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0,1,-1.8541642,0,56.847505,8.8537229)" + x1="14.547704" + y1="23.530848" + x2="12.968358" + y2="23.518084" /> + <linearGradient + id="linearGradient13932"> + <stop + id="stop13934" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop13936" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7" + id="linearGradient10998-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0625002,0,0,0.76351725,-1.5382359,3.9735816)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient3734-7"> + <stop + id="stop3736-7" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3738-3" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient3012-3" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient4505-3" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0" /> + <linearGradient + id="linearGradient4475-7" + inkscape:collect="always"> + <stop + id="stop4477-8" + offset="0" + style="stop-color:black;stop-opacity:1" /> + <stop + id="stop4479-9" + offset="1" + style="stop-color:black;stop-opacity:0" /> + </linearGradient> + <linearGradient + id="linearGradient4465-4" + inkscape:collect="always"> + <stop + id="stop4467-6" + offset="0" + style="stop-color:#2e3436;stop-opacity:1" /> + <stop + id="stop4469-4" + offset="1" + style="stop-color:#2e3436;stop-opacity:0" /> + </linearGradient> + <radialGradient + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + gradientUnits="userSpaceOnUse" + id="radialGradient3691-5" + inkscape:collect="always" + r="13.08399" + xlink:href="#linearGradient3711-4" /> + <linearGradient + id="linearGradient3711-4" + inkscape:collect="always"> + <stop + id="stop3713-2" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3715-0" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient2965-77" + inkscape:collect="always"> + <stop + id="stop2967-5" + offset="0" + style="stop-color:#888a85;stop-opacity:1;" /> + <stop + id="stop2969-4" + offset="1" + style="stop-color:#888a85;stop-opacity:0;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + gradientUnits="userSpaceOnUse" + id="linearGradient3785-4" + inkscape:collect="always" + x1="23.997437" + x2="29.74268" + xlink:href="#linearGradient3779-6" + y1="37.835339" + y2="32.355263" /> + <linearGradient + id="linearGradient3779-6" + inkscape:collect="always"> + <stop + id="stop3781-56" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3783-5" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient11071-4" + id="radialGradient11077-1" + cx="317.625" + cy="151.625" + fx="317.625" + fy="151.625" + r="1.875" + gradientTransform="matrix(1,0,0,0.5,0,75.8125)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient11071-4"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop11073-9" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop11075-5" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient3709-2" + inkscape:collect="always" + x1="23.8125" + x2="27.272261" + xlink:href="#linearGradient3703-7" + y1="41.836731" + y2="28.590008" /> + <linearGradient + id="linearGradient3703-7" + inkscape:collect="always"> + <stop + id="stop3705-1" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3707-7" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3732-0" + inkscape:collect="always" + x1="25.606806" + x2="23.640165" + xlink:href="#linearGradient3726-8" + y1="36.722809" + y2="30.421146" /> + <linearGradient + id="linearGradient13985"> + <stop + id="stop13987" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop13989" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient13992"> + <stop + id="stop13994" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop13996" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(20,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3805-6" + inkscape:collect="always" + x1="13.567612" + x2="13.567612" + xlink:href="#linearGradient3795-9" + y1="18.432873" + y2="19.231655" /> + <linearGradient + id="linearGradient13999"> + <stop + id="stop14001" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop14003" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + gradientUnits="userSpaceOnUse" + id="linearGradient2987-1" + inkscape:collect="always" + x1="23.374121" + x2="21.649811" + xlink:href="#linearGradient2981-3" + y1="19.452076" + y2="25.229111" /> + <linearGradient + id="linearGradient14006"> + <stop + id="stop14008" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop14010" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(14,0)" + gradientUnits="userSpaceOnUse" + id="linearGradient2953-0" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient14013"> + <stop + id="stop14015" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop14017" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2949-2" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient14020"> + <stop + id="stop14022" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop14024" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2902-5" + inkscape:collect="always" + x1="18.737373" + x2="30.230837" + xlink:href="#linearGradient2904-7" + y1="13.351768" + y2="13.351768" /> + <linearGradient + id="linearGradient14027"> + <stop + id="stop14029" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop14031" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop14033" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop14035" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5" + id="linearGradient10904-8" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient14038"> + <stop + id="stop14040" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop14042" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient14045"> + <stop + id="stop14047" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop14049" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + gradientUnits="userSpaceOnUse" + id="linearGradient2890-3" + inkscape:collect="always" + x1="19.583334" + x2="23.176371" + xlink:href="#linearGradient2867-5" + y1="10.76408" + y2="10.76408" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2892-2" + inkscape:collect="always" + x1="23.246162" + x2="23.246162" + xlink:href="#linearGradient3815-7" + y1="24.761473" + y2="15.94703" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2894-0" + inkscape:collect="always" + x1="21.961548" + x2="24.508121" + xlink:href="#linearGradient2877-5" + y1="6.3608937" + y2="10.75" /> + <radialGradient + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + gradientUnits="userSpaceOnUse" + id="radialGradient2926-3" + inkscape:collect="always" + r="6.46875" + xlink:href="#linearGradient2920-9" /> + <linearGradient + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + gradientUnits="userSpaceOnUse" + id="linearGradient3585-1" + inkscape:collect="always" + x1="20.483149" + x2="28.357954" + xlink:href="#linearGradient3579-6" + y1="3.4711361" + y2="25.991137" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient14086" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient14094" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0" /> + <linearGradient + gradientTransform="translate(-0.25,13.5)" + gradientUnits="userSpaceOnUse" + id="linearGradient14102" + inkscape:collect="always" + x1="32.864544" + x2="32.864544" + xlink:href="#linearGradient4475-7" + y1="13.794194" + y2="5.5441942" /> + <linearGradient + gradientTransform="translate(-0.25,12.5)" + gradientUnits="userSpaceOnUse" + id="linearGradient14110" + inkscape:collect="always" + x1="32.864544" + x2="32.864544" + xlink:href="#linearGradient4465-4" + y1="13.794194" + y2="5.5441942" /> + <radialGradient + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + gradientUnits="userSpaceOnUse" + id="radialGradient14118" + inkscape:collect="always" + r="13.08399" + xlink:href="#linearGradient3711-4" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient14126" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient2965-77" /> + <linearGradient + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + gradientUnits="userSpaceOnUse" + id="linearGradient14134" + inkscape:collect="always" + x1="23.997437" + x2="29.74268" + xlink:href="#linearGradient3779-6" + y1="37.835339" + y2="32.355263" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient14142" + inkscape:collect="always" + x1="23.8125" + x2="27.272261" + xlink:href="#linearGradient3703-7" + y1="41.836731" + y2="28.590008" /> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient14150" + inkscape:collect="always" + x1="25.606806" + x2="23.640165" + xlink:href="#linearGradient3726-8" + y1="36.722809" + y2="30.421146" /> + <linearGradient + id="linearGradient14152"> + <stop + id="stop14154" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop14156" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient14158" + inkscape:collect="always" + x1="13.567612" + x2="13.567612" + xlink:href="#linearGradient3795-9" + y1="18.432873" + y2="19.231655" /> + <linearGradient + id="linearGradient14160"> + <stop + id="stop14162" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop14164" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(20,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient14166" + inkscape:collect="always" + x1="13.567612" + x2="13.567612" + xlink:href="#linearGradient3795-9" + y1="18.432873" + y2="19.231655" /> + <linearGradient + id="linearGradient14168"> + <stop + id="stop14170" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop14172" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + gradientUnits="userSpaceOnUse" + id="linearGradient14174" + inkscape:collect="always" + x1="23.374121" + x2="21.649811" + xlink:href="#linearGradient2981-3" + y1="19.452076" + y2="25.229111" /> + <linearGradient + id="linearGradient14176"> + <stop + id="stop14178" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop14180" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(14,0)" + gradientUnits="userSpaceOnUse" + id="linearGradient14182" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient14184"> + <stop + id="stop14186" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop14188" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient14190" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient14192"> + <stop + id="stop14194" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop14196" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient14198" + inkscape:collect="always" + x1="18.737373" + x2="30.230837" + xlink:href="#linearGradient2904-7" + y1="13.351768" + y2="13.351768" /> + <linearGradient + id="linearGradient14200"> + <stop + id="stop14202" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop14204" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop14206" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop14208" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient4487-9" + inkscape:collect="always" + x1="17.625" + x2="17.625" + xlink:href="#linearGradient4481-5" + y1="20.814491" + y2="5.125" /> + <linearGradient + id="linearGradient14211"> + <stop + id="stop14213" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop14215" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient14217" + inkscape:collect="always" + x1="24.6875" + x2="24.6875" + xlink:href="#linearGradient3734-7" + y1="36.75" + y2="28.617105" /> + <linearGradient + id="linearGradient14219"> + <stop + id="stop14221" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop14223" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + gradientUnits="userSpaceOnUse" + id="linearGradient14225" + inkscape:collect="always" + x1="19.583334" + x2="23.176371" + xlink:href="#linearGradient2867-5" + y1="10.76408" + y2="10.76408" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient14233" + inkscape:collect="always" + x1="23.246162" + x2="23.246162" + xlink:href="#linearGradient3815-7" + y1="24.761473" + y2="15.94703" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient14241" + inkscape:collect="always" + x1="21.961548" + x2="24.508121" + xlink:href="#linearGradient2877-5" + y1="6.3608937" + y2="10.75" /> + <radialGradient + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + gradientUnits="userSpaceOnUse" + id="radialGradient14249" + inkscape:collect="always" + r="6.46875" + xlink:href="#linearGradient2920-9" /> + <linearGradient + gradientTransform="translate(0,3)" + gradientUnits="userSpaceOnUse" + id="linearGradient3567-2" + inkscape:collect="always" + x1="17.999674" + x2="30" + xlink:href="#linearGradient3228-6" + y1="10.081399" + y2="10.081399" /> + <linearGradient + id="linearGradient3228-6"> + <stop + id="stop3230-6" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3573-7" + offset="0.06770357" + style="stop-color:black;stop-opacity:0.42857143;" /> + <stop + id="stop3569-4" + offset="0.29894069" + style="stop-color:black;stop-opacity:0;" /> + <stop + id="stop3571-1" + offset="0.77437174" + style="stop-color:black;stop-opacity:0.49803922;" /> + <stop + id="stop3232-3" + offset="1" + style="stop-color:black;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + gradientUnits="userSpaceOnUse" + id="linearGradient14264" + inkscape:collect="always" + x1="20.483149" + x2="28.357954" + xlink:href="#linearGradient3579-6" + y1="3.4711361" + y2="25.991137" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0" + id="radialGradient16183" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0" + id="radialGradient16185" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3711-4" + id="radialGradient16191" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + r="13.08399" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77" + id="radialGradient16193" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3779-6" + id="linearGradient16195" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + x1="23.997437" + y1="37.835339" + x2="29.74268" + y2="32.355263" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3703-7" + id="linearGradient16197" + gradientUnits="userSpaceOnUse" + x1="23.8125" + y1="41.836731" + x2="27.272261" + y2="28.590008" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8" + id="linearGradient16199" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="25.606806" + y1="36.722809" + x2="23.640165" + y2="30.421146" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient16201" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient16203" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(20,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3" + id="linearGradient16205" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7" + id="linearGradient16207" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(14,0)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7" + id="linearGradient16209" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7" + id="linearGradient16211" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7" + id="linearGradient16213" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5" + id="linearGradient16215" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7" + id="linearGradient16217" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5" + id="linearGradient16219" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9" + id="radialGradient16221" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6" + id="linearGradient16223" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77" + id="radialGradient16225" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient16227" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7" + id="linearGradient16229" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6" + id="linearGradient16231" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1" + id="linearGradient16233" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient16235" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <inkscape:perspective + id="perspective16278" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-3" + id="radialGradient16183-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient4499-0-3" + inkscape:collect="always"> + <stop + id="stop4501-7-4" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop4503-6-1" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-3" + id="radialGradient16185-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3711-4-6" + id="radialGradient16191-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + r="13.08399" /> + <linearGradient + id="linearGradient3711-4-6" + inkscape:collect="always"> + <stop + id="stop3713-2-8" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3715-0-7" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77-1" + id="radialGradient16193-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient2965-77-1" + inkscape:collect="always"> + <stop + id="stop2967-5-9" + offset="0" + style="stop-color:#888a85;stop-opacity:1;" /> + <stop + id="stop2969-4-3" + offset="1" + style="stop-color:#888a85;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3779-6-3" + id="linearGradient16195-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + x1="23.997437" + y1="37.835339" + x2="29.74268" + y2="32.355263" /> + <linearGradient + id="linearGradient3779-6-3" + inkscape:collect="always"> + <stop + id="stop3781-56-9" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3783-5-4" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3703-7-5" + id="linearGradient16197-2" + gradientUnits="userSpaceOnUse" + x1="23.8125" + y1="41.836731" + x2="27.272261" + y2="28.590008" /> + <linearGradient + id="linearGradient3703-7-5" + inkscape:collect="always"> + <stop + id="stop3705-1-9" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3707-7-4" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-8" + id="linearGradient16199-1" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="25.606806" + y1="36.722809" + x2="23.640165" + y2="30.421146" /> + <linearGradient + id="linearGradient3726-8-8"> + <stop + id="stop3728-16-4" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-8-1" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient16201-7" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient3795-9-7"> + <stop + id="stop3797-07-9" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop3799-60-4" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient16203-0" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(20,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient16318"> + <stop + id="stop16320" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16322" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-7" + id="linearGradient16205-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient2981-3-7"> + <stop + id="stop2983-2-5" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop2985-7-4" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-9" + id="linearGradient16207-0" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(14,0)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient2943-7-9"> + <stop + id="stop2945-1-2" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop2947-3-8" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-9" + id="linearGradient16209-0" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient16333"> + <stop + id="stop16335" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16337" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-3" + id="linearGradient16211-0" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + id="linearGradient2904-7-3"> + <stop + id="stop2906-6-1" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop2910-3-1" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2912-9-6" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop2908-6-2" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient4487-9-6" + inkscape:collect="always" + x1="17.625" + x2="17.625" + xlink:href="#linearGradient4481-5-6" + y1="20.814491" + y2="5.125" /> + <linearGradient + id="linearGradient4481-5-6"> + <stop + id="stop4483-9-6" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop4485-81-8" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-7" + id="linearGradient16213-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient3734-7-7"> + <stop + id="stop3736-7-5" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3738-3-4" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-1" + id="linearGradient16215-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + id="linearGradient2867-5-1" + inkscape:collect="always"> + <stop + id="stop2869-3-7" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2871-8-3" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-9" + id="linearGradient16217-8" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + id="linearGradient3815-7-9" + inkscape:collect="always"> + <stop + id="stop3817-73-9" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3819-4-9" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-8" + id="linearGradient16219-9" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <linearGradient + id="linearGradient2877-5-8" + inkscape:collect="always"> + <stop + id="stop2879-5-6" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2881-5-3" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-8" + id="radialGradient16221-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + id="linearGradient2920-9-8" + inkscape:collect="always"> + <stop + id="stop2922-3-6" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2924-9-6" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0,3)" + gradientUnits="userSpaceOnUse" + id="linearGradient3567-2-8" + inkscape:collect="always" + x1="17.999674" + x2="30" + xlink:href="#linearGradient3228-6-8" + y1="10.081399" + y2="10.081399" /> + <linearGradient + id="linearGradient3228-6-8"> + <stop + id="stop3230-6-2" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3573-7-1" + offset="0.06770357" + style="stop-color:black;stop-opacity:0.42857143;" /> + <stop + id="stop3569-4-1" + offset="0.29894069" + style="stop-color:black;stop-opacity:0;" /> + <stop + id="stop3571-1-8" + offset="0.77437174" + style="stop-color:black;stop-opacity:0.49803922;" /> + <stop + id="stop3232-3-3" + offset="1" + style="stop-color:black;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-6" + id="linearGradient16223-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + id="linearGradient3579-6-6" + inkscape:collect="always"> + <stop + id="stop3581-4-0" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3583-1-8" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient3012-3-0" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0-3" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient4505-3-7" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0-3" /> + <radialGradient + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + gradientUnits="userSpaceOnUse" + id="radialGradient3691-5-3" + inkscape:collect="always" + r="13.08399" + xlink:href="#linearGradient3711-4-6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77-1" + id="radialGradient16225-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + gradientUnits="userSpaceOnUse" + id="linearGradient3785-4-5" + inkscape:collect="always" + x1="23.997437" + x2="29.74268" + xlink:href="#linearGradient3779-6-3" + y1="37.835339" + y2="32.355263" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient11071-4-6" + id="radialGradient11077-1-5" + cx="317.625" + cy="151.625" + fx="317.625" + fy="151.625" + r="1.875" + gradientTransform="matrix(1,0,0,0.5,0,75.8125)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient11071-4-6"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop11073-9-9" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop11075-5-3" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient3709-2-5" + inkscape:collect="always" + x1="23.8125" + x2="27.272261" + xlink:href="#linearGradient3703-7-5" + y1="41.836731" + y2="28.590008" /> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3732-0-0" + inkscape:collect="always" + x1="25.606806" + x2="23.640165" + xlink:href="#linearGradient3726-8-8" + y1="36.722809" + y2="30.421146" /> + <linearGradient + id="linearGradient16427"> + <stop + id="stop16429" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16431" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient16227-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient16434"> + <stop + id="stop16436" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16438" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(20,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3805-6-4" + inkscape:collect="always" + x1="13.567612" + x2="13.567612" + xlink:href="#linearGradient3795-9-7" + y1="18.432873" + y2="19.231655" /> + <linearGradient + id="linearGradient16441"> + <stop + id="stop16443" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16445" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + gradientUnits="userSpaceOnUse" + id="linearGradient2987-1-9" + inkscape:collect="always" + x1="23.374121" + x2="21.649811" + xlink:href="#linearGradient2981-3-7" + y1="19.452076" + y2="25.229111" /> + <linearGradient + id="linearGradient16448"> + <stop + id="stop16450" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop16452" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(14,0)" + gradientUnits="userSpaceOnUse" + id="linearGradient2953-0-3" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7-9" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient16455"> + <stop + id="stop16457" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16459" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2949-2-7" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7-9" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient16462"> + <stop + id="stop16464" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16466" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2902-5-7" + inkscape:collect="always" + x1="18.737373" + x2="30.230837" + xlink:href="#linearGradient2904-7-3" + y1="13.351768" + y2="13.351768" /> + <linearGradient + id="linearGradient16469"> + <stop + id="stop16471" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop16473" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop16475" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop16477" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-6" + id="linearGradient10904-8-1" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient16480"> + <stop + id="stop16482" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop16484" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-7" + id="linearGradient16229-5" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient16487"> + <stop + id="stop16489" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop16491" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + gradientUnits="userSpaceOnUse" + id="linearGradient2890-3-6" + inkscape:collect="always" + x1="19.583334" + x2="23.176371" + xlink:href="#linearGradient2867-5-1" + y1="10.76408" + y2="10.76408" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2892-2-9" + inkscape:collect="always" + x1="23.246162" + x2="23.246162" + xlink:href="#linearGradient3815-7-9" + y1="24.761473" + y2="15.94703" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2894-0-3" + inkscape:collect="always" + x1="21.961548" + x2="24.508121" + xlink:href="#linearGradient2877-5-8" + y1="6.3608937" + y2="10.75" /> + <radialGradient + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + gradientUnits="userSpaceOnUse" + id="radialGradient2926-3-8" + inkscape:collect="always" + r="6.46875" + xlink:href="#linearGradient2920-9-8" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-6" + id="linearGradient16231-0" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-3" + id="radialGradient10966-5-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-8" + id="linearGradient10982-6-8" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.396276" + y1="27.198471" + x2="16.365026" + y2="18.992922" /> + <linearGradient + id="linearGradient16536"> + <stop + id="stop16538" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16540" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1-5" + id="linearGradient16233-6" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + id="linearGradient3726-4-1-5"> + <stop + id="stop3728-9-8-5" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-2-5-8" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient16235-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient16547"> + <stop + id="stop16549" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16551" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient10986-3-5" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(18.59884,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient16554"> + <stop + id="stop16556" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16558" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-7" + id="linearGradient10988-7-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.93365598,0,0,0.94630428,0.1070789,1.560429)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient16561"> + <stop + id="stop16563" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop16565" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-9" + id="linearGradient10990-3-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2486592,0,0,1.0113615,11.508715,-0.56075794)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient16568"> + <stop + id="stop16570" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16572" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-9" + id="linearGradient10992-5-1" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" + gradientTransform="matrix(0.98788104,0,0,1.0113615,-0.23976961,-0.56075794)" /> + <linearGradient + id="linearGradient16575"> + <stop + id="stop16577" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16579" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-3" + id="linearGradient10994-5-3" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient16582"> + <stop + id="stop16584" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop16586" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop16588" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop16590" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-6" + id="linearGradient10996-1-4" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient16593"> + <stop + id="stop16595" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop16597" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-1" + id="linearGradient11000-8-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-9" + id="linearGradient11002-1-4" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-8" + id="linearGradient11004-7-9" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-8" + id="radialGradient11006-6-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.75692381,-14.17818,0.21133448)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-6" + id="linearGradient11008-8-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9517316,0,0,0.94372518,-0.44251773,3.1419782)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-8" + id="linearGradient11093-2-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0,1,-1.8541642,0,56.847505,8.8537229)" + x1="14.547704" + y1="23.530848" + x2="12.968358" + y2="23.518084" /> + <linearGradient + id="linearGradient16635"> + <stop + id="stop16637" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16639" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-7" + id="linearGradient10998-4-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0625002,0,0,0.76351725,-1.5382359,3.9735816)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient16642"> + <stop + id="stop16644" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop16646" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1-5" + id="linearGradient16237-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.85553658,0,0,0.77385304,0.52441214,2.4879707)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + id="linearGradient16649"> + <stop + id="stop16651" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16653" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient16239-9" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient16656"> + <stop + id="stop16658" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16660" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-7" + id="linearGradient13119-0-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.86359943,0,0,1,16.977403,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient16663"> + <stop + id="stop16665" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop16667" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-7" + id="linearGradient13121-7-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.79373266,0,0,0.7916132,1.1565043,3.4403526)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient16670"> + <stop + id="stop16672" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop16674" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-9" + id="linearGradient13125-0-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.98788104,0,0,0.98347786,-0.23976961,-0.44878866)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient16677"> + <stop + id="stop16679" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop16681" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-3" + id="linearGradient13127-3-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + id="linearGradient16684"> + <stop + id="stop16686" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop16688" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop16690" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop16692" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-6" + id="linearGradient13129-9-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient16695"> + <stop + id="stop16697" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop16699" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-1" + id="linearGradient13131-7-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-9" + id="linearGradient13133-0-9" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-8" + id="linearGradient13135-6-1" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-8" + id="radialGradient13137-8-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3831764,0,0,0.73605512,-11.304892,0.24124002)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-6" + id="linearGradient13139-6-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.95796767,0,0,0.91036433,-1.6428678,3.1920195)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1" + id="linearGradient17466" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.85553658,0,0,0.77385304,0.52441214,2.4879707)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient17468" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9" + id="linearGradient17470" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.86359943,0,0,1,16.977403,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3" + id="linearGradient17472" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.79373266,0,0,0.7916132,1.1565043,3.4403526)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7" + id="linearGradient17474" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.98788104,0,0,0.98347786,-0.23976961,-0.44878866)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7" + id="linearGradient17476" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5" + id="linearGradient17478" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5" + id="linearGradient17480" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7" + id="linearGradient17482" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5" + id="linearGradient17484" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9" + id="radialGradient17486" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3831764,0,0,0.73605512,-11.304892,0.24124002)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6" + id="linearGradient17488" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.95796767,0,0,0.91036433,-1.6428678,3.1920195)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <inkscape:perspective + id="perspective17506" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-0" + id="radialGradient16183-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient4499-0-0" + inkscape:collect="always"> + <stop + id="stop4501-7-6" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop4503-6-3" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-0" + id="radialGradient16185-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3711-4-5" + id="radialGradient16191-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + r="13.08399" /> + <linearGradient + id="linearGradient3711-4-5" + inkscape:collect="always"> + <stop + id="stop3713-2-4" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3715-0-77" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77-5" + id="radialGradient16193-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient2965-77-5" + inkscape:collect="always"> + <stop + id="stop2967-5-6" + offset="0" + style="stop-color:#888a85;stop-opacity:1;" /> + <stop + id="stop2969-4-9" + offset="1" + style="stop-color:#888a85;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3779-6-7" + id="linearGradient16195-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + x1="23.997437" + y1="37.835339" + x2="29.74268" + y2="32.355263" /> + <linearGradient + id="linearGradient3779-6-7" + inkscape:collect="always"> + <stop + id="stop3781-56-6" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3783-5-47" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3703-7-4" + id="linearGradient16197-4" + gradientUnits="userSpaceOnUse" + x1="23.8125" + y1="41.836731" + x2="27.272261" + y2="28.590008" /> + <linearGradient + id="linearGradient3703-7-4" + inkscape:collect="always"> + <stop + id="stop3705-1-6" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3707-7-3" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-6" + id="linearGradient16199-9" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="25.606806" + y1="36.722809" + x2="23.640165" + y2="30.421146" /> + <linearGradient + id="linearGradient3726-8-6"> + <stop + id="stop3728-16-2" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-8-3" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient16201-0" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient3795-9-1"> + <stop + id="stop3797-07-6" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop3799-60-6" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient16203-1" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(20,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17546"> + <stop + id="stop17548" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17550" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-4" + id="linearGradient16205-85" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient2981-3-4"> + <stop + id="stop2983-2-51" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop2985-7-1" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-1" + id="linearGradient16207-1" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(14,0)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient2943-7-1"> + <stop + id="stop2945-1-9" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop2947-3-3" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-1" + id="linearGradient16209-6" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient17561"> + <stop + id="stop17563" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17565" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-2" + id="linearGradient16211-7" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + id="linearGradient2904-7-2"> + <stop + id="stop2906-6-4" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop2910-3-4" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2912-9-1" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop2908-6-9" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient4487-9-1" + inkscape:collect="always" + x1="17.625" + x2="17.625" + xlink:href="#linearGradient4481-5-5" + y1="20.814491" + y2="5.125" /> + <linearGradient + id="linearGradient4481-5-5"> + <stop + id="stop4483-9-5" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop4485-81-0" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-6" + id="linearGradient16213-1" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient3734-7-6"> + <stop + id="stop3736-7-6" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3738-3-5" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-7" + id="linearGradient16215-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + id="linearGradient2867-5-7" + inkscape:collect="always"> + <stop + id="stop2869-3-6" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2871-8-7" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-96" + id="linearGradient16217-3" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + id="linearGradient3815-7-96" + inkscape:collect="always"> + <stop + id="stop3817-73-8" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3819-4-5" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-2" + id="linearGradient16219-3" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <linearGradient + id="linearGradient2877-5-2" + inkscape:collect="always"> + <stop + id="stop2879-5-7" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2881-5-6" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-81" + id="radialGradient16221-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + id="linearGradient2920-9-81" + inkscape:collect="always"> + <stop + id="stop2922-3-3" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2924-9-5" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0,3)" + gradientUnits="userSpaceOnUse" + id="linearGradient3567-2-3" + inkscape:collect="always" + x1="17.999674" + x2="30" + xlink:href="#linearGradient3228-6-89" + y1="10.081399" + y2="10.081399" /> + <linearGradient + id="linearGradient3228-6-89"> + <stop + id="stop3230-6-6" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3573-7-9" + offset="0.06770357" + style="stop-color:black;stop-opacity:0.42857143;" /> + <stop + id="stop3569-4-2" + offset="0.29894069" + style="stop-color:black;stop-opacity:0;" /> + <stop + id="stop3571-1-2" + offset="0.77437174" + style="stop-color:black;stop-opacity:0.49803922;" /> + <stop + id="stop3232-3-4" + offset="1" + style="stop-color:black;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-5" + id="linearGradient16223-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + id="linearGradient3579-6-5" + inkscape:collect="always"> + <stop + id="stop3581-4-1" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3583-1-9" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient3012-3-2" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0-0" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient4505-3-2" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0-0" /> + <radialGradient + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + gradientUnits="userSpaceOnUse" + id="radialGradient3691-5-6" + inkscape:collect="always" + r="13.08399" + xlink:href="#linearGradient3711-4-5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77-5" + id="radialGradient16225-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + gradientUnits="userSpaceOnUse" + id="linearGradient3785-4-0" + inkscape:collect="always" + x1="23.997437" + x2="29.74268" + xlink:href="#linearGradient3779-6-7" + y1="37.835339" + y2="32.355263" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient11071-4-0" + id="radialGradient11077-1-1" + cx="317.625" + cy="151.625" + fx="317.625" + fy="151.625" + r="1.875" + gradientTransform="matrix(1,0,0,0.5,0,75.8125)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient11071-4-0"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop11073-9-8" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop11075-5-2" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient3709-2-6" + inkscape:collect="always" + x1="23.8125" + x2="27.272261" + xlink:href="#linearGradient3703-7-4" + y1="41.836731" + y2="28.590008" /> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3732-0-3" + inkscape:collect="always" + x1="25.606806" + x2="23.640165" + xlink:href="#linearGradient3726-8-6" + y1="36.722809" + y2="30.421146" /> + <linearGradient + id="linearGradient17655"> + <stop + id="stop17657" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17659" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient16227-6" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17662"> + <stop + id="stop17664" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17666" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(20,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3805-6-5" + inkscape:collect="always" + x1="13.567612" + x2="13.567612" + xlink:href="#linearGradient3795-9-1" + y1="18.432873" + y2="19.231655" /> + <linearGradient + id="linearGradient17669"> + <stop + id="stop17671" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17673" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + gradientUnits="userSpaceOnUse" + id="linearGradient2987-1-93" + inkscape:collect="always" + x1="23.374121" + x2="21.649811" + xlink:href="#linearGradient2981-3-4" + y1="19.452076" + y2="25.229111" /> + <linearGradient + id="linearGradient17676"> + <stop + id="stop17678" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop17680" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(14,0)" + gradientUnits="userSpaceOnUse" + id="linearGradient2953-0-30" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7-1" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient17683"> + <stop + id="stop17685" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17687" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2949-2-6" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7-1" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient17690"> + <stop + id="stop17692" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17694" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2902-5-8" + inkscape:collect="always" + x1="18.737373" + x2="30.230837" + xlink:href="#linearGradient2904-7-2" + y1="13.351768" + y2="13.351768" /> + <linearGradient + id="linearGradient17697"> + <stop + id="stop17699" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17701" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop17703" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop17705" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-5" + id="linearGradient10904-8-5" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient17708"> + <stop + id="stop17710" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop17712" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-6" + id="linearGradient16229-6" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient17715"> + <stop + id="stop17717" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17719" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + gradientUnits="userSpaceOnUse" + id="linearGradient2890-3-9" + inkscape:collect="always" + x1="19.583334" + x2="23.176371" + xlink:href="#linearGradient2867-5-7" + y1="10.76408" + y2="10.76408" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2892-2-2" + inkscape:collect="always" + x1="23.246162" + x2="23.246162" + xlink:href="#linearGradient3815-7-96" + y1="24.761473" + y2="15.94703" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2894-0-5" + inkscape:collect="always" + x1="21.961548" + x2="24.508121" + xlink:href="#linearGradient2877-5-2" + y1="6.3608937" + y2="10.75" /> + <radialGradient + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + gradientUnits="userSpaceOnUse" + id="radialGradient2926-3-1" + inkscape:collect="always" + r="6.46875" + xlink:href="#linearGradient2920-9-81" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-5" + id="linearGradient16231-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-0" + id="radialGradient10966-5-0" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-6" + id="linearGradient10982-6-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.396276" + y1="27.198471" + x2="16.365026" + y2="18.992922" /> + <linearGradient + id="linearGradient17764"> + <stop + id="stop17766" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17768" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1-1" + id="linearGradient16233-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + id="linearGradient3726-4-1-1"> + <stop + id="stop3728-9-8-55" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-2-5-3" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient16235-36" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17775"> + <stop + id="stop17777" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17779" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient10986-3-54" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(18.59884,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17782"> + <stop + id="stop17784" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17786" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-4" + id="linearGradient10988-7-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.93365598,0,0,0.94630428,0.1070789,1.560429)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient17789"> + <stop + id="stop17791" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop17793" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-1" + id="linearGradient10990-3-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2486592,0,0,1.0113615,11.508715,-0.56075794)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient17796"> + <stop + id="stop17798" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17800" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-1" + id="linearGradient10992-5-8" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" + gradientTransform="matrix(0.98788104,0,0,1.0113615,-0.23976961,-0.56075794)" /> + <linearGradient + id="linearGradient17803"> + <stop + id="stop17805" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17807" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-2" + id="linearGradient10994-5-5" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient17810"> + <stop + id="stop17812" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17814" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop17816" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop17818" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-5" + id="linearGradient10996-1-8" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient17821"> + <stop + id="stop17823" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop17825" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-7" + id="linearGradient11000-8-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-96" + id="linearGradient11002-1-0" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-2" + id="linearGradient11004-7-7" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-81" + id="radialGradient11006-6-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.75692381,-14.17818,0.21133448)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-5" + id="linearGradient11008-8-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9517316,0,0,0.94372518,-0.44251773,3.1419782)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-6" + id="linearGradient11093-2-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0,1,-1.8541642,0,56.847505,8.8537229)" + x1="14.547704" + y1="23.530848" + x2="12.968358" + y2="23.518084" /> + <linearGradient + id="linearGradient17863"> + <stop + id="stop17865" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17867" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-6" + id="linearGradient10998-4-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0625002,0,0,0.76351725,-1.5382359,3.9735816)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient17870"> + <stop + id="stop17872" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17874" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1-1" + id="linearGradient17466-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.85553658,0,0,0.77385304,0.52441214,2.4879707)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + id="linearGradient17877"> + <stop + id="stop17879" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17881" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient17468-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17884"> + <stop + id="stop17886" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17888" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-1" + id="linearGradient17470-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.86359943,0,0,1,16.977403,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17891"> + <stop + id="stop17893" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17895" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-4" + id="linearGradient17472-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.79373266,0,0,0.7916132,1.1565043,3.4403526)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient17898"> + <stop + id="stop17900" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop17902" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-1" + id="linearGradient17474-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.98788104,0,0,0.98347786,-0.23976961,-0.44878866)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient17905"> + <stop + id="stop17907" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17909" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-2" + id="linearGradient17476-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + id="linearGradient17912"> + <stop + id="stop17914" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17916" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop17918" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop17920" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-5" + id="linearGradient17478-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient17923"> + <stop + id="stop17925" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop17927" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-7" + id="linearGradient17480-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-96" + id="linearGradient17482-0" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-2" + id="linearGradient17484-9" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-81" + id="radialGradient17486-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3831764,0,0,0.73605512,-11.304892,0.24124002)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-5" + id="linearGradient17488-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.95796767,0,0,0.91036433,-1.6428678,3.1920195)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <inkscape:perspective + id="perspective17506-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-6" + id="radialGradient16183-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient4499-0-6" + inkscape:collect="always"> + <stop + id="stop4501-7-47" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop4503-6-36" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-6" + id="radialGradient16185-0" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3711-4-9" + id="radialGradient16191-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + r="13.08399" /> + <linearGradient + id="linearGradient3711-4-9" + inkscape:collect="always"> + <stop + id="stop3713-2-5" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3715-0-3" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77-10" + id="radialGradient16193-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + id="linearGradient2965-77-10" + inkscape:collect="always"> + <stop + id="stop2967-5-7" + offset="0" + style="stop-color:#888a85;stop-opacity:1;" /> + <stop + id="stop2969-4-2" + offset="1" + style="stop-color:#888a85;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3779-6-8" + id="linearGradient16195-88" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + x1="23.997437" + y1="37.835339" + x2="29.74268" + y2="32.355263" /> + <linearGradient + id="linearGradient3779-6-8" + inkscape:collect="always"> + <stop + id="stop3781-56-91" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3783-5-3" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3703-7-44" + id="linearGradient16197-3" + gradientUnits="userSpaceOnUse" + x1="23.8125" + y1="41.836731" + x2="27.272261" + y2="28.590008" /> + <linearGradient + id="linearGradient3703-7-44" + inkscape:collect="always"> + <stop + id="stop3705-1-1" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3707-7-9" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-3" + id="linearGradient16199-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="25.606806" + y1="36.722809" + x2="23.640165" + y2="30.421146" /> + <linearGradient + id="linearGradient3726-8-3"> + <stop + id="stop3728-16-48" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-8-9" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient16201-2" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient3795-9-2"> + <stop + id="stop3797-07-97" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop3799-60-1" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient16203-9" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(20,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17546-2"> + <stop + id="stop17548-2" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17550-6" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-1" + id="linearGradient16205-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient2981-3-1"> + <stop + id="stop2983-2-7" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop2985-7-7" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-6" + id="linearGradient16207-02" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(14,0)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient2943-7-6"> + <stop + id="stop2945-1-8" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop2947-3-2" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-6" + id="linearGradient16209-5" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient17561-1"> + <stop + id="stop17563-5" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17565-0" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-1" + id="linearGradient16211-70" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + id="linearGradient2904-7-1"> + <stop + id="stop2906-6-7" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop2910-3-6" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2912-9-63" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop2908-6-6" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient4487-9-5" + inkscape:collect="always" + x1="17.625" + x2="17.625" + xlink:href="#linearGradient4481-5-69" + y1="20.814491" + y2="5.125" /> + <linearGradient + id="linearGradient4481-5-69"> + <stop + id="stop4483-9-65" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop4485-81-2" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-74" + id="linearGradient16213-7" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient3734-7-74"> + <stop + id="stop3736-7-64" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop3738-3-7" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-2" + id="linearGradient16215-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + id="linearGradient2867-5-2" + inkscape:collect="always"> + <stop + id="stop2869-3-77" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2871-8-0" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-95" + id="linearGradient16217-7" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + id="linearGradient3815-7-95" + inkscape:collect="always"> + <stop + id="stop3817-73-0" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3819-4-7" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-89" + id="linearGradient16219-5" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <linearGradient + id="linearGradient2877-5-89" + inkscape:collect="always"> + <stop + id="stop2879-5-8" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2881-5-7" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-2" + id="radialGradient16221-54" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + id="linearGradient2920-9-2" + inkscape:collect="always"> + <stop + id="stop2922-3-1" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop2924-9-1" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0,3)" + gradientUnits="userSpaceOnUse" + id="linearGradient3567-2-0" + inkscape:collect="always" + x1="17.999674" + x2="30" + xlink:href="#linearGradient3228-6-2" + y1="10.081399" + y2="10.081399" /> + <linearGradient + id="linearGradient3228-6-2"> + <stop + id="stop3230-6-0" + offset="0" + style="stop-color:black;stop-opacity:1;" /> + <stop + id="stop3573-7-6" + offset="0.06770357" + style="stop-color:black;stop-opacity:0.42857143;" /> + <stop + id="stop3569-4-6" + offset="0.29894069" + style="stop-color:black;stop-opacity:0;" /> + <stop + id="stop3571-1-7" + offset="0.77437174" + style="stop-color:black;stop-opacity:0.49803922;" /> + <stop + id="stop3232-3-5" + offset="1" + style="stop-color:black;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-50" + id="linearGradient16223-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + id="linearGradient3579-6-50" + inkscape:collect="always"> + <stop + id="stop3581-4-8" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop3583-1-94" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient3012-3-8" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0-6" /> + <radialGradient + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + gradientUnits="userSpaceOnUse" + id="radialGradient4505-3-8" + inkscape:collect="always" + r="12.59534" + xlink:href="#linearGradient4499-0-6" /> + <radialGradient + cx="18.753521" + cy="40.578671" + fx="18.753521" + fy="40.578671" + gradientTransform="matrix(1.106546,0,0,0.58328,-1.909343,15.04719)" + gradientUnits="userSpaceOnUse" + id="radialGradient3691-5-4" + inkscape:collect="always" + r="13.08399" + xlink:href="#linearGradient3711-4-9" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2965-77-10" + id="radialGradient16225-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + gradientTransform="matrix(0.980843,0,0,0.974547,0.59387,-0.156861)" + gradientUnits="userSpaceOnUse" + id="linearGradient3785-4-8" + inkscape:collect="always" + x1="23.997437" + x2="29.74268" + xlink:href="#linearGradient3779-6-8" + y1="37.835339" + y2="32.355263" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient11071-4-7" + id="radialGradient11077-1-16" + cx="317.625" + cy="151.625" + fx="317.625" + fy="151.625" + r="1.875" + gradientTransform="matrix(1,0,0,0.5,0,75.8125)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient11071-4-7"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop11073-9-86" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop11075-5-6" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient3709-2-8" + inkscape:collect="always" + x1="23.8125" + x2="27.272261" + xlink:href="#linearGradient3703-7-44" + y1="41.836731" + y2="28.590008" /> + <linearGradient + gradientTransform="translate(0,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3732-0-5" + inkscape:collect="always" + x1="25.606806" + x2="23.640165" + xlink:href="#linearGradient3726-8-3" + y1="36.722809" + y2="30.421146" /> + <linearGradient + id="linearGradient17655-3"> + <stop + id="stop17657-4" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17659-7" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient16227-67" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17662-8"> + <stop + id="stop17664-9" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17666-7" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="translate(20,-1)" + gradientUnits="userSpaceOnUse" + id="linearGradient3805-6-47" + inkscape:collect="always" + x1="13.567612" + x2="13.567612" + xlink:href="#linearGradient3795-9-2" + y1="18.432873" + y2="19.231655" /> + <linearGradient + id="linearGradient17669-7"> + <stop + id="stop17671-1" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17673-8" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.940947,0,1.564893)" + gradientUnits="userSpaceOnUse" + id="linearGradient2987-1-2" + inkscape:collect="always" + x1="23.374121" + x2="21.649811" + xlink:href="#linearGradient2981-3-1" + y1="19.452076" + y2="25.229111" /> + <linearGradient + id="linearGradient17676-1"> + <stop + id="stop17678-9" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop17680-3" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="translate(14,0)" + gradientUnits="userSpaceOnUse" + id="linearGradient2953-0-7" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7-6" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient17683-7"> + <stop + id="stop17685-2" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17687-3" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2949-2-4" + inkscape:collect="always" + x1="16.65625" + x2="16.65625" + xlink:href="#linearGradient2943-7-6" + y1="16.14632" + y2="20.381033" /> + <linearGradient + id="linearGradient17690-2"> + <stop + id="stop17692-4" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17694-0" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2902-5-1" + inkscape:collect="always" + x1="18.737373" + x2="30.230837" + xlink:href="#linearGradient2904-7-1" + y1="13.351768" + y2="13.351768" /> + <linearGradient + id="linearGradient17697-4"> + <stop + id="stop17699-8" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17701-7" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop17703-2" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop17705-3" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-69" + id="linearGradient10904-8-2" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient17708-6"> + <stop + id="stop17710-1" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop17712-8" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-74" + id="linearGradient16229-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-1)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient17715-1"> + <stop + id="stop17717-9" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17719-1" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(1,0,0,0.809211,0,2.763158)" + gradientUnits="userSpaceOnUse" + id="linearGradient2890-3-7" + inkscape:collect="always" + x1="19.583334" + x2="23.176371" + xlink:href="#linearGradient2867-5-2" + y1="10.76408" + y2="10.76408" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2892-2-7" + inkscape:collect="always" + x1="23.246162" + x2="23.246162" + xlink:href="#linearGradient3815-7-95" + y1="24.761473" + y2="15.94703" /> + <linearGradient + gradientUnits="userSpaceOnUse" + id="linearGradient2894-0-0" + inkscape:collect="always" + x1="21.961548" + x2="24.508121" + xlink:href="#linearGradient2877-5-89" + y1="6.3608937" + y2="10.75" /> + <radialGradient + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + gradientTransform="matrix(1.580773,0,0,0.961547,-12.77702,-2.531609)" + gradientUnits="userSpaceOnUse" + id="radialGradient2926-3-87" + inkscape:collect="always" + r="6.46875" + xlink:href="#linearGradient2920-9-2" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-50" + id="linearGradient16231-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.09091,0,0,1.100001,-1.681827,0.84999)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4499-0-6" + id="radialGradient10966-5-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.508772,0,18.12988)" + cx="23.82066" + cy="36.907261" + fx="23.82066" + fy="36.907261" + r="12.59534" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-3" + id="linearGradient10982-6-88" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.396276" + y1="27.198471" + x2="16.365026" + y2="18.992922" /> + <linearGradient + id="linearGradient17764-9"> + <stop + id="stop17766-5" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17768-0" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1-2" + id="linearGradient16233-5" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5837775,-0.800515)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + id="linearGradient3726-4-1-2"> + <stop + id="stop3728-9-8-4" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop3730-2-5-9" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient16235-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17775-5"> + <stop + id="stop17777-6" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17779-3" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient10986-3-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(18.59884,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17782-8"> + <stop + id="stop17784-8" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17786-6" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-1" + id="linearGradient10988-7-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.93365598,0,0,0.94630428,0.1070789,1.560429)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient17789-1"> + <stop + id="stop17791-7" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop17793-1" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-6" + id="linearGradient10990-3-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2486592,0,0,1.0113615,11.508715,-0.56075794)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient17796-8"> + <stop + id="stop17798-4" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17800-1" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-6" + id="linearGradient10992-5-5" + gradientUnits="userSpaceOnUse" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" + gradientTransform="matrix(0.98788104,0,0,1.0113615,-0.23976961,-0.56075794)" /> + <linearGradient + id="linearGradient17803-5"> + <stop + id="stop17805-0" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17807-5" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-1" + id="linearGradient10994-5-0" + gradientUnits="userSpaceOnUse" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient17810-2"> + <stop + id="stop17812-3" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17814-8" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop17816-3" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop17818-1" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-69" + id="linearGradient10996-1-1" + gradientUnits="userSpaceOnUse" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" + gradientTransform="matrix(0.89850937,0,0,0.87500727,0.63399027,2.2558288)" /> + <linearGradient + id="linearGradient17821-8"> + <stop + id="stop17823-3" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop17825-7" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-2" + id="linearGradient11000-8-0" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-95" + id="linearGradient11002-1-9" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-89" + id="linearGradient11004-7-3" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-2" + id="radialGradient11006-6-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.580773,0,0,0.75692381,-14.17818,0.21133448)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-50" + id="linearGradient11008-8-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9517316,0,0,0.94372518,-0.44251773,3.1419782)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-8-3" + id="linearGradient11093-2-74" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0,1,-1.8541642,0,56.847505,8.8537229)" + x1="14.547704" + y1="23.530848" + x2="12.968358" + y2="23.518084" /> + <linearGradient + id="linearGradient17863-1"> + <stop + id="stop17865-6" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17867-1" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3734-7-74" + id="linearGradient10998-4-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0625002,0,0,0.76351725,-1.5382359,3.9735816)" + x1="24.6875" + y1="36.75" + x2="24.6875" + y2="28.617105" /> + <linearGradient + id="linearGradient17870-3"> + <stop + id="stop17872-4" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17874-7" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3726-4-1-2" + id="linearGradient17466-39" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.85553658,0,0,0.77385304,0.52441214,2.4879707)" + x1="16.271276" + y1="23.729721" + x2="16.271276" + y2="18.305422" /> + <linearGradient + id="linearGradient17877-8"> + <stop + id="stop17879-1" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17881-6" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient17468-0" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.3749995,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17884-6"> + <stop + id="stop17886-6" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17888-2" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3795-9-2" + id="linearGradient17470-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.86359943,0,0,1,16.977403,-0.923861)" + x1="13.567612" + y1="18.432873" + x2="13.567612" + y2="19.231655" /> + <linearGradient + id="linearGradient17891-6"> + <stop + id="stop17893-8" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop17895-4" + offset="1" + style="stop-color:#eeeeec;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2981-3-1" + id="linearGradient17472-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.79373266,0,0,0.7916132,1.1565043,3.4403526)" + x1="23.374121" + y1="19.452076" + x2="21.649811" + y2="25.229111" /> + <linearGradient + id="linearGradient17898-6"> + <stop + id="stop17900-9" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop17902-7" + offset="1" + style="stop-color:white;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2943-7-6" + id="linearGradient17474-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.98788104,0,0,0.98347786,-0.23976961,-0.44878866)" + x1="16.65625" + y1="16.14632" + x2="16.65625" + y2="20.381033" /> + <linearGradient + id="linearGradient17905-9"> + <stop + id="stop17907-2" + offset="0" + style="stop-color:#555753;stop-opacity:1" /> + <stop + id="stop17909-4" + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2904-7-1" + id="linearGradient17476-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="18.737373" + y1="13.351768" + x2="30.230837" + y2="13.351768" /> + <linearGradient + id="linearGradient17912-1"> + <stop + id="stop17914-9" + offset="0" + style="stop-color:#babdb6;stop-opacity:1" /> + <stop + id="stop17916-4" + offset="0.21551724" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop17918-7" + offset="0.70243758" + style="stop-color:#c3c4c2;stop-opacity:1;" /> + <stop + id="stop17920-2" + offset="1" + style="stop-color:#888a85;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4481-5-69" + id="linearGradient17478-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90205069,0,0,0.84683731,-0.52819355,2.298084)" + x1="17.375" + y1="15.314491" + x2="17.625" + y2="5.125" /> + <linearGradient + id="linearGradient17923-2"> + <stop + id="stop17925-7" + offset="0" + style="stop-color:#3e403d;stop-opacity:1" /> + <stop + id="stop17927-8" + offset="1" + style="stop-color:#babdb6;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2867-5-2" + id="linearGradient17480-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.72266039,0,4.7538205)" + x1="19.583334" + y1="10.76408" + x2="23.176371" + y2="10.76408" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3815-7-95" + id="linearGradient17482-8" + gradientUnits="userSpaceOnUse" + x1="23.246162" + y1="24.761473" + x2="23.246162" + y2="15.94703" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2877-5-89" + id="linearGradient17484-8" + gradientUnits="userSpaceOnUse" + x1="21.961548" + y1="6.3608937" + x2="24.508121" + y2="10.75" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2920-9-2" + id="radialGradient17486-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3831764,0,0,0.73605512,-11.304892,0.24124002)" + cx="22.553526" + cy="10.432782" + fx="22.553526" + fy="10.432782" + r="6.46875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3579-6-50" + id="linearGradient17488-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.95796767,0,0,0.91036433,-1.6428678,3.1920195)" + x1="20.483149" + y1="3.4711361" + x2="28.357954" + y2="25.991137" /> + <inkscape:perspective + id="perspective24256" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient20940-6" + id="radialGradient20946-9" + cx="1534.875" + cy="197.3125" + fx="1534.875" + fy="197.3125" + r="4.5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.7936036,0,0,1.7936036,-1218.0823,-156.58791)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient20940-6"> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="0" + id="stop20942-0" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop20944-9" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient20921-3" + id="linearGradient20938-8-0" + gradientUnits="userSpaceOnUse" + x1="1540.5205" + y1="196.31589" + x2="1540.5205" + y2="204" /> + <linearGradient + inkscape:collect="always" + id="linearGradient20921-3"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop20923-9" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop20925-0" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient20940-6" + id="radialGradient20964-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.7936036,0,0,1.7936036,-1218.0823,-156.58791)" + cx="1534.875" + cy="197.3125" + fx="1534.875" + fy="197.3125" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient20921-3" + id="linearGradient20966-5" + gradientUnits="userSpaceOnUse" + x1="1540.5205" + y1="196.31589" + x2="1540.5205" + y2="204" /> + <filter + inkscape:collect="always" + id="filter10244-3" + x="-0.07" + width="1.14" + y="-0.41999999" + height="1.84" + color-interpolation-filters="sRGB"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.2625" + id="feGaussianBlur10246-6" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10299-6" + id="radialGradient20846-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(5.7381652,0,0,2.7438309,-3451.61,-805.90483)" + cx="728.12396" + cy="459.94751" + fx="728.12396" + fy="459.94751" + r="5.5" /> + <linearGradient + inkscape:collect="always" + id="linearGradient10299-6"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop10301-6" /> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="1" + id="stop10303-1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10326-4-1" + id="radialGradient20848-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(6.8033781,0,0,2.9242241,-4114.4753,-1103.4401)" + cx="711.25" + cy="532.375" + fx="711.25" + fy="532.375" + r="4.5" /> + <linearGradient + id="linearGradient10326-4-1" + inkscape:collect="always"> + <stop + id="stop10329-8-0" + offset="0" + style="stop-color:#888a85;stop-opacity:1" /> + <stop + id="stop10331-9-7" + offset="1" + style="stop-color:#2e3436;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10181-9" + id="linearGradient20850-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3227953,0,0,1.333167,-216.67883,-256.74506)" + x1="712.64349" + y1="533.83154" + x2="716.09131" + y2="542.42279" /> + <linearGradient + inkscape:collect="always" + id="linearGradient10181-9"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop10183-0" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop10185-6" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10299-6" + id="radialGradient20776-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(5.7827838,0,0,2.7438309,-3484.0716,-805.90483)" + cx="728.12396" + cy="459.94751" + fx="728.12396" + fy="459.94751" + r="5.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient10326-4-1" + id="radialGradient20778-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(5.6684259,0,0,2.9242241,-3307.2303,-1103.4401)" + cx="711.25" + cy="532.375" + fx="711.25" + fy="532.375" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient10181-9" + id="linearGradient20780-8-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.388165,0,0,1.3893363,-263.34208,-286.88003)" + x1="712.64349" + y1="533.83154" + x2="716.09131" + y2="542.42279" /> + <inkscape:perspective + id="perspective25324" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective25467" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-1" + id="radialGradient25400-7" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="107.37611" + fx="371.34375" + fy="107.37611" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-1"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-6" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-6" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-0" + id="radialGradient25402-8" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="104.5173" + fx="371.34375" + fy="104.5173" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-0"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-5" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-9" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-1" + id="radialGradient25479" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="107.37611" + fx="371.34375" + fy="107.37611" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-0" + id="radialGradient25487" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="104.5173" + fx="371.34375" + fy="104.5173" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-1" + id="radialGradient25495" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="107.37611" + fx="371.34375" + fy="107.37611" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-0" + id="radialGradient25503" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="104.5173" + fx="371.34375" + fy="104.5173" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-0" + id="radialGradient25428-5" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-0"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-4" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-2" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-5" + id="radialGradient25420-7" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-5"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-5" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-0" + id="radialGradient25519" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-5" + id="radialGradient25527" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-0" + id="radialGradient25535" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-5" + id="radialGradient25543" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient25780" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient25782" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient25790" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient25792" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient25806" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient25808" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective25822" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-5" + id="radialGradient25780-1" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-5"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-9" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-20" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-1" + id="radialGradient25782-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-1"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-9" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-9" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-5" + id="radialGradient25790-7" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-1" + id="radialGradient25792-3" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective25954" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17" + id="radialGradient25810-7" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="107.37611" + fx="371.34375" + fy="107.37611" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09" + id="radialGradient25812-3" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="104.5173" + fx="371.34375" + fy="104.5173" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="107.37611" + fx="371.34375" + cy="107.37611" + cx="371.34375" + gradientUnits="userSpaceOnUse" + id="radialGradient25967" + xlink:href="#linearGradient25372-17" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="104.5173" + fx="371.34375" + cy="104.5173" + cx="371.34375" + gradientUnits="userSpaceOnUse" + id="radialGradient25969" + xlink:href="#linearGradient25346-09" + inkscape:collect="always" /> + <inkscape:perspective + id="perspective26008" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + r="3.3928573" + fy="107.37611" + fx="371.34375" + cy="107.37611" + cx="371.34375" + gradientUnits="userSpaceOnUse" + id="radialGradient25967-7" + xlink:href="#linearGradient25372-17-3" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-3"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-2" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-3" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="104.5173" + fx="371.34375" + cy="104.5173" + cx="371.34375" + gradientUnits="userSpaceOnUse" + id="radialGradient25969-0" + xlink:href="#linearGradient25346-09-3" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-3"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-4" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-0" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-5-6" + id="radialGradient25780-1-1" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-5-6"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-9-2" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-20-8" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-1-7" + id="radialGradient25782-9-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-1-7"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-9-2" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-9-5" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-3" + id="radialGradient26120" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="107.37611" + fx="371.34375" + fy="107.37611" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-3" + id="radialGradient26122" + gradientUnits="userSpaceOnUse" + cx="371.34375" + cy="104.5173" + fx="371.34375" + fy="104.5173" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient26142" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient26144" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient26146" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient26148" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient26150" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient26152" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient26160" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient26162" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422" + id="radialGradient26170" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414" + id="radialGradient26172" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective26182" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05" + id="radialGradient26170-6" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58" + id="radialGradient26172-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05" + id="radialGradient26160-3" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58" + id="radialGradient26162-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective26312" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient25967-75" + xlink:href="#linearGradient25372-17-7" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient25969-5" + xlink:href="#linearGradient25346-09-6" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="107.37611" + fx="371.34375" + cy="107.37611" + cx="371.34375" + gradientUnits="userSpaceOnUse" + id="radialGradient26325" + xlink:href="#linearGradient25372-17-7" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="104.5173" + fx="371.34375" + cy="104.5173" + cx="371.34375" + gradientUnits="userSpaceOnUse" + id="radialGradient26327" + xlink:href="#linearGradient25346-09-6" + inkscape:collect="always" /> + <inkscape:perspective + id="perspective26365" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-2" + id="radialGradient26170-6-7" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-2"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-3" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-8" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-2" + id="radialGradient26172-5-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-2"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-7" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-6" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-2" + id="radialGradient26160-3-6" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-2" + id="radialGradient26162-9-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient25967-75-0" + xlink:href="#linearGradient25372-17-7-4" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7-4"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3-6" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7-3" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient25969-5-0" + xlink:href="#linearGradient25346-09-6-2" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6-2"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9-3" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07-2" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26407" + xlink:href="#linearGradient25372-17-7-4" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26409" + xlink:href="#linearGradient25346-09-6-2" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-4" + id="radialGradient26490" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-2" + id="radialGradient26492" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7" + id="radialGradient26563" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6" + id="radialGradient26565" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05" + id="radialGradient26567" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58" + id="radialGradient26569" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05" + id="radialGradient26571" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58" + id="radialGradient26573" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective26583" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0" + id="radialGradient26571-6" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-0"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-1" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-5" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20" + id="radialGradient26573-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-20"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-4" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-5" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0" + id="radialGradient26567-4" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20" + id="radialGradient26569-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-1" + id="radialGradient26563-0" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7-1"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3-60" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7-0" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-1" + id="radialGradient26565-2" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6-1"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9-7" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07-8" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26625" + xlink:href="#linearGradient25372-17-7-1" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26627" + xlink:href="#linearGradient25346-09-6-1" + inkscape:collect="always" /> + <inkscape:perspective + id="perspective26712" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8" + id="radialGradient26571-6-3" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-0-8"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-1-7" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-5-4" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6" + id="radialGradient26573-1-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-20-6"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-4-0" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-5-2" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8" + id="radialGradient26567-4-1" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6" + id="radialGradient26569-6-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26625-0" + xlink:href="#linearGradient25372-17-7-1-9" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7-1-9"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3-60-8" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7-0-3" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26627-8" + xlink:href="#linearGradient25346-09-6-1-2" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6-1-2"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9-7-6" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07-8-5" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26754" + xlink:href="#linearGradient25372-17-7-1-9" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26756" + xlink:href="#linearGradient25346-09-6-1-2" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0" + id="radialGradient26839" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20" + id="radialGradient26841" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective26851" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-8" + id="radialGradient26571-6-3-7" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-0-8-8"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-1-7-2" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-5-4-8" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-2" + id="radialGradient26573-1-6-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-20-6-2"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-4-0-3" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-5-2-5" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-8" + id="radialGradient26567-4-1-8" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-2" + id="radialGradient26569-6-5-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26754-0" + xlink:href="#linearGradient25372-17-7-1-9-8" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7-1-9-8"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3-60-8-1" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7-0-3-2" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26756-3" + xlink:href="#linearGradient25346-09-6-1-2-7" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6-1-2-7"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9-7-6-2" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07-8-5-4" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26893" + xlink:href="#linearGradient25372-17-7-1-9-8" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient26895" + xlink:href="#linearGradient25346-09-6-1-2-7" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-1-9-8" + id="radialGradient26976" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-1-2-7" + id="radialGradient26978" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-1-9" + id="radialGradient26996" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-1-2" + id="radialGradient26998" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8" + id="radialGradient27000" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6" + id="radialGradient27002" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8" + id="radialGradient27004" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6" + id="radialGradient27006" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective27016" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-0" + id="radialGradient27004-3" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-0-8-0"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-1-7-8" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-5-4-7" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-4" + id="radialGradient27006-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-20-6-4"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-4-0-5" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-5-2-3" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-0" + id="radialGradient27000-8" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-4" + id="radialGradient27002-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-1-9-2" + id="radialGradient26996-1" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7-1-9-2"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3-60-8-4" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7-0-3-9" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-1-2-2" + id="radialGradient26998-6" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6-1-2-2"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9-7-6-0" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07-8-5-6" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient27058" + xlink:href="#linearGradient25372-17-7-1-9-2" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient27060" + xlink:href="#linearGradient25346-09-6-1-2-2" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-0" + id="radialGradient27143" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-4" + id="radialGradient27145" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <inkscape:perspective + id="perspective27016-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-1" + id="radialGradient27004-7" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-0-8-1"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-1-7-4" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-5-4-4" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-8" + id="radialGradient27006-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-20-6-8"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-4-0-6" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-5-2-2" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-8-1" + id="radialGradient27000-1" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-6-8" + id="radialGradient27002-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-1-9-1" + id="radialGradient26996-3" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25372-17-7-1-9-1"> + <stop + style="stop-color:#eff1ee;stop-opacity:1" + offset="0" + id="stop25374-4-3-60-8-8" /> + <stop + style="stop-color:#c2c8bc;stop-opacity:1" + offset="1" + id="stop25376-7-7-0-3-7" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-1-2-8" + id="radialGradient26998-3" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25346-09-6-1-2-8"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop25348-4-9-7-6-3" /> + <stop + style="stop-color:#969a90;stop-opacity:1" + offset="1" + id="stop25350-3-07-8-5-7" /> + </linearGradient> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient27058-3" + xlink:href="#linearGradient25372-17-7-1-9-1" + inkscape:collect="always" /> + <radialGradient + r="3.3928573" + fy="114.40797" + fx="63.54015" + cy="114.40797" + cx="63.54015" + gradientUnits="userSpaceOnUse" + id="radialGradient27060-7" + xlink:href="#linearGradient25346-09-6-1-2-8" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25372-17-7-1-9-1" + id="radialGradient27226" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25346-09-6-1-2-8" + id="radialGradient27228" + gradientUnits="userSpaceOnUse" + cx="63.54015" + cy="114.40797" + fx="63.54015" + fy="114.40797" + r="3.3928573" /> + <inkscape:perspective + id="perspective11811" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-9" + id="radialGradient26571-6-8" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25422-05-0-9"> + <stop + style="stop-color:#ffed91;stop-opacity:1" + offset="0" + id="stop25424-6-1-8" /> + <stop + style="stop-color:#fca220;stop-opacity:1" + offset="1" + id="stop25426-5-5-8" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-3" + id="radialGradient26573-1-0" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25414-58-20-3"> + <stop + style="stop-color:#b95c00;stop-opacity:1" + offset="0" + id="stop25416-6-4-7" /> + <stop + style="stop-color:#ff8712;stop-opacity:1" + offset="1" + id="stop25418-19-5-0" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-9" + id="radialGradient26567-4-6" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-3" + id="radialGradient26569-6-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25422-05-0-9" + id="radialGradient26839-2" + gradientUnits="userSpaceOnUse" + cx="63.437336" + cy="112.84037" + fx="63.437336" + fy="112.84037" + r="1.7356977" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25414-58-20-3" + id="radialGradient26841-1" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9321479,0,0,1.9321479,-59.22083,-106.92629)" + cx="63.531582" + cy="114.70958" + fx="63.531582" + fy="114.70958" + r="1.7356977" /> + </defs> + <g + id="g12072" + inkscape:groupmode="layer" + style="display:inline" + inkscape:label="high" + transform="translate(6,50)"> + <g + id="g12074" + inkscape:groupmode="layer" + style="display:none" + inkscape:label="baseplate 0"> + <rect + id="rect12078" + x="18" + y="51" + inkscape:label="48x48" + height="48" + width="48" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12080" + x="18" + y="126" + inkscape:label="32x32" + height="32" + width="32" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12082" + x="18" + y="177" + inkscape:label="24x24" + height="24" + width="24" + style="fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12084" + x="19" + y="178" + inkscape:label="22x22" + height="22" + width="22" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12086" + x="18" + y="221" + inkscape:label="16x16" + height="16" + width="16" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <text + id="text12088" + x="12" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="context" + y="-6" + sodipodi:linespacing="125%"> + <tspan + id="tspan12090" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">status</tspan> + </text> + <text + id="text12092" + x="11" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="icon-name" + y="14" + sodipodi:linespacing="125%"> + <tspan + id="tspan12094" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">audio-input-microphone-high</tspan> + </text> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="icons"> + <g + id="g48" + style="display:inline;enable-background:new" + transform="translate(13.040289,51)"> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path3010" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="opacity:0.1;fill:url(#radialGradient16183);fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.727673,0,0,1.235135,7.166344,-12.0556)" /> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path4489" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="opacity:0.7;fill:url(#radialGradient16185);fill-opacity:1;stroke:none;display:inline" + transform="matrix(1.233813,0,0,1.235135,-4.890235,-6.055598)" /> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path3683" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="fill:url(#radialGradient16191);fill-opacity:1;stroke:#555753;stroke-width:0.97730058;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + transform="matrix(1.032128,0,0,1.014402,-0.08596444,1.56074)" /> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path2955" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="fill:url(#radialGradient16193);fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.43667,0,0,0.429141,14.09824,21.41158)" /> + <path + d="m 27.35249,32.125 c -1.738654,0.735383 -2.545819,2.052948 -3.67816,3.167277 -0.486309,0.3076 -0.5997,0.709446 -0.51965,1.276685 0.08005,0.567243 0.489446,1.055334 1.042146,1.218184 0.552698,0.162848 0.999547,0.130039 1.377887,-0.302139 C 26.676195,35.285524 28.744563,33.983863 31,32.85591 29.870496,32.536987 28.651039,32.264053 27.35249,32.125 z" + id="path3766" + sodipodi:nodetypes="ccssccc" + style="opacity:0.7;fill:url(#linearGradient16195);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" /> + <path + d="m 23.8125,31.5 c -3.339495,0 -6.371551,0.683256 -8.46875,1.75 -2.097199,1.066744 -3.125,2.416366 -3.125,3.65625 0,1.239884 1.027801,2.589506 3.125,3.65625 2.097199,1.066744 5.129255,1.750001 8.46875,1.75 3.339495,0 6.371551,-0.683256 8.46875,-1.75 2.097199,-1.066744 3.125,-2.416366 3.125,-3.65625 0,-1.239884 -1.027801,-2.589506 -3.125,-3.65625 C 30.184051,32.183256 27.151995,31.5 23.8125,31.5 z" + id="path3697" + inkscape:original="M 23.8125 30.5 C 16.859872 30.5 11.21875 33.368948 11.21875 36.90625 C 11.21875 40.443552 16.859872 43.312502 23.8125 43.3125 C 30.765128 43.3125 36.406249 40.443552 36.40625 36.90625 C 36.40625 33.368948 30.765128 30.5 23.8125 30.5 z " + inkscape:radius="-0.99470079" + sodipodi:type="inkscape:offset" + style="opacity:0.4;fill:none;stroke:url(#linearGradient16197);stroke-width:0.97730058;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + transform="matrix(1.032128,0,0,1.014402,-0.08596444,1.56074)" /> + <path + d="m 24.5,27.5 0,9" + id="path3589" + sodipodi:nodetypes="cc" + style="fill:none;stroke:url(#linearGradient16199);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" /> + <path + d="m 34.500008,18.999997 c -8e-6,4.285711 -4.46,7.500001 -10.000002,7.500001 -5.540002,0 -10.000006,-3.21429 -10.000003,-7.500001" + id="path2781" + sodipodi:nodetypes="csc" + style="fill:none;stroke:#888a85;stroke-width:3.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + height="2.9999995" + id="rect2783" + style="fill:url(#linearGradient16201);fill-opacity:1;stroke:#888a85;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="4" + x="12.5" + y="16.499998" /> + <rect + height="2.9999995" + id="rect3803" + style="fill:url(#linearGradient16203);fill-opacity:1;stroke:#888a85;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="4" + x="32.5" + y="16.499998" /> + <path + d="m 34.500008,18.999991 c 0,4.28571 -4.46,7.500001 -10.000002,7.500001 -5.540002,0 -10.000006,-3.214291 -10.000003,-7.500001" + id="rect1882" + sodipodi:nodetypes="csc" + style="fill:none;stroke:url(#linearGradient16205);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + height="6" + id="rect2951" + rx="0.9722718" + ry="0.9722718" + style="fill:url(#linearGradient16207);fill-opacity:1;stroke:none;display:inline" + width="3.0000005" + x="30" + y="15" /> + <path + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" + id="path3825" + sodipodi:cx="14" + sodipodi:cy="19" + sodipodi:rx="0.5" + sodipodi:ry="0.5" + sodipodi:type="arc" + style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline" + transform="matrix(1.5,0,0,1.5,12.25,-11.25)" /> + <rect + height="6" + id="rect2787" + rx="0.9722718" + ry="0.9722718" + style="fill:url(#linearGradient16209);fill-opacity:1;stroke:none;display:inline" + width="3.0000005" + x="16" + y="15" /> + <rect + height="24.000008" + id="rect1880" + rx="7.0000019" + ry="7.0108709" + style="fill:url(#linearGradient16211);fill-opacity:1;stroke:url(#linearGradient4487-9);stroke-width:1.00000048;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + width="14.000004" + x="17.499996" + y="1.5000002" /> + <path + d="m 24.5,26.5 0,10" + id="path3587" + sodipodi:nodetypes="cc" + style="fill:none;stroke:url(#linearGradient16213);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" /> + <path + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" + id="path3823" + sodipodi:cx="14" + sodipodi:cy="19" + sodipodi:rx="0.5" + sodipodi:ry="0.5" + sodipodi:type="arc" + style="fill:#ffffff;fill-opacity:1;stroke:none" + transform="matrix(1.5,0,0,1.5,-7.75,-11.25)" /> + <g + id="g3270" + inkscape:label="Shadow" + transform="translate(-9.25,46.68088)" /> + <g + id="g2611" + inkscape:label="Shadow" + transform="translate(-9.25,61.74691)" /> + <g + id="g2613" + inkscape:label="Lavoro" + style="display:inline" + transform="translate(-9.25,61.74691)" /> + <g + id="g2885"> + <rect + height="15.374996" + id="rect1975" + rx="2" + ry="2.1991496" + style="fill:url(#linearGradient16215);fill-opacity:1;stroke:none;display:inline" + width="4" + x="20" + y="6" /> + <path + d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,10 c 0,3.592133 2.882528,6.46875 6.46875,6.46875 3.586222,0 6.46875,-2.876617 6.46875,-6.46875 l 0,-10 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z" + id="path3811" + inkscape:original="M 24.5 2.5 C 20.621999 2.5 17.5 5.615977 17.5 9.5 L 17.5 19.5 C 17.5 23.384022 20.621999 26.5 24.5 26.5 C 28.378001 26.5 31.5 23.384022 31.5 19.5 L 31.5 9.5 C 31.5 5.6159775 28.378001 2.5 24.5 2.5 z " + inkscape:radius="-0.54470092" + sodipodi:type="inkscape:offset" + style="opacity:0.2;fill:url(#linearGradient16217);fill-opacity:1;stroke:none;display:inline" + transform="translate(0,-1)" /> + <path + d="M 27,7.6875 C 27,9.378872 25.502952,10.75 23.65625,10.75 21.809548,10.75 20.3125,9.378872 20.3125,7.6875 20.3125,5.996128 21.809548,4.625 23.65625,4.625 25.502952,4.625 27,5.996128 27,7.6875 z" + id="path2875" + sodipodi:cx="23.65625" + sodipodi:cy="7.6875" + sodipodi:rx="3.34375" + sodipodi:ry="3.0625" + sodipodi:type="arc" + style="fill:url(#linearGradient16219);fill-opacity:1;stroke:none" + transform="matrix(1,0,0,1.081633,-0.375,-1.252551)" /> + </g> + <path + d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,5 12.9375,0 0,-5 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z" + id="path2916" + sodipodi:nodetypes="cccccc" + style="opacity:0.9;fill:url(#radialGradient16221);fill-opacity:1;stroke:none;display:inline" + transform="translate(0,-1)" /> + <path + d="M 22.5,3 C 22.224,3 22,3.224 22,3.5 22,3.776 22.224,4 22.5,4 22.776,4 23,3.776 23,3.5 23,3.224 22.776,3 22.5,3 z m 2,0 C 24.224,3 24,3.224 24,3.5 24,3.776 24.224,4 24.5,4 24.776,4 25,3.776 25,3.5 25,3.224 24.776,3 24.5,3 z m 2,0 C 26.224,3 26,3.224 26,3.5 26,3.776 26.224,4 26.5,4 26.776,4 27,3.776 27,3.5 27,3.224 26.776,3 26.5,3 z m -5,1 C 21.224,4 21,4.224 21,4.5 21,4.776 21.224,5 21.5,5 21.776,5 22,4.776 22,4.5 22,4.224 21.776,4 21.5,4 z m 2,0 C 23.224,4 22.999999,4.2240007 23,4.5 23,4.7759993 23.223999,5 23.5,5 23.776,5 24,4.7759993 24,4.5 24,4.2240007 23.776,4 23.5,4 z m 2,0 C 25.224,4 24.999999,4.2240007 25,4.5 25,4.7759993 25.223999,5 25.5,5 25.776,5 26,4.7759993 26,4.5 26,4.2240007 25.776,4 25.5,4 z m 2,0 C 27.224,4 27,4.224 27,4.5 27,4.776 27.224,5 27.5,5 27.776,5 28,4.776 28,4.5 28,4.224 27.776,4 27.5,4 z m -7,1 C 20.224,5 19.999999,5.2240008 20,5.5 20,5.7759993 20.223999,6 20.5,6 20.776,6 21,5.7759994 21,5.5 21,5.2240007 20.776,5 20.5,5 z m 2,0 C 22.224,5 21.999999,5.2240008 22,5.5 22,5.7759993 22.223999,6 22.5,6 22.776,6 23,5.7759994 23,5.5 23,5.2240007 22.776,5 22.5,5 z m 2,0 C 24.224,5 23.999999,5.2240008 24,5.5 24,5.7759993 24.223999,6 24.5,6 24.776,6 25,5.7759994 25,5.5 25,5.2240007 24.776,5 24.5,5 z m 2,0 C 26.224,5 25.999999,5.2240008 26,5.5 26,5.7759993 26.223999,6 26.5,6 26.776,6 27,5.7759994 27,5.5 27,5.2240007 26.776,5 26.5,5 z m 2,0 C 28.224,5 28,5.224 28,5.5 28,5.776 28.224,6 28.5,6 28.776,6 29,5.776 29,5.5 29,5.224 28.776,5 28.5,5 z m -9,1 C 19.224,6 18.999999,6.2240008 19,6.5 19,6.7759993 19.223999,7 19.5,7 19.776,7 20,6.7759994 20,6.5 20,6.2240007 19.776,6 19.5,6 z m 2,0 C 21.224,6 20.999999,6.2240008 21,6.5 21,6.7759993 21.223999,7 21.5,7 21.776,7 22,6.7759994 22,6.5 22,6.2240007 21.776,6 21.5,6 z m 2,0 C 23.224,6 22.999999,6.2240008 23,6.5 23,6.7759993 23.223999,7 23.5,7 23.776,7 24,6.7759994 24,6.5 24,6.2240007 23.776,6 23.5,6 z m 2,0 C 25.224,6 24.999999,6.2240008 25,6.5 25,6.7759993 25.223999,7 25.5,7 25.776,7 26,6.7759994 26,6.5 26,6.2240007 25.776,6 25.5,6 z m 2,0 C 27.224,6 26.999999,6.2240008 27,6.5 27,6.7759993 27.223999,7 27.5,7 27.776,7 28,6.7759994 28,6.5 28,6.2240007 27.776,6 27.5,6 z m 2,0 C 29.224,6 29,6.224 29,6.5 29,6.776 29.224,7 29.5,7 29.776,7 30,6.776 30,6.5 30,6.224 29.776,6 29.5,6 z m -9,1 C 20.224,7 19.999999,7.2240008 20,7.5 20,7.7759993 20.223999,8.0000002 20.5,8 20.776,8 21,7.7759994 21,7.5 21,7.2240007 20.776,7 20.5,7 z m 2,0 C 22.224,7 21.999999,7.2240008 22,7.5 22,7.7759993 22.223999,8.0000002 22.5,8 22.776,8 23,7.7759994 23,7.5 23,7.2240007 22.776,7 22.5,7 z m 2,0 C 24.224,7 23.999999,7.2240008 24,7.5 24,7.7759993 24.223999,8.0000002 24.5,8 24.776,8 25,7.7759994 25,7.5 25,7.2240007 24.776,7 24.5,7 z m 2,0 C 26.224,7 25.999999,7.2240008 26,7.5 26,7.7759993 26.223999,8.0000002 26.5,8 26.776,8 27,7.7759994 27,7.5 27,7.2240007 26.776,7 26.5,7 z m 2,0 C 28.224,7 27.999999,7.2240008 28,7.5 28,7.7759993 28.223999,8.0000002 28.5,8 28.776,8 29,7.7759994 29,7.5 29,7.2240007 28.776,7 28.5,7 z m 2,0 C 30.224,7 30,7.224 30,7.5 30,7.776 30.224,8 30.5,8 30.776,8 31,7.776 31,7.5 31,7.224 30.776,7 30.5,7 z m -11,1 C 19.224,8 18.999999,8.2240008 19,8.5 19,8.7759993 19.223999,9 19.5,9 19.776,9 20,8.7759994 20,8.5 20,8.2240007 19.776,8 19.5,8 z m 2,0 C 21.224,8 20.999999,8.2240008 21,8.5 21,8.7759993 21.223999,9 21.5,9 21.776,9 22,8.7759994 22,8.5 22,8.2240007 21.776,8 21.5,8 z m 2,0 C 23.224,8 22.999999,8.2240008 23,8.5 23,8.7759993 23.223999,9 23.5,9 23.776,9 24,8.7759994 24,8.5 24,8.2240007 23.776,8 23.5,8 z m 2,0 C 25.224,8 24.999999,8.2240008 25,8.5 25,8.7759993 25.223999,9 25.5,9 25.776,9 26,8.7759994 26,8.5 26,8.2240007 25.776,8 25.5,8 z m 2,0 C 27.224,8 26.999999,8.2240008 27,8.5 27,8.7759993 27.223999,9 27.5,9 27.776,9 28,8.7759994 28,8.5 28,8.2240007 27.776,8 27.5,8 z m 2,0 C 29.224,8 28.999999,8.2240008 29,8.5 29,8.7759993 29.223999,9 29.5,9 29.776,9 30,8.7759994 30,8.5 30,8.2240007 29.776,8 29.5,8 z m -11,1 C 18.224,9 17.999999,9.224001 18,9.5 18,9.775999 18.223999,10 18.5,10 18.776,10 19,9.775999 19,9.5 19,9.224001 18.776,9 18.5,9 z m 2,0 C 20.224,9 19.999999,9.224001 20,9.5 20,9.775999 20.223999,10 20.5,10 20.776,10 21,9.775999 21,9.5 21,9.224001 20.776,9 20.5,9 z m 2,0 C 22.224,9 21.999999,9.224001 22,9.5 22,9.775999 22.223999,10 22.5,10 22.776,10 23,9.775999 23,9.5 23,9.224001 22.776,9 22.5,9 z m 2,0 C 24.224,9 23.999999,9.224001 24,9.5 24,9.775999 24.223999,10 24.5,10 24.776,10 25,9.775999 25,9.5 25,9.224001 24.776,9 24.5,9 z m 2,0 C 26.224,9 25.999999,9.224001 26,9.5 26,9.775999 26.223999,10 26.5,10 26.776,10 27,9.775999 27,9.5 27,9.224001 26.776,9 26.5,9 z m 2,0 C 28.224,9 27.999999,9.224001 28,9.5 28,9.775999 28.223999,10 28.5,10 28.776,10 29,9.775999 29,9.5 29,9.224001 28.776,9 28.5,9 z m 2,0 C 30.224,9 30,9.224 30,9.5 30,9.776 30.224,10 30.5,10 30.776,10 31,9.776 31,9.5 31,9.224 30.776,9 30.5,9 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,11 20,10.775999 20,10.5 20,10.224001 19.776,10 19.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,11 22,10.775999 22,10.5 22,10.224001 21.776,10 21.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,11 24,10.775999 24,10.5 24,10.224001 23.776,10 23.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,11 26,10.775999 26,10.5 26,10.224001 25.776,10 25.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,11 28,10.775999 28,10.5 28,10.224001 27.776,10 27.5,10 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,11 30,10.775999 30,10.5 30,10.224001 29.776,10 29.5,10 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,12 19,11.775999 19,11.5 19,11.224001 18.776,11 18.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,12 21,11.775999 21,11.5 21,11.224001 20.776,11 20.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,12 23,11.775999 23,11.5 23,11.224001 22.776,11 22.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,12 25,11.775999 25,11.5 25,11.224001 24.776,11 24.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,12 27,11.775999 27,11.5 27,11.224001 26.776,11 26.5,11 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,12 29,11.775999 29,11.5 29,11.224001 28.776,11 28.5,11 z m 2,0 C 30.224,11 30,11.224 30,11.5 30,11.776 30.224,12 30.5,12 30.776,12 31,11.776 31,11.5 31,11.224 30.776,11 30.5,11 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,13 20,12.775999 20,12.5 20,12.224001 19.776,12 19.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,13 22,12.775999 22,12.5 22,12.224001 21.776,12 21.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,13 24,12.775999 24,12.5 24,12.224001 23.776,12 23.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,13 26,12.775999 26,12.5 26,12.224001 25.776,12 25.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,13 28,12.775999 28,12.5 28,12.224001 27.776,12 27.5,12 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,13 30,12.775999 30,12.5 30,12.224001 29.776,12 29.5,12 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,14 19,13.775999 19,13.5 19,13.224001 18.776,13 18.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,14 21,13.775999 21,13.5 21,13.224001 20.776,13 20.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,14 23,13.775999 23,13.5 23,13.224001 22.776,13 22.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,14 25,13.775999 25,13.5 25,13.224001 24.776,13 24.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,14 27,13.775999 27,13.5 27,13.224001 26.776,13 26.5,13 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,14 29,13.775999 29,13.5 29,13.224001 28.776,13 28.5,13 z m 2,0 C 30.224,13 30,13.224 30,13.5 30,13.776 30.224,14 30.5,14 30.776,14 31,13.776 31,13.5 31,13.224 30.776,13 30.5,13 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,15 20,14.775999 20,14.5 20,14.224001 19.776,14 19.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,15 22,14.775999 22,14.5 22,14.224001 21.776,14 21.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,15 24,14.775999 24,14.5 24,14.224001 23.776,14 23.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,15 26,14.775999 26,14.5 26,14.224001 25.776,14 25.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,15 28,14.775999 28,14.5 28,14.224001 27.776,14 27.5,14 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,15 30,14.775999 30,14.5 30,14.224001 29.776,14 29.5,14 z m -11,1 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,16 19,15.775999 19,15.5 19,15.224001 18.776,15 18.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,16 21,15.775999 21,15.5 21,15.224001 20.776,15 20.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,16 23,15.775999 23,15.5 23,15.224001 22.776,15 22.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,16 25,15.775999 25,15.5 25,15.224001 24.776,15 24.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,16 27,15.775999 27,15.5 27,15.224001 26.776,15 26.5,15 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,16 29,15.775999 29,15.5 29,15.224001 28.776,15 28.5,15 z m 2,0 C 30.224,15 30,15.224 30,15.5 30,15.776 30.224,16 30.5,16 30.776,16 31,15.776 31,15.5 31,15.224 30.776,15 30.5,15 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,17 20,16.776 20,16.5 20,16.224001 19.776,16 19.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,17 22,16.776 22,16.5 22,16.224001 21.776,16 21.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,17 24,16.776 24,16.5 24,16.224001 23.776,16 23.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,17 26,16.776 26,16.5 26,16.224001 25.776,16 25.5,16 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,17 28,16.776 28,16.5 28,16.224001 27.776,16 27.5,16 z m 2,0 c -0.276,0 -0.500001,0.224 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,17 30,16.775999 30,16.5 30,16.224001 29.776,16 29.5,16 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 18.776,18 19,17.776 19,17.5 19,17.224001 18.776,17 18.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 20.776,18 21,17.776 21,17.5 21,17.224001 20.776,17 20.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 22.776,18 23,17.776 23,17.5 23,17.224001 22.776,17 22.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 24.776,18 25,17.776 25,17.5 25,17.224001 24.776,17 24.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 26.776,18 27,17.776 27,17.5 27,17.224001 26.776,17 26.5,17 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 28.776,18 29,17.776 29,17.5 29,17.224001 28.776,17 28.5,17 z m 2,0 C 30.224,17 30,17.224 30,17.5 30,17.776 30.224,18 30.5,18 30.776,18 31,17.776 31,17.5 31,17.224 30.776,17 30.5,17 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 19.776,19 20,18.776 20,18.5 20,18.224001 19.776,18 19.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 21.776,19 22,18.776 22,18.5 22,18.224001 21.776,18 21.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 23.776,19 24,18.776 24,18.5 24,18.224001 23.776,18 23.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 25.776,19 26,18.776 26,18.5 26,18.224001 25.776,18 25.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 27.776,19 28,18.776 28,18.5 28,18.224001 27.776,18 27.5,18 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.5 0.5,0.5 C 29.776,19 30,18.776 30,18.5 30,18.224001 29.776,18 29.5,18 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 18.776,20 19,19.776 19,19.5 19,19.224001 18.776,19 18.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 20.776,20 21,19.776 21,19.5 21,19.224001 20.776,19 20.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,20 23,19.776 23,19.5 23,19.224001 22.776,19 22.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,20 25,19.776 25,19.5 25,19.224001 24.776,19 24.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,20 27,19.776 27,19.5 27,19.224001 26.776,19 26.5,19 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 28.776,20 29,19.776 29,19.5 29,19.224001 28.776,19 28.5,19 z m 2,0 C 30.224,19 30,19.224 30,19.5 30,19.776 30.224,20 30.5,20 30.776,20 31,19.776 31,19.5 31,19.224 30.776,19 30.5,19 z m -11,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 19.776,21 20,20.776 20,20.5 20,20.224001 19.776,20 19.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 21.776,21 22,20.776 22,20.5 22,20.224001 21.776,20 21.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,21 24,20.776 24,20.5 24,20.224001 23.776,20 23.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,21 26,20.776 26,20.5 26,20.224001 25.776,20 25.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 27.776,21 28,20.776 28,20.5 28,20.224001 27.776,20 27.5,20 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 29.776,21 30,20.776 30,20.5 30,20.224001 29.776,20 29.5,20 z m -9,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 20.776,22 21,21.776 21,21.5 21,21.224001 20.776,21 20.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,22 23,21.776 23,21.5 23,21.224001 22.776,21 22.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,22 25,21.776 25,21.5 25,21.224001 24.776,21 24.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,22 27,21.776 27,21.5 27,21.224001 26.776,21 26.5,21 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 28.776,22 29,21.776 29,21.5 29,21.224001 28.776,21 28.5,21 z m -7,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 21.776,23 22,22.776 22,22.5 22,22.224001 21.776,22 21.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,23 24,22.776 24,22.5 24,22.224001 23.776,22 23.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,23 26,22.776 26,22.5 26,22.224001 25.776,22 25.5,22 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 27.776,23 28,22.776 28,22.5 28,22.224001 27.776,22 27.5,22 z m -5,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 22.776,24 23,23.776 23,23.5 23,23.224001 22.776,23 22.5,23 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 24.776,24 25,23.776 25,23.5 25,23.224001 24.776,23 24.5,23 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 26.776,24 27,23.776 27,23.5 27,23.224001 26.776,23 26.5,23 z m -3,1 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 23.776,25 24,24.776 24,24.5 24,24.224001 23.776,24 23.5,24 z m 2,0 c -0.276,0 -0.500001,0.224001 -0.5,0.5 0,0.275999 0.223999,0.499999 0.5,0.5 C 25.776,25 26,24.776 26,24.5 26,24.224001 25.776,24 25.5,24 z" + id="path2902" + sodipodi:nodetypes="csssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssc" + style="opacity:0.5;fill:url(#linearGradient3567-2);fill-opacity:1;stroke:none;display:inline" /> + <rect + height="22.000008" + id="rect3575" + rx="6.0000024" + ry="6.0500031" + style="fill:none;stroke:url(#linearGradient16223);stroke-width:1.0000006;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="12.000005" + x="18.500008" + y="2.5000026" /> + </g> + <g + id="g32" + style="display:inline;enable-background:new" + transform="translate(16.061531,126)"> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path137" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="opacity:0.1;fill:url(#radialGradient3012-3);fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.47798,0,0,0.814173,3.385476,-7.268726)" /> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path139" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="opacity:0.7;fill:url(#radialGradient4505-3);fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.810444,0,0,0.814173,-4.534024,-3.31366)" /> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path145" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="fill:url(#radialGradient3691-5);fill-opacity:1;stroke:#555753;stroke-width:1.48521817;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + transform="matrix(0.677965,0,0,0.668671,-1.378282,1.706858)" /> + <path + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" + id="path147" + sodipodi:cx="23.82066" + sodipodi:cy="36.907261" + sodipodi:rx="12.59534" + sodipodi:ry="6.4081554" + sodipodi:type="arc" + style="fill:url(#radialGradient16225);fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.286831,0,0,0.28288,7.938768,14.79209)" /> + <path + d="m 16.644967,21.85413 c -1.142054,0.484748 -1.672249,1.353257 -2.41604,2.087798 -0.319437,0.202763 -0.393919,0.46765 -0.341337,0.841562 0.05258,0.373913 0.321497,0.695652 0.684545,0.802999 0.363045,0.107346 0.656563,0.08572 0.90508,-0.199163 0.72352,-1.44985 2.08215,-2.307875 3.563659,-3.051397 -0.741927,-0.210226 -1.542941,-0.390138 -2.395907,-0.481799 z" + id="path149" + sodipodi:nodetypes="ccssccc" + style="opacity:0.7;fill:url(#linearGradient3785-4);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" /> + <path + sodipodi:type="arc" + style="opacity:0.33632286;color:#000000;fill:url(#radialGradient11077-1);fill-opacity:1;stroke:none;stroke-width:2.99999905;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path11047" + sodipodi:cx="317.625" + sodipodi:cy="151.625" + sodipodi:rx="1.875" + sodipodi:ry="0.9375" + d="m 319.5,151.625 c 0,0.51777 -0.83947,0.9375 -1.875,0.9375 -1.03553,0 -1.875,-0.41973 -1.875,-0.9375 0,-0.51777 0.83947,-0.9375 1.875,-0.9375 1.03553,0 1.875,0.41973 1.875,0.9375 z" + transform="matrix(1.2333333,0,0,1.2333333,-377.05,-161.16042)" /> + <path + d="m 23.8125,31.5 c -3.339495,0 -6.371551,0.683256 -8.46875,1.75 -2.097199,1.066744 -3.125,2.416366 -3.125,3.65625 0,1.239884 1.027801,2.589506 3.125,3.65625 2.097199,1.066744 5.129255,1.750001 8.46875,1.75 3.339495,0 6.371551,-0.683256 8.46875,-1.75 2.097199,-1.066744 3.125,-2.416366 3.125,-3.65625 0,-1.239884 -1.027801,-2.589506 -3.125,-3.65625 C 30.184051,32.183256 27.151995,31.5 23.8125,31.5 z" + id="path151" + inkscape:original="M 23.8125 30.5 C 16.859872 30.5 11.21875 33.368948 11.21875 36.90625 C 11.21875 40.443552 16.859872 43.312502 23.8125 43.3125 C 30.765128 43.3125 36.406249 40.443552 36.40625 36.90625 C 36.40625 33.368948 30.765128 30.5 23.8125 30.5 z " + inkscape:radius="-0.99470079" + sodipodi:type="inkscape:offset" + style="opacity:0.4;fill:none;stroke:url(#linearGradient3709-2);stroke-width:1.48521817;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + transform="matrix(0.677965,0,0,0.668671,-1.378282,1.706858)" /> + <path + d="m 14.771278,18.805421 0,5.932594" + id="path153" + sodipodi:nodetypes="cc" + style="fill:none;stroke:url(#linearGradient3732-0);stroke-width:2.99999905;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" /> + <path + d="m 22.375002,13.702415 c -7e-6,2.825042 -3.317126,4.943828 -7.4375,4.943828 -4.120376,0 -7.4375035,-2.118786 -7.4375013,-4.943828" + id="path155" + sodipodi:nodetypes="csc" + style="fill:none;stroke:#888a85;stroke-width:2.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + height="1.9775307" + id="rect157" + style="fill:url(#linearGradient16227);fill-opacity:1;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="3.5773213" + x="6.5000014" + y="11.554473" /> + <rect + height="1.9775307" + id="rect159" + style="fill:url(#linearGradient3805-6);fill-opacity:1;stroke:#888a85;stroke-width:0.99999946;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="3.4738331" + x="20.026165" + y="11.554473" /> + <path + d="m 22.500011,12.999996 c 0,3.110755 -3.345,5.443827 -7.500003,5.443827 -4.155002,0 -7.5000061,-2.333072 -7.5000039,-5.443827" + id="path161" + sodipodi:nodetypes="csc" + style="fill:none;stroke:url(#linearGradient2987-1);stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + height="3.9550648" + id="rect163" + rx="0.68577099" + ry="0.64089966" + style="fill:url(#linearGradient2953-0);fill-opacity:1;stroke:none;display:inline" + width="2.1159859" + x="18.384014" + y="10.565716" /> + <path + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" + id="path165" + sodipodi:cx="14" + sodipodi:cy="19" + sodipodi:rx="0.5" + sodipodi:ry="0.5" + sodipodi:type="arc" + style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.985291,0,0,0.988766,6.724731,-6.737693)" /> + <rect + height="3.9550648" + id="rect167" + rx="0.69956332" + ry="0.64089966" + style="fill:url(#linearGradient2949-2);fill-opacity:1;stroke:none;display:inline" + width="2.1585429" + x="9" + y="10.565716" /> + <rect + height="15.485228" + id="rect169" + rx="4.4971528" + ry="4.5235372" + style="fill:url(#linearGradient2902-5);fill-opacity:1;stroke:url(#linearGradient10904-8);stroke-width:1.00000024;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + width="8.9943056" + x="10.500002" + y="1.5000007" /> + <path + d="m 14.771278,18.146244 0,6.591771" + id="path171" + sodipodi:nodetypes="cc" + style="fill:none;stroke:url(#linearGradient16229);stroke-width:0.9999997px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" /> + <path + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" + id="path173" + sodipodi:cx="14" + sodipodi:cy="19" + sodipodi:rx="0.5" + sodipodi:ry="0.5" + sodipodi:type="arc" + style="fill:#ffffff;fill-opacity:1;stroke:none" + transform="matrix(0.985291,0,0,0.988766,-6.41249,-6.737693)" /> + <g + id="g175" + inkscape:label="Shadow" + transform="translate(-9.25,46.68088)" /> + <g + id="g177" + inkscape:label="Shadow" + transform="translate(-9.25,61.74691)" /> + <g + id="g179" + inkscape:label="Lavoro" + style="display:inline" + transform="translate(-9.25,61.74691)" /> + <g + id="g181" + transform="matrix(0.61993,0,0,0.629204,-0.178118,0.738936)"> + <rect + height="15.374996" + id="rect183" + rx="2" + ry="2.1991496" + style="fill:url(#linearGradient2890-3);fill-opacity:1;stroke:none;display:inline" + width="4" + x="20" + y="6" /> + <path + d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,10 c 0,3.592133 2.882528,6.46875 6.46875,6.46875 3.586222,0 6.46875,-2.876617 6.46875,-6.46875 l 0,-10 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z" + id="path185" + inkscape:original="M 24.5 2.5 C 20.621999 2.5 17.5 5.615977 17.5 9.5 L 17.5 19.5 C 17.5 23.384022 20.621999 26.5 24.5 26.5 C 28.378001 26.5 31.5 23.384022 31.5 19.5 L 31.5 9.5 C 31.5 5.6159775 28.378001 2.5 24.5 2.5 z " + inkscape:radius="-0.54470092" + sodipodi:type="inkscape:offset" + style="opacity:0.2;fill:url(#linearGradient2892-2);fill-opacity:1;stroke:none;display:inline" + transform="translate(0,-1)" /> + <path + d="M 27,7.6875 C 27,9.378872 25.502952,10.75 23.65625,10.75 21.809548,10.75 20.3125,9.378872 20.3125,7.6875 20.3125,5.996128 21.809548,4.625 23.65625,4.625 25.502952,4.625 27,5.996128 27,7.6875 z" + id="path187" + sodipodi:cx="23.65625" + sodipodi:cy="7.6875" + sodipodi:rx="3.34375" + sodipodi:ry="3.0625" + sodipodi:type="arc" + style="fill:url(#linearGradient2894-0);fill-opacity:1;stroke:none" + transform="matrix(1,0,0,1.081633,-0.375,-1.252551)" /> + </g> + <path + d="m 15,2.4400583 c -2.217567,0 -4,1.8962005 -4,4.2640543 L 11,10 19,10 19,6.7041126 C 19,4.3362592 17.217568,2.4400583 15,2.4400583 z" + id="path189" + sodipodi:nodetypes="cccccc" + style="opacity:0.9;fill:url(#radialGradient2926-3);fill-opacity:1;stroke:none;display:inline" /> + <rect + height="13.472397" + id="rect191" + rx="3.4931109" + ry="3.7049098" + style="opacity:0.57847535;fill:none;stroke:url(#linearGradient16231);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="6.9862218" + x="11.500002" + y="2.4999995" /> + <path + id="path13145" + style="opacity:0.29142857;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="M 18,6.5 C 18,6.776 17.776,7 17.5,7 17.224,7 17,6.776 17,6.5 17,6.224 17.224,6 17.5,6 17.776,6 18,6.224 18,6.5 z m 0,4 C 18,10.776 17.776,11 17.5,11 17.224,11 17,10.776 17,10.5 17,10.224 17.224,10 17.5,10 c 0.276,0 0.5,0.224 0.5,0.5 z m 0,-2 C 18,8.776 17.776,9 17.5,9 17.224,9 17,8.776 17,8.5 17,8.224 17.224,8 17.5,8 17.776,8 18,8.224 18,8.5 z m 0,4 C 18,12.776 17.776,13 17.5,13 17.224,13 17,12.776 17,12.5 17,12.224 17.224,12 17.5,12 c 0.276,0 0.5,0.224 0.5,0.5 z m -4,-8 C 14,4.776 13.776,5 13.5,5 13.224,5 13,4.776 13,4.5 13,4.224 13.224,4 13.5,4 13.776,4 14,4.224 14,4.5 z m 2,0 C 16,4.776 15.776,5 15.5,5 15.224,5 15,4.776 15,4.5 15,4.224 15.224,4 15.5,4 15.776,4 16,4.224 16,4.5 z m -1,1 C 15,5.776 14.776,6 14.5,6 14.224,6 14,5.776 14,5.5 14,5.224 14.224,5 14.5,5 14.776,5 15,5.224 15,5.5 z m -2,0 C 13,5.776 12.776,6 12.5,6 12.224,6 12,5.776 12,5.5 12,5.224 12.224,5 12.5,5 12.776,5 13,5.224 13,5.5 z m 2,-2 C 15,3.776 14.776,4 14.5,4 14.224,4 14,3.776 14,3.5 14,3.224 14.224,3 14.5,3 14.776,3 15,3.224 15,3.5 z m 2,2 C 17,5.776 16.776,6 16.5,6 16.224,6 16,5.776 16,5.5 16,5.224 16.224,5 16.5,5 16.776,5 17,5.224 17,5.5 z m -1,1 C 16,6.776 15.776,7 15.5,7 15.224,7 15,6.776 15,6.5 15,6.224 15.224,6 15.5,6 15.776,6 16,6.224 16,6.5 z m -2,0 C 14,6.776 13.776,7 13.5,7 13.224,7 13,6.776 13,6.5 13,6.224 13.224,6 13.5,6 13.776,6 14,6.224 14,6.5 z m 0,2 C 14,8.776 13.776,9 13.5,9 13.224,9 13,8.776 13,8.5 13,8.224 13.224,8 13.5,8 13.776,8 14,8.224 14,8.5 z m 2,0 C 16,8.776 15.776,9 15.5,9 15.224,9 15,8.776 15,8.5 15,8.224 15.224,8 15.5,8 15.776,8 16,8.224 16,8.5 z m -1,1 C 15,9.776 14.776,10 14.5,10 14.224,10 14,9.776 14,9.5 14,9.224 14.224,9 14.5,9 14.776,9 15,9.224 15,9.5 z m -2,0 C 13,9.776 12.776,10 12.5,10 12.224,10 12,9.776 12,9.5 12,9.224 12.224,9 12.5,9 12.776,9 13,9.224 13,9.5 z m 2,-2 C 15,7.776 14.776,8 14.5,8 14.224,8 14,7.776 14,7.5 14,7.224 14.224,7 14.5,7 14.776,7 15,7.224 15,7.5 z m -2,0 C 13,7.776 12.776,8 12.5,8 12.224,8 12,7.776 12,7.5 12,7.224 12.224,7 12.5,7 12.776,7 13,7.224 13,7.5 z m 4,0 C 17,7.776 16.776,8 16.5,8 16.224,8 16,7.776 16,7.5 16,7.224 16.224,7 16.5,7 16.776,7 17,7.224 17,7.5 z m 0,2 C 17,9.776 16.776,10 16.5,10 16.224,10 16,9.776 16,9.5 16,9.224 16.224,9 16.5,9 16.776,9 17,9.224 17,9.5 z m -1,1 C 16,10.776 15.776,11 15.5,11 15.224,11 15,10.776 15,10.5 15,10.224 15.224,10 15.5,10 c 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 C 14,10.776 13.776,11 13.5,11 13.224,11 13,10.776 13,10.5 13,10.224 13.224,10 13.5,10 c 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 C 14,12.776 13.776,13 13.5,13 13.224,13 13,12.776 13,12.5 13,12.224 13.224,12 13.5,12 c 0.276,0 0.5,0.224 0.5,0.5 z m 2,0 C 16,12.776 15.776,13 15.5,13 15.224,13 15,12.776 15,12.5 15,12.224 15.224,12 15.5,12 c 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 C 15,13.776 14.776,14 14.5,14 14.224,14 14,13.776 14,13.5 14,13.224 14.224,13 14.5,13 c 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 C 13,13.776 12.776,14 12.5,14 12.224,14 12,13.776 12,13.5 12,13.224 12.224,13 12.5,13 c 0.276,0 0.5,0.224 0.5,0.5 z m 2,-2 C 15,11.776 14.776,12 14.5,12 14.224,12 14,11.776 14,11.5 14,11.224 14.224,11 14.5,11 c 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 C 13,11.776 12.776,12 12.5,12 12.224,12 12,11.776 12,11.5 12,11.224 12.224,11 12.5,11 c 0.276,0 0.5,0.224 0.5,0.5 z m 4,0 C 17,11.776 16.776,12 16.5,12 16.224,12 16,11.776 16,11.5 16,11.224 16.224,11 16.5,11 c 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 C 17,13.776 16.776,14 16.5,14 16.224,14 16,13.776 16,13.5 16,13.224 16.224,13 16.5,13 c 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 C 16,14.776 15.776,15 15.5,15 15.224,15 15,14.776 15,14.5 15,14.224 15.224,14 15.5,14 c 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 C 14,14.776 13.776,15 13.5,15 13.224,15 13,14.776 13,14.5 13,14.224 13.224,14 13.5,14 c 0.276,0 0.5,0.224 0.5,0.5 z" /> + </g> + <g + transform="translate(13.401161,174.875)" + style="display:inline;enable-background:new" + id="g10906"> + <path + transform="matrix(0.47798,0,0,0.814173,1.9843165,-7.192587)" + style="opacity:0.1;fill:url(#radialGradient10966-5);fill-opacity:1;stroke:none;display:inline" + sodipodi:type="arc" + sodipodi:ry="6.4081554" + sodipodi:rx="12.59534" + sodipodi:cy="36.907261" + sodipodi:cx="23.82066" + id="path10908" + d="m 36.415999,36.907261 c 0,3.539126 -5.639125,6.408155 -12.595339,6.408155 -6.956214,0 -12.59534,-2.869029 -12.59534,-6.408155 0,-3.539127 5.639126,-6.408156 12.59534,-6.408156 6.956214,0 12.595339,2.869029 12.595339,6.408156 z" /> + <path + style="fill:none;stroke:url(#linearGradient10982-6);stroke-width:2.99999905;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + sodipodi:nodetypes="cs" + id="path10924" + d="m 14.1875,19.004906 0,4.474186" /> + <path + style="color:#000000;fill:none;stroke:url(#linearGradient16233);stroke-width:2.99999905;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="csc" + id="path10926" + d="m 21.011545,13.740851 c -7e-6,2.868131 -3.105108,5.019234 -6.962124,5.019234 -3.857017,0 -6.9621263,-2.151103 -6.9621242,-5.019234" /> + <rect + y="11.630612" + x="6.1250019" + width="3.5773213" + style="fill:url(#linearGradient16235);fill-opacity:1;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + id="rect10928" + height="1.9775307" /> + <rect + y="11.630612" + x="18.625006" + width="3.4738331" + style="fill:url(#linearGradient10986-3);fill-opacity:1;stroke:#888a85;stroke-width:0.99999946;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + id="rect10930" + height="1.9775307" /> + <path + style="fill:none;stroke:url(#linearGradient10988-7);stroke-width:0.96900517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + sodipodi:nodetypes="csc" + id="path10932" + d="m 21.114348,13.060638 c 0,3.128466 -3.123079,5.474821 -7.002422,5.474821 -3.879343,0 -7.0024255,-2.346355 -7.0024234,-5.474821" /> + <rect + y="10.125" + x="16.982855" + width="2.6421452" + style="fill:url(#linearGradient10990-3);fill-opacity:1;stroke:none;display:inline" + ry="0.64089966" + rx="0.68577099" + id="rect10934" + height="4" /> + <path + transform="matrix(0.985291,0,0,0.988766,5.3235715,-6.661554)" + style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline" + sodipodi:type="arc" + sodipodi:ry="0.5" + sodipodi:rx="0.5" + sodipodi:cy="19" + sodipodi:cx="14" + id="path10936" + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" /> + <rect + y="10.125" + x="8.6511602" + width="2.1323836" + style="fill:url(#linearGradient10992-5);fill-opacity:1;stroke:none;display:inline" + ry="0.64089966" + rx="0.69956332" + id="rect10938" + height="4" /> + <rect + y="3.5683403" + x="10.06834" + width="8.0814676" + style="fill:url(#linearGradient10994-5);fill-opacity:1;stroke:url(#linearGradient10996-1);stroke-width:0.88668066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + ry="4.5235372" + rx="4.4971528" + id="rect10940" + height="13.549686" /> + <path + transform="matrix(0.985291,0,0,0.988766,-6.7874895,-6.661554)" + style="fill:#ffffff;fill-opacity:1;stroke:none" + sodipodi:type="arc" + sodipodi:ry="0.5" + sodipodi:rx="0.5" + sodipodi:cy="19" + sodipodi:cx="14" + id="path10944" + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" /> + <g + transform="translate(-9.25,46.68088)" + inkscape:label="Shadow" + id="g10946" /> + <g + transform="translate(-9.25,61.74691)" + inkscape:label="Shadow" + id="g10948" /> + <g + transform="translate(-9.25,61.74691)" + style="display:inline" + inkscape:label="Lavoro" + id="g10950" /> + <g + transform="matrix(0.61993,0,0,0.629204,-1.5792775,0.815075)" + id="g10952"> + <rect + y="7.6444602" + x="20" + width="4" + style="fill:url(#linearGradient11000-8);fill-opacity:1;stroke:none;display:inline" + ry="2.1991496" + rx="2" + id="rect10954" + height="13.730536" /> + <path + transform="matrix(1,0,0,0.85921544,0,2.655999)" + style="opacity:0.2;fill:url(#linearGradient11002-1);fill-opacity:1;stroke:none;display:inline" + sodipodi:type="inkscape:offset" + inkscape:radius="-0.54470092" + inkscape:original="M 24.5 2.5 C 20.621999 2.5 17.5 5.615977 17.5 9.5 L 17.5 19.5 C 17.5 23.384022 20.621999 26.5 24.5 26.5 C 28.378001 26.5 31.5 23.384022 31.5 19.5 L 31.5 9.5 C 31.5 5.6159775 28.378001 2.5 24.5 2.5 z " + id="path10956" + d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,10 c 0,3.592133 2.882528,6.46875 6.46875,6.46875 3.586222,0 6.46875,-2.876617 6.46875,-6.46875 l 0,-10 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z" /> + <path + transform="matrix(1,0,0,1.081633,-0.375,1.9260683)" + style="fill:url(#linearGradient11004-7);fill-opacity:1;stroke:none" + sodipodi:type="arc" + sodipodi:ry="3.0625" + sodipodi:rx="3.34375" + sodipodi:cy="7.6875" + sodipodi:cx="23.65625" + id="path10958" + d="M 27,7.6875 C 27,9.378872 25.502952,10.75 23.65625,10.75 21.809548,10.75 20.3125,9.378872 20.3125,7.6875 20.3125,5.996128 21.809548,4.625 23.65625,4.625 25.502952,4.625 27,5.996128 27,7.6875 z" /> + </g> + <path + style="opacity:0.9;fill:url(#radialGradient11006-6);fill-opacity:1;stroke:none;display:inline" + sodipodi:nodetypes="cccccc" + id="path10960" + d="m 13.59884,4.125 c -2.217567,0 -4,1.4926772 -4,3.356637 l 0,2.594502 8,0 0,-2.594502 c 0,-1.8639595 -1.782432,-3.356637 -4,-3.356637 z" /> + <rect + y="4.5575728" + x="11.057572" + width="6.0949187" + style="opacity:0.33632286;fill:none;stroke:url(#linearGradient11008-8);stroke-width:0.86514533;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + ry="3.7049098" + rx="3.4931111" + id="rect10962" + height="11.55839" /> + <path + style="opacity:0.29142857;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="path10964" + d="m 14.625,5.576139 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,-2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 4,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,-2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 4,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z" + sodipodi:nodetypes="csssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssc" /> + <path + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient11093-2);fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" + d="m 8.96875,22.125 c -0.7853982,0.04091 -1.4627805,0.792727 -1.4218743,1.578125 0,0 0.015624,1.421875 0.015624,1.421875 l 14.0625003,0 c 0,0 0.02136,-1.5 0.02136,-1.5 0.01129,-0.792468 -0.728894,-1.511207 -1.521363,-1.5 l -11.0000003,0 c -0.052036,-0.0027 -0.1042138,-0.0027 -0.15625,0 z" + id="path11081" + sodipodi:nodetypes="csccsccc" /> + <path + style="fill:none;stroke:url(#linearGradient10998-4);stroke-width:0.99999958px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" + sodipodi:nodetypes="cc" + id="path10942" + d="m 14.156249,18.592069 0,5.032931" /> + <path + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#d3d7cf;fill-opacity:1;stroke:none;stroke-width:0.99999958px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" + d="m 9,23.125 c -0.2618129,0.02453 -0.4777049,0.285067 -0.4531601,0.546878 0,0 0.01566,0.453122 0.01566,0.453122 l 12.0937501,0 c 0,0 -0.02414,-0.5 -0.02414,-0.5 -0.01274,-0.26387 -0.242955,-0.503728 -0.507106,-0.5 l -11.0312501,0 c -0.031158,-0.0029 -0.062592,-0.0029 -0.09375,0 z" + id="path11085" + sodipodi:nodetypes="csccsccc" /> + </g> + <g + id="g13061" + style="display:inline;enable-background:new" + transform="translate(12.509548,217.875)"> + <path + d="m 19.000001,13.740851 c -7e-6,2.219512 -2.656534,3.88415 -5.956352,3.88415 -3.2998194,0 -5.956354,-1.664638 -5.9563522,-3.88415" + id="path13067" + sodipodi:nodetypes="csc" + style="color:#000000;fill:none;stroke:url(#linearGradient17466);stroke-width:2.99999905;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + height="1.9775307" + id="rect13069" + style="fill:url(#linearGradient17468);fill-opacity:1;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="3.5773213" + x="6.1250019" + y="11.630612" /> + <rect + height="1.9775307" + id="rect13071" + style="fill:url(#linearGradient17470);fill-opacity:1;stroke:#888a85;stroke-width:0.9999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="3.0000002" + x="17" + y="11.630612" /> + <path + d="m 19.015497,13.060638 c 0,2.61706 -2.655035,4.579859 -5.952996,4.579859 -3.2979617,0 -5.9530002,-1.962799 -5.9529984,-4.579859" + id="path13073" + sodipodi:nodetypes="csc" + style="fill:none;stroke:url(#linearGradient17472);stroke-width:0.96900517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + height="3.8897185" + id="rect13079" + rx="0.69956332" + ry="0.6232298" + style="fill:url(#linearGradient17474);fill-opacity:1;stroke:none;display:inline" + width="2.1323836" + x="8.6511602" + y="9.942359" /> + <rect + height="13.113468" + id="rect13081" + rx="4.5148778" + ry="4.3779068" + style="fill:url(#linearGradient17476);fill-opacity:1;stroke:url(#linearGradient17478);stroke-width:0.88668066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + width="8.1133194" + x="8.9433403" + y="3.5683405" /> + <path + d="m 14.5,19 c 0,0.276142 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.223858 -0.5,-0.5 0,-0.276142 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.223858 0.5,0.5 z" + id="path13083" + sodipodi:cx="14" + sodipodi:cy="19" + sodipodi:rx="0.5" + sodipodi:ry="0.5" + sodipodi:type="arc" + style="fill:#ffffff;fill-opacity:1;stroke:none" + transform="matrix(0.985291,0,0,0.988766,-6.7874895,-6.661554)" /> + <g + id="g13085" + inkscape:label="Shadow" + transform="translate(-9.25,46.68088)" /> + <g + id="g13087" + inkscape:label="Shadow" + transform="translate(-9.25,61.74691)" /> + <g + id="g13089" + inkscape:label="Lavoro" + style="display:inline" + transform="translate(-9.25,61.74691)" /> + <g + id="g13091" + transform="matrix(0.61993,0,0,0.6118566,-2.3917775,0.82833518)"> + <rect + height="13.730536" + id="rect13093" + rx="2" + ry="2.1991496" + style="fill:url(#linearGradient17480);fill-opacity:1;stroke:none;display:inline" + width="4" + x="20" + y="7.6444602" /> + <path + d="m 24.5,3.03125 c -3.586223,0 -6.46875,2.8766161 -6.46875,6.46875 l 0,10 c 0,3.592133 2.882528,6.46875 6.46875,6.46875 3.586222,0 6.46875,-2.876617 6.46875,-6.46875 l 0,-10 c 0,-3.5921334 -2.882527,-6.46875 -6.46875,-6.46875 z" + id="path13095" + inkscape:original="M 24.5 2.5 C 20.621999 2.5 17.5 5.615977 17.5 9.5 L 17.5 19.5 C 17.5 23.384022 20.621999 26.5 24.5 26.5 C 28.378001 26.5 31.5 23.384022 31.5 19.5 L 31.5 9.5 C 31.5 5.6159775 28.378001 2.5 24.5 2.5 z " + inkscape:radius="-0.54470092" + sodipodi:type="inkscape:offset" + style="opacity:0.2;fill:url(#linearGradient17482);fill-opacity:1;stroke:none;display:inline" + transform="matrix(0.9110182,0,0,0.85921544,2.7556552,2.655999)" /> + <path + d="M 27,7.6875 C 27,9.378872 25.502952,10.75 23.65625,10.75 21.809548,10.75 20.3125,9.378872 20.3125,7.6875 20.3125,5.996128 21.809548,4.625 23.65625,4.625 25.502952,4.625 27,5.996128 27,7.6875 z" + id="path13097" + sodipodi:cx="23.65625" + sodipodi:cy="7.6875" + sodipodi:rx="3.34375" + sodipodi:ry="3.0625" + sodipodi:type="arc" + style="fill:url(#linearGradient17484);fill-opacity:1;stroke:none" + transform="matrix(1,0,0,1.081633,-0.375,1.9260683)" /> + </g> + <path + d="m 13,4.0470042 c -1.940371,0 -3.5,1.4515235 -3.5,3.2640932 l 0,2.5229706 7,0 0,-2.5229706 C 16.5,5.498528 14.940372,4.0470042 13,4.0470042 z" + id="path13099" + sodipodi:nodetypes="cccccc" + style="opacity:0.9;fill:url(#radialGradient17486);fill-opacity:1;stroke:none;display:inline" /> + <rect + height="11.149798" + id="rect13101" + rx="3.5159991" + ry="3.5739405" + style="opacity:0.33632286;fill:none;stroke:url(#linearGradient17488);stroke-width:0.86514533;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" + width="6.1348543" + x="9.9325743" + y="4.5575728" /> + <path + sodipodi:nodetypes="csssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssccsssc" + d="m 13.5,5.625 c 0,0.2759999 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.2240001 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 1,1 c 0,0.2759999 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.2240001 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.2759999 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.2240001 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,-2 c 0,0.2759999 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.2240001 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.2759999 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.2240001 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 4,0 c 0,0.2759999 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.2240001 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 2,-2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 4,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m 0,2 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -1,1 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z m -2,0 c 0,0.276 -0.224,0.5 -0.5,0.5 -0.276,0 -0.5,-0.224 -0.5,-0.5 0,-0.276 0.224,-0.5 0.5,-0.5 0.276,0 0.5,0.224 0.5,0.5 z" + id="path13103" + style="opacity:0.29142857;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + </g> + <g + id="g25435"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path25404" + style="color:#000000;fill:url(#radialGradient25806);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25808);stroke-width:0.50264549;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path25433" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + id="use25439" + transform="translate(0,10)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient25790);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25792);stroke-width:0.50264549;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25786" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25788" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + id="use25441" + transform="translate(0,20)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient25780);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25782);stroke-width:0.50264549;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25776" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25778" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + id="g26124" + transform="matrix(0.67041768,0,0,0.67041768,5.9921062,90.918773)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26142);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26144);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26126" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26128" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,5.9921062,98.91877)" + id="g26154"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26156" + style="color:#000000;fill:url(#radialGradient26160);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26162);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26158" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + id="g26164" + transform="matrix(0.67041768,0,0,0.67041768,5.9921062,106.91877)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26170);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26172);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26166" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26168" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + style="display:inline;enable-background:new" + transform="matrix(0.67041768,0,0,0.67041768,-7.04824,185.95912)" + id="g26984-6"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26986-5" + style="color:#000000;fill:url(#radialGradient27000-8);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27002-8);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26988-8" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26990-9" + transform="matrix(0.67041768,0,0,0.67041768,-7.00789,190.95912)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient27004-3);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27006-2);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26992-0" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26994-6" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + id="g27137" + transform="matrix(0.67041768,0,0,0.67041768,-7.04824,180.95912)" + style="display:inline;enable-background:new"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient27143);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27145);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path27139" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path27141" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + id="g26551-4" + transform="matrix(0.67041768,0,0,0.67041768,-0.00789045,145.91877)" + style="display:inline;enable-background:new"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26567-4-6);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26569-6-9);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26553-9" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26555-4" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,-0.00789045,153.91877)" + id="g26557-2" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26559-7" + style="color:#000000;fill:url(#radialGradient26571-6-8);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26573-1-0);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26561-5" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="display:inline;enable-background:new" + transform="matrix(0.67041768,0,0,0.67041768,-0.00789045,137.91877)" + id="g26833"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26835" + style="color:#000000;fill:url(#radialGradient26839-2);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26841-1);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26837" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + </g> + </g> + <g + id="g12096" + inkscape:groupmode="layer" + style="display:inline" + inkscape:label="medium" + transform="translate(6,50)"> + <g + id="g12098" + inkscape:groupmode="layer" + style="display:none" + inkscape:label="baseplate 1"> + <rect + id="rect12102" + x="162" + y="51" + inkscape:label="48x48" + height="48" + width="48" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12104" + x="162" + y="126" + inkscape:label="32x32" + height="32" + width="32" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12106" + x="162" + y="177" + inkscape:label="24x24" + height="24" + width="24" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12108" + x="163" + y="178" + inkscape:label="22x22" + height="22" + width="22" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12110" + x="162" + y="221" + inkscape:label="16x16" + height="16" + width="16" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <text + id="text12112" + x="160" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="context" + y="-8" + sodipodi:linespacing="125%"> + <tspan + id="tspan12114" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">status</tspan> + </text> + <text + id="text12116" + x="161" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="icon-name" + y="14" + sodipodi:linespacing="125%"> + <tspan + id="tspan12118" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">audio-input-microphone-medium</tspan> + </text> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="icons#1"> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#g48" + id="use16262" + width="1" + height="1" + transform="translate(144,0)" /> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#g32" + id="use16264" + width="1" + height="1" + transform="translate(144,0)" /> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#g10906" + id="use16266" + width="1" + height="1" + transform="translate(144,0)" /> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#g13061" + id="use16268" + width="1" + height="1" + transform="translate(143.90625,0)" /> + <g + style="display:inline;enable-background:new" + id="use25439-9" + transform="translate(144,10)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient25790-7);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25792-3);stroke-width:0.50264549;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25786-6" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25788-2" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + style="display:inline;enable-background:new" + id="use25441-3" + transform="translate(144,20)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient25780-1);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25782-9);stroke-width:0.50264549;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25776-3" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25778-0" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <path + transform="matrix(1.0275229,0,0,1.0275229,-180.06421,-45.70642)" + d="m 374.25,106.28125 c 0,1.60508 -1.30117,2.90625 -2.90625,2.90625 -1.60508,0 -2.90625,-1.30117 -2.90625,-2.90625 0,-1.60508 1.30117,-2.90625 2.90625,-2.90625 1.60508,0 2.90625,1.30117 2.90625,2.90625 z" + sodipodi:ry="2.90625" + sodipodi:rx="2.90625" + sodipodi:cy="106.28125" + sodipodi:cx="371.34375" + id="path25944" + style="color:#000000;fill:url(#radialGradient25967);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25969);stroke-width:0.97321433;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <g + style="display:inline;enable-background:new" + id="g26124-3" + transform="matrix(0.67041768,0,0,0.67041768,149.99211,90.918773)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient25967-75);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25969-5);stroke-width:0.74974976999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-linecap:round;stroke-linejoin:round;stroke-dashoffset:0.53926947999999997" + id="path26126-2" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + </g> + <g + style="display:inline;enable-background:new" + transform="matrix(0.67041768,0,0,0.67041768,149.99211,98.918773)" + id="g26154-1"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26156-2" + style="color:#000000;fill:url(#radialGradient26160-3);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26162-9);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26158-3" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26164-2" + transform="matrix(0.67041768,0,0,0.67041768,149.99211,106.91877)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26170-6);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26172-5);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26166-2" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26168-0" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,143.99211,137.91877)" + id="g26547-2-4" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26549-3-7" + style="color:#000000;fill:url(#radialGradient26754);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26756);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + id="g26551-4-6" + transform="matrix(0.67041768,0,0,0.67041768,143.99211,145.91877)" + style="display:inline;enable-background:new"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26567-4-1);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26569-6-5);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26553-9-2" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26555-4-4" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,143.99211,153.91877)" + id="g26557-2-9" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26559-7-4" + style="color:#000000;fill:url(#radialGradient26571-6-3);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26573-1-6);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26561-5-9" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26980" + transform="matrix(0.67041768,0,0,0.67041768,136.99211,180.95912)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26996);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26998);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26982" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + </g> + <g + style="display:inline;enable-background:new" + transform="matrix(0.67041768,0,0,0.67041768,136.95176,185.95912)" + id="g26984"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26986" + style="color:#000000;fill:url(#radialGradient27000);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27002);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26988" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26990" + transform="matrix(0.67041768,0,0,0.67041768,136.99211,190.95912)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient27004);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27006);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26992" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26994" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + </g> + </g> + <g + id="g12120" + inkscape:groupmode="layer" + style="display:inline" + inkscape:label="low" + transform="translate(6,50)"> + <g + id="g12122" + inkscape:groupmode="layer" + style="display:none" + inkscape:label="baseplate 2"> + <rect + id="rect12126" + x="322" + y="51" + inkscape:label="48x48" + height="48" + width="48" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12128" + x="322" + y="126" + inkscape:label="32x32" + height="32" + width="32" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12130" + x="322" + y="177" + inkscape:label="24x24" + height="24" + width="24" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12132" + x="323" + y="178" + inkscape:label="22x22" + height="22" + width="22" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12134" + x="322" + y="221" + inkscape:label="16x16" + height="16" + width="16" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <text + id="text12136" + x="336" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="context" + y="-11" + sodipodi:linespacing="125%"> + <tspan + id="tspan12138" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">status</tspan> + </text> + <text + id="text12140" + x="335" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="icon-name" + y="14" + sodipodi:linespacing="125%"> + <tspan + id="tspan12142" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">audio-input-microphone-low</tspan> + </text> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="icons#2"> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16262" + id="use17490" + width="1" + height="1" + transform="translate(160.00001,0)" /> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16264" + id="use17492" + width="1" + height="1" + transform="translate(160.00001,0)" /> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16266" + id="use17494" + width="1" + height="1" + transform="translate(160.00001,0)" /> + <use + style="display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16268" + id="use17496" + width="1" + height="1" + transform="translate(160.00001,0)" /> + <g + style="display:inline;enable-background:new" + id="use25441-3-6" + transform="translate(304,20)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient25780-1-1);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25782-9-6);stroke-width:0.50264549;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25776-3-6" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path25778-0-5" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <path + transform="matrix(1.0275229,0,0,1.0275229,-20.06421,-45.70642)" + d="m 374.25,106.28125 c 0,1.60508 -1.30117,2.90625 -2.90625,2.90625 -1.60508,0 -2.90625,-1.30117 -2.90625,-2.90625 0,-1.60508 1.30117,-2.90625 2.90625,-2.90625 1.60508,0 2.90625,1.30117 2.90625,2.90625 z" + sodipodi:ry="2.90625" + sodipodi:rx="2.90625" + sodipodi:cy="106.28125" + sodipodi:cx="371.34375" + id="path25944-9" + style="color:#000000;fill:url(#radialGradient25967-7);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient25969-0);stroke-width:0.97321433;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26120);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26122);stroke-width:0.97321433;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.69999992;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26118" + sodipodi:cx="371.34375" + sodipodi:cy="106.28125" + sodipodi:rx="2.90625" + sodipodi:ry="2.90625" + d="m 374.25,106.28125 c 0,1.60508 -1.30117,2.90625 -2.90625,2.90625 -1.60508,0 -2.90625,-1.30117 -2.90625,-2.90625 0,-1.60508 1.30117,-2.90625 2.90625,-2.90625 1.60508,0 2.90625,1.30117 2.90625,2.90625 z" + transform="matrix(1.0275229,0,0,1.0275229,-20.06421,-35.70642)" /> + <g + style="display:inline;enable-background:new" + id="g26124-3-6" + transform="matrix(0.67041768,0,0,0.67041768,309.99211,90.918773)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26407);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26409);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26126-2-0" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26164-2-0" + transform="matrix(0.67041768,0,0,0.67041768,309.99211,106.91877)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26170-6-7);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26172-5-5);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26166-2-4" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26168-0-2" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,309.99211,98.918773)" + id="g26486" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26488" + style="color:#000000;fill:url(#radialGradient26490);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26492);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,303.99211,137.91877)" + id="g26547-2-4-7" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26549-3-7-3" + style="color:#000000;fill:url(#radialGradient26893);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26895);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,303.99211,153.91877)" + id="g26557-2-9-9" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path26559-7-4-3" + style="color:#000000;fill:url(#radialGradient26571-6-3-7);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26573-1-6-5);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + sodipodi:ry="0.953125" + sodipodi:rx="1.859375" + sodipodi:cy="112.14062" + sodipodi:cx="63.359375" + id="path26561-5-9-1" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26972" + transform="matrix(0.67041768,0,0,0.67041768,303.99211,145.91877)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient26976);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient26978);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26974" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26980-1" + transform="matrix(0.67041768,0,0,0.67041768,296.99211,180.95912)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient27058-3);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27060-7);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26982-2" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + </g> + <g + style="display:inline;enable-background:new" + id="g26990-5" + transform="matrix(0.67041768,0,0,0.67041768,296.99211,190.95912)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:url(#radialGradient27004-7);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27006-9);stroke-width:0.74974972;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26992-9" + sodipodi:cx="63.46875" + sodipodi:cy="113.48438" + sodipodi:rx="1.484375" + sodipodi:ry="1.484375" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path26994-1" + sodipodi:cx="63.359375" + sodipodi:cy="112.14062" + sodipodi:rx="1.859375" + sodipodi:ry="0.953125" + d="m 65.21875,112.14062 c 0,0.52639 -0.832471,0.95312 -1.859375,0.95312 -1.026904,0 -1.859375,-0.42673 -1.859375,-0.95312 0,-0.5264 0.832471,-0.95313 1.859375,-0.95313 1.026904,0 1.859375,0.42673 1.859375,0.95313 z" + transform="matrix(0.92436975,0,0,1.0819672,-1.0674895,-59.269979)" /> + </g> + <g + transform="matrix(0.67041768,0,0,0.67041768,296.99211,185.95912)" + id="g27222" + style="display:inline;enable-background:new"> + <path + transform="matrix(1.9894737,0,0,1.9894737,-68.800658,-162.28981)" + d="m 64.953125,113.48438 c 0,0.8198 -0.664577,1.48438 -1.484375,1.48438 -0.819798,0 -1.484375,-0.66458 -1.484375,-1.48438 0,-0.8198 0.664577,-1.48437 1.484375,-1.48437 0.819798,0 1.484375,0.66457 1.484375,1.48437 z" + sodipodi:ry="1.484375" + sodipodi:rx="1.484375" + sodipodi:cy="113.48438" + sodipodi:cx="63.46875" + id="path27224" + style="color:#000000;fill:url(#radialGradient27226);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient27228);stroke-width:0.74974978;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.53926948;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + </g> + </g> + <g + id="g12144" + inkscape:groupmode="layer" + style="display:inline" + inkscape:label="muted" + transform="translate(6,50)"> + <g + id="g12146" + inkscape:groupmode="layer" + style="display:none" + inkscape:label="baseplate 3"> + <rect + id="rect12150" + x="506" + y="51" + inkscape:label="48x48" + height="48" + width="48" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12152" + x="506" + y="126" + inkscape:label="32x32" + height="32" + width="32" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12154" + x="506" + y="177" + inkscape:label="24x24" + height="24" + width="24" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12156" + x="507" + y="178" + inkscape:label="22x22" + height="22" + width="22" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <rect + id="rect12158" + x="506" + y="221" + inkscape:label="16x16" + height="16" + width="16" + style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;visibility:visible;display:inline;enable-background:accumulate" /> + <text + id="text12160" + x="509" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="context" + y="-14" + sodipodi:linespacing="125%"> + <tspan + id="tspan12162" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">status</tspan> + </text> + <text + id="text12164" + x="509" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold" + inkscape:label="icon-name" + y="14" + sodipodi:linespacing="125%"> + <tspan + id="tspan12166" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:RaveIn;-inkscape-font-specification:RaveIn Bold">audio-input-microphone-muted</tspan> + </text> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="icons#3" + style="opacity:1"> + <use + style="opacity:0.5;display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16262" + id="use17490-9" + width="1" + height="1" + transform="translate(344.00001,0)" /> + <use + style="opacity:0.5;display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16264" + id="use17492-5" + width="1" + height="1" + transform="translate(344.00001,0)" /> + <use + style="opacity:0.5;display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16266" + id="use17494-2" + width="1" + height="1" + transform="translate(344.00001,0)" /> + <use + style="opacity:0.5;display:inline;enable-background:new" + x="0" + y="0" + xlink:href="#use16268" + id="use17496-3" + width="1" + height="1" + transform="translate(344.00001,0)" /> + <g + style="display:inline;enable-background:new" + id="g20762" + transform="translate(-1009.9765,1.99158)"> + <g + transform="translate(816.00404,-305.99658)" + id="g10428" + style="display:inline;enable-background:new"> + <rect + style="opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter10244-3);enable-background:new" + id="rect10362" + width="9" + height="1.5" + x="723" + y="461" + rx="0.75" + ry="0.75" + transform="matrix(1.4444453,0,0,1,-314.33396,-61)" /> + <g + id="g10364" + transform="matrix(1.200385,0,0,1.2002319,-137.98259,-155.80859)"> + <rect + ry="1.5" + rx="1.5" + y="453.5" + x="723.5" + height="10" + width="10" + id="rect10366" + style="fill:url(#radialGradient20776-9);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient20778-1);stroke-width:0.83311915;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + ry="0.58623022" + rx="0.58575082" + y="454.33603" + x="724.33643" + height="8.3317547" + width="8.3306608" + id="rect10369" + style="opacity:0.4;fill:none;stroke:url(#linearGradient20780-8-3);stroke-width:0.83311915;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <path + inkscape:connector-curvature="0" + d="" + id="path10371" + style="fill:none;stroke:#ffffff;stroke-width:1.24967861;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + </g> + </g> + <g + transform="translate(0,1)" + id="g20756" + style="stroke:#babdb6;display:inline;enable-background:new"> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#babdb6;stroke-width:1.49999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1555.504,85.503418 -6,5.999995" + id="path20758" /> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#babdb6;stroke-width:1.49999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1549.504,85.503418 6,5.999995" + id="path20760" /> + </g> + <g + id="g20752"> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.49999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1555.504,85.503418 -6,5.999995" + id="path20748" /> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.49999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1549.504,85.503418 6,5.999995" + id="path20750" /> + </g> + </g> + <g + style="display:inline;enable-background:new" + id="g20832" + transform="translate(-1013.9575,0.99158003)"> + <rect + transform="matrix(1.2222231,0,0,1,656.33267,-305.99658)" + ry="0.75" + rx="0.75" + y="461" + x="723" + height="1.5" + width="9" + id="rect20786" + style="opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter10244-3);enable-background:new" /> + <g + transform="matrix(0.8395408,0,0,0.8332624,927.22191,-178.21992)" + id="g20784" + style="display:inline;enable-background:new"> + <g + id="g20788" + transform="matrix(1.200385,0,0,1.2002319,-137.98259,-155.80859)"> + <rect + ry="1.5" + rx="1.4884264" + y="453.5" + x="723.49695" + height="10" + width="9.922842" + id="rect20790" + style="fill:url(#radialGradient20846-6);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient20848-8);stroke-width:0.99608243;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + ry="0.56252956" + rx="0.55816746" + y="454.50446" + x="724.48926" + height="7.9949112" + width="7.938364" + id="rect20792" + style="opacity:0.4;fill:none;stroke:url(#linearGradient20850-9);stroke-width:0.99608254;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <path + inkscape:connector-curvature="0" + d="" + id="path20794" + style="fill:none;stroke:#ffffff;stroke-width:1.49412358;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + </g> + </g> + <g + transform="matrix(0.8395408,0,0,0.8332624,242.15323,77.75552)" + id="g20826" + style="stroke:#babdb6;display:inline;enable-background:new"> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#babdb6;stroke-width:1.79340911;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1554.8342,86.100705 -4.7645,4.800409" + id="path20828" /> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#babdb6;stroke-width:1.79340911;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1550.0697,86.100705 4.7645,4.800409" + id="path20830" /> + </g> + <g + transform="matrix(0.8395408,0,0,0.8332624,242.15323,76.75552)" + id="g20802"> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.55428827;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1554.8342,86.100705 -4.7645,4.800409" + id="path20804" /> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + style="fill:#555753;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.55428827;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" + d="m 1550.0697,86.100705 4.7645,4.800409" + id="path20806" /> + </g> + </g> + <g + style="display:inline;enable-background:new" + id="g20929" + transform="translate(-1019,33)"> + <rect + ry="1" + rx="1" + y="195.5" + x="1532.5" + height="8" + width="8" + id="rect9401" + style="fill:url(#radialGradient20946-9);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient20938-8-0);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + ry="0" + rx="0" + y="196.50366" + x="1533.4994" + height="5.9969311" + width="6.001204" + id="rect20867" + style="opacity:0.2;fill:none;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="200" + x="1534" + height="2" + width="2" + id="rect10189" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="200" + x="1537" + height="2" + width="2" + id="rect10191-6" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="197" + x="1537" + height="2" + width="2" + id="rect10193" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="197" + x="1534" + height="2" + width="2" + id="rect10195" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="198" + x="1535" + height="3" + width="3" + id="rect10197" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + </g> + <g + style="display:inline;enable-background:new" + id="g20948" + transform="translate(-1011,-3.0000001)"> + <rect + ry="1" + rx="1" + y="195.5" + x="1532.5" + height="8" + width="8" + id="rect20950" + style="fill:url(#radialGradient20964-2);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient20966-5);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + ry="0" + rx="0" + y="196.50366" + x="1533.4994" + height="5.9969311" + width="6.001204" + id="rect20952" + style="opacity:0.2;fill:none;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="200" + x="1534" + height="2" + width="2" + id="rect20954" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="200" + x="1537" + height="2" + width="2" + id="rect20956" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="197" + x="1537" + height="2" + width="2" + id="rect20958" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="197" + x="1534" + height="2" + width="2" + id="rect20960" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + <rect + y="198" + x="1535" + height="3" + width="3" + id="rect20962" + style="fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" /> + </g> + </g> + </g> +</svg> diff --git a/panels/sound/data/sounds/Makefile.am b/panels/sound/data/sounds/Makefile.am new file mode 100644 index 000000000..3277593ff --- /dev/null +++ b/panels/sound/data/sounds/Makefile.am @@ -0,0 +1,29 @@ +NULL = + +sounddir = $(datadir)/sounds/gnome/default/alerts + +sound_DATA = \ + bark.ogg \ + drip.ogg \ + glass.ogg \ + sonar.ogg \ + $(NULL) + +metadata_in_files = gnome-sounds-default.xml.in +metadatadir = $(pkgdatadir)/sounds +metadata_DATA = $(metadata_in_files:.xml.in=.xml) +@INTLTOOL_XML_RULE@ + +noinst_DATA = gnome-sounds-default.xml.in +CLEANFILES = gnome-sounds-default.xml gnome-sounds-default.xml.in + +EXTRA_DIST = $(sound_DATA) gnome-sounds-default.xml.in.in + +gnome-sounds-default.xml.in: gnome-sounds-default.xml.in.in Makefile + $(AM_V_GEN)sed -e 's^\@datadir\@^$(datadir)^g' < $(srcdir)/gnome-sounds-default.xml.in.in > gnome-sounds-default.xml.in.tmp \ + && mv gnome-sounds-default.xml.in.tmp gnome-sounds-default.xml.in + +MAINTAINERCLEANFILES = \ + Makefile.in + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/sounds/bark.ogg b/panels/sound/data/sounds/bark.ogg Binary files differnew file mode 100644 index 000000000..480950c68 --- /dev/null +++ b/panels/sound/data/sounds/bark.ogg diff --git a/panels/sound/data/sounds/drip.ogg b/panels/sound/data/sounds/drip.ogg Binary files differnew file mode 100644 index 000000000..144d2b367 --- /dev/null +++ b/panels/sound/data/sounds/drip.ogg diff --git a/panels/sound/data/sounds/glass.ogg b/panels/sound/data/sounds/glass.ogg Binary files differnew file mode 100644 index 000000000..902a3c896 --- /dev/null +++ b/panels/sound/data/sounds/glass.ogg diff --git a/panels/sound/data/sounds/gnome-sounds-default.xml.in.in b/panels/sound/data/sounds/gnome-sounds-default.xml.in.in new file mode 100644 index 000000000..bcf29aeb3 --- /dev/null +++ b/panels/sound/data/sounds/gnome-sounds-default.xml.in.in @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<sounds> + <sound deleted="false"> + <!-- Translators: This is the name of an audio file that sounds like the bark of a dog. + You might want to translate it into the equivalent words of your language. --> + <_name>Bark</_name> + <filename>@datadir@/sounds/gnome/default/alerts/bark.ogg</filename> + </sound> + <sound deleted="false"> + <!-- Translators: This is the name of an audio file that sounds like a water drip. + You might want to translate it into the equivalent words of your language. --> + <_name>Drip</_name> + <filename>@datadir@/sounds/gnome/default/alerts/drip.ogg</filename> + </sound> + <sound deleted="false"> + <!-- Translators: This is the name of an audio file that sounds like tapping glass. + You might want to translate it into the equivalent words of your language. --> + <_name>Glass</_name> + <filename>@datadir@/sounds/gnome/default/alerts/glass.ogg</filename> + </sound> + <sound deleted="false"> + <!-- Translators: This is the name of an audio file that sounds sort of like a submarine sonar ping. + You might want to translate it into the equivalent words of your language. --> + <_name>Sonar</_name> + <filename>@datadir@/sounds/gnome/default/alerts/sonar.ogg</filename> + </sound> +</sounds> diff --git a/panels/sound/data/sounds/sonar.ogg b/panels/sound/data/sounds/sonar.ogg Binary files differnew file mode 100644 index 000000000..77aadec27 --- /dev/null +++ b/panels/sound/data/sounds/sonar.ogg diff --git a/panels/sound/data/symbolic-icons/Makefile.am b/panels/sound/data/symbolic-icons/Makefile.am new file mode 100644 index 000000000..9f95f49d5 --- /dev/null +++ b/panels/sound/data/symbolic-icons/Makefile.am @@ -0,0 +1,10 @@ +NULL = + +SUBDIRS = scalable + +EXTRA_DIST = \ + src \ + r.rb \ + $(NULL) + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/symbolic-icons/r.rb b/panels/sound/data/symbolic-icons/r.rb new file mode 100755 index 000000000..a15ace233 --- /dev/null +++ b/panels/sound/data/symbolic-icons/r.rb @@ -0,0 +1,73 @@ +#!/usr/bin/env ruby + +require "rexml/document" +require "fileutils" +include REXML + + +#INKSCAPE = '/opt/artlibre/bin/inkscape' +INKSCAPE = '/usr/bin/inkscape' # like this works for me, while using `which` inkscape hangs +SRC = "src/gnome-media.svg" +PREFIX = "scalable" + +def chopSVG(icon) + FileUtils.mkdir_p(icon[:dir]) unless File.exists?(icon[:dir]) + unless (File.exists?(icon[:file]) && !icon[:forcerender]) + FileUtils.cp(SRC,icon[:file]) + puts " >> #{icon[:name]}" + cmd = "#{INKSCAPE} -f #{icon[:file]} --select #{icon[:id]} --verb=FitCanvasToSelection --verb=EditInvertInAllLayers " + cmd += "--verb=EditDelete --verb=EditSelectAll --verb=SelectionUnGroup --verb=StrokeToPath --verb=FileVacuum " + cmd += "--verb=FileSave --verb=FileClose > /dev/null 2>&1" + system(cmd) + #saving as plain SVG gets rid of the classes :/ + #cmd = "#{INKSCAPE} -f #{icon[:file]} -z --vacuum-defs -l #{icon[:file]} > /dev/null 2>&1" + #system(cmd) + svgcrop = Document.new(File.new(icon[:file], 'r')) + svgcrop.root.each_element("//rect") do |rect| + if rect.attributes["width"] == '16' && rect.attributes["height"] == '16' + rect.remove + end + end + icon_f = File.new(icon[:file],'w+') + icon_f.puts svgcrop + icon_f.close + else + puts " -- #{icon[:name]} already exists" + end +end #end of function + + +#main +# Open SVG file. +svg = Document.new(File.new(SRC, 'r')) + +if (ARGV[0].nil?) #render all SVGs + puts "Rendering from icons in #{SRC}" + # Go through every layer. + svg.root.each_element("/svg/g[@inkscape:groupmode='layer']") do |context| + context_name = context.attributes.get_attribute("inkscape:label").value + puts "Going through layer '" + context_name + "'" + context.each_element("g") do |icon| + #puts "DEBUG #{icon.attributes.get_attribute('id')}" + dir = "#{PREFIX}/#{context_name}" + icon_name = icon.attributes.get_attribute("inkscape:label").value + chopSVG({ :name => icon_name, + :id => icon.attributes.get_attribute("id"), + :dir => dir, + :file => "#{dir}/#{icon_name}-symbolic.svg"}) + end + end + puts "\nrendered all SVGs" +else #only render the icons passed + icons = ARGV + ARGV.each do |icon_name| + icon = svg.root.elements["//g[@inkscape:label='#{icon_name}']"] + dir = "#{PREFIX}/#{icon.parent.attributes['inkscape:label']}" + chopSVG({ :name => icon_name, + :id => icon.attributes["id"], + :dir => dir, + :file => "#{dir}/#{icon_name}-symbolic.svg", + :forcerender => true}) + end + puts "\nrendered #{ARGV.length} icons" +end diff --git a/panels/sound/data/symbolic-icons/scalable/Makefile.am b/panels/sound/data/symbolic-icons/scalable/Makefile.am new file mode 100644 index 000000000..b17aad85d --- /dev/null +++ b/panels/sound/data/symbolic-icons/scalable/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = status + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/symbolic-icons/scalable/status/Makefile.am b/panels/sound/data/symbolic-icons/scalable/status/Makefile.am new file mode 100644 index 000000000..26809918b --- /dev/null +++ b/panels/sound/data/symbolic-icons/scalable/status/Makefile.am @@ -0,0 +1,14 @@ +NULL = + +iconsdir = $(datadir)/icons/hicolor/scalable/status + +icons_DATA = \ + audio-input-microphone-high-symbolic.svg \ + audio-input-microphone-low-symbolic.svg \ + audio-input-microphone-medium-symbolic.svg \ + audio-input-microphone-muted-symbolic.svg \ + $(NULL) + +EXTRA_DIST = $(icons_DATA) + +-include $(top_srcdir)/git.mk diff --git a/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-high-symbolic.svg b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-high-symbolic.svg new file mode 100644 index 000000000..6cf30e72f --- /dev/null +++ b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-high-symbolic.svg @@ -0,0 +1,37 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='audio-input-microphone-high-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'> + <metadata id='metadata90'> + <rdf:RDF> + <cc:Work rdf:about=''> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/> + <dc:title>Gnome Symbolic Icon Theme</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview inkscape:cy='-15.613019' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='18.133577' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'> + <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/> + </sodipodi:namedview> + <title id='title9167'>Gnome Symbolic Icon Theme</title> + <defs id='defs7386'> + <clipPath id='clipPath6810-7-0-7' clipPathUnits='userSpaceOnUse'> + <rect x='21' y='281' id='rect6812-2-2-4' height='11' width='14' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible'/> + </clipPath> + </defs> + <g transform='translate(-41.0002,-177)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'> + + + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,12.5,-123)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4959' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:cx='28'/> + <rect x='45' y='177.98712' id='rect6796-1' rx='2.5' height='10.012877' ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='5'/> + <path transform='matrix(0.993968,0,0,1,19.706899,-98.486138)' clip-path='url(#clipPath6810-7-0-7)' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect6806-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,32,2.000002)' sodipodi:type='arc' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6814-3' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' sodipodi:cx='23'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,40,2.000002)' sodipodi:type='arc' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6816-8' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='23' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/> + <path d='M 43.875,191 A 1.0019512,1.0019512 0 1 0 44,193 l 7.03125,0 a 1.0001,1.0001 0 1 0 0,-2 L 44,191 a 1.0001,1.0001 0 0 0 -0.125,0 z' id='path6818-5' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/> + <rect x='43' y='192' id='rect6822-5' height='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9'/> + <rect x='46' y='189' id='rect6824-0' height='4' width='3' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/> + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,12.5,-128)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13930' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='28' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/> + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,12.5,-133)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13932' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:cx='28'/> + </g> +</svg> diff --git a/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-low-symbolic.svg b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-low-symbolic.svg new file mode 100644 index 000000000..3119fa4f8 --- /dev/null +++ b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-low-symbolic.svg @@ -0,0 +1,37 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='audio-input-microphone-low-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'> + <metadata id='metadata90'> + <rdf:RDF> + <cc:Work rdf:about=''> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/> + <dc:title>Gnome Symbolic Icon Theme</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview inkscape:cy='-15.613019' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='-21.866423' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'> + <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/> + </sodipodi:namedview> + <title id='title9167'>Gnome Symbolic Icon Theme</title> + <defs id='defs7386'> + <clipPath id='clipPath6810-7-0-7' clipPathUnits='userSpaceOnUse'> + <rect x='21' y='281' id='rect6812-2-2-4' height='11' width='14' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible'/> + </clipPath> + </defs> + <g transform='translate(-81.0002,-177)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'> + + + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,52.5,-123)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13966' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:cx='28'/> + <rect x='85' y='177.98712' id='rect13968' rx='2.5' height='10.012877' ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='5'/> + <path transform='matrix(0.993968,0,0,1,59.706899,-98.486138)' clip-path='url(#clipPath6810-7-0-7)' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect13970' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,72,2.000002)' sodipodi:type='arc' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13972' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' sodipodi:cx='23'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,80,2.000002)' sodipodi:type='arc' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13974' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='23' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/> + <path d='M 83.875,191 A 1.0019512,1.0019512 0 1 0 84,193 l 7.03125,0 a 1.0001,1.0001 0 1 0 0,-2 L 84,191 a 1.0001,1.0001 0 0 0 -0.125,0 z' id='path13976' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/> + <rect x='83' y='192' id='rect13978' height='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9'/> + <rect x='86' y='189' id='rect13980' height='4' width='3' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/> + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,52.5,-128)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13982' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='28' style='opacity:0.25;fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/> + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,52.5,-133)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13984' sodipodi:rx='1' sodipodi:ry='1' style='opacity:0.25;fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:cx='28'/> + </g> +</svg> diff --git a/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-medium-symbolic.svg b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-medium-symbolic.svg new file mode 100644 index 000000000..64ec37a61 --- /dev/null +++ b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-medium-symbolic.svg @@ -0,0 +1,37 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='audio-input-microphone-medium-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'> + <metadata id='metadata90'> + <rdf:RDF> + <cc:Work rdf:about=''> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/> + <dc:title>Gnome Symbolic Icon Theme</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview inkscape:cy='-15.613019' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='-1.866423' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'> + <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/> + </sodipodi:namedview> + <title id='title9167'>Gnome Symbolic Icon Theme</title> + <defs id='defs7386'> + <clipPath id='clipPath6810-7-0-7' clipPathUnits='userSpaceOnUse'> + <rect x='21' y='281' id='rect6812-2-2-4' height='11' width='14' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible'/> + </clipPath> + </defs> + <g transform='translate(-61.0002,-177)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'> + + + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,32.5,-123)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13940' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='28' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/> + <rect x='65' y='177.98712' id='rect13942' rx='2.5' ry='2.5' height='10.012877' width='5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/> + <path transform='matrix(0.993968,0,0,1,39.706899,-98.486138)' clip-path='url(#clipPath6810-7-0-7)' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect13944' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,52,2.000002)' sodipodi:type='arc' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13946' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='23' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,60,2.000002)' sodipodi:type='arc' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13948' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' sodipodi:cx='23'/> + <path d='M 63.875,191 A 1.0019512,1.0019512 0 1 0 64,193 l 7.03125,0 a 1.0001,1.0001 0 1 0 0,-2 L 64,191 a 1.0001,1.0001 0 0 0 -0.125,0 z' id='path13950' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/> + <rect x='63' y='192' id='rect13952' height='1' width='9' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/> + <rect x='66' y='189' id='rect13954' height='4' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3'/> + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,32.5,-128)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13956' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:cx='28'/> + <path sodipodi:cy='209' transform='matrix(1.5,0,0,1.5,32.5,-133)' sodipodi:type='arc' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path13958' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='28' style='opacity:0.25;fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/> + </g> +</svg> diff --git a/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-muted-symbolic.svg b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-muted-symbolic.svg new file mode 100644 index 000000000..d17baa9ea --- /dev/null +++ b/panels/sound/data/symbolic-icons/scalable/status/audio-input-microphone-muted-symbolic.svg @@ -0,0 +1,37 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='audio-input-microphone-muted-symbolic.svg' version='1.1' inkscape:version='0.47 r22583' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'> + <metadata id='metadata90'> + <rdf:RDF> + <cc:Work rdf:about=''> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/> + <dc:title>Gnome Symbolic Icon Theme</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview inkscape:cy='-19.613018' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='false' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:zoom='1' inkscape:cx='-41.866423' inkscape:snap-grids='true' inkscape:pageopacity='1'> + <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/> + </sodipodi:namedview> + <title id='title9167'>Gnome Symbolic Icon Theme</title> + <defs id='defs7386'> + <clipPath id='clipPath6810-7-0-7-1' clipPathUnits='userSpaceOnUse'> + <rect x='21' y='281' id='rect6812-2-2-4-8' height='11' width='14' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible'/> + </clipPath> + </defs> + <g inkscape:label='status' transform='translate(-101.0002,-177)' inkscape:groupmode='layer' id='layer9' style='display:inline'> + + <path inkscape:connector-curvature='0' d='m 111.99995,188 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-1-7' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/> + <g transform='translate(81.0002,-39.999999)' id='g14804' style='opacity:0.25'> + <rect x='23.999798' y='217.98712' id='rect13968-5' rx='2.5' ry='2.5' height='10.012877' width='5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/> + <rect transform='matrix(0.993968,0,0,1,-1.2933,-58.486138)' x='23.9375' y='274.13098' clip-path='url(#clipPath6810-7-0-7-1)' id='rect13970-1' rx='4.0312505' height='13.869018' ry='4.0312505' style='color:#bebebe;fill:none;stroke:#bebebe;stroke-width:1.00302994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible' width='8.062501'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,10.9998,42.000002)' d='m 24,361 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z' id='path13972-1' sodipodi:type='arc' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' sodipodi:cx='23'/> + <path sodipodi:cy='361' transform='matrix(0.5,0,0,0.5,18.9998,42.000002)' d='m 24,361 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z' id='path13974-3' sodipodi:type='arc' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' sodipodi:cx='23'/> + <path inkscape:connector-curvature='0' d='m 22.98733,232 6.01247,0' id='path13976-0' sodipodi:nodetypes='cc' style='color:#bebebe;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible'/> + <rect x='21.999798' y='232' id='rect13978-6' height='1' width='1.0000021' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/> + <rect x='24.999798' y='229' id='rect13980-4' height='4' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3'/> + <rect x='28.9998' y='231' id='rect14813' height='2.000001' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='0.9999997'/> + </g> + </g> +</svg> diff --git a/panels/sound/data/symbolic-icons/src/gnome-media.svg b/panels/sound/data/symbolic-icons/src/gnome-media.svg new file mode 100644 index 000000000..6fd726860 --- /dev/null +++ b/panels/sound/data/symbolic-icons/src/gnome-media.svg @@ -0,0 +1,990 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="400" + height="100" + id="svg7384" + inkscape:version="0.47 r22583" + sodipodi:docname="gnome-media.svg"> + <metadata + id="metadata90"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Gnome Symbolic Icon Theme</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#555753" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:window-width="1310" + inkscape:window-height="690" + id="namedview88" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="59.133777" + inkscape:cy="-108.61302" + inkscape:window-x="54" + inkscape:window-y="25" + inkscape:window-maximized="0" + inkscape:current-layer="layer9" + showborder="false" + inkscape:snap-nodes="true" + inkscape:snap-bbox="true" + inkscape:bbox-paths="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-to-guides="true" + inkscape:snap-grids="true" + inkscape:snap-global="true" + inkscape:object-nodes="true"> + <inkscape:grid + type="xygrid" + id="grid4866" + empspacing="2" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + spacingx="1px" + spacingy="1px" /> + </sodipodi:namedview> + <title + id="title9167">Gnome Symbolic Icon Theme</title> + <defs + id="defs7386"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 50 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="400 : 50 : 1" + inkscape:persp3d-origin="200 : 33.333333 : 1" + id="perspective778" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6279-6-1-4-5"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6281-3-0-3-5" + width="3.8250003" + height="6.3750005" + x="26.85" + y="220.75" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6265-33-6-5-1-3"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6267-6-9-1-4-8" + width="2.8977277" + height="5.21591" + x="26.96591" + y="221.32954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-6-8-2-1-6-6"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-4-9-2-0-9-0" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6279-2-3"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6281-5-3" + width="3.8250003" + height="6.3750005" + x="26.85" + y="220.75" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6265-3-5-6"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6267-1-8-1" + width="2.8977277" + height="5.21591" + x="26.96591" + y="221.32954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-8-8-8"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-6-0-7" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + id="clipPath3157-7-0" + clipPathUnits="userSpaceOnUse"> + <rect + y="221.32954" + x="28.124998" + height="5.21591" + width="1.7386366" + id="rect3159-5-5" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6279-6-1"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6281-3-1" + width="3.8250003" + height="6.3750005" + x="26.85" + y="220.75" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6265-33-6-4-0"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6267-6-9-19-3" + width="2.8977277" + height="5.21591" + x="26.96591" + y="221.32954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-6-8-2-8-0"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-4-9-2-7-0" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6265-33-4"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6267-6-5" + width="2.8977277" + height="5.21591" + x="26.96591" + y="221.32954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-6-8-25-4"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-4-9-24-2" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-6-4"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-4-9" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6279-7-9"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6281-1-9" + width="3.8250003" + height="6.3750005" + x="26.85" + y="220.75" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6265-3-4"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6267-1-9" + width="2.8977277" + height="5.21591" + x="26.96591" + y="221.32954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-8-81"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-6-6" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6279-3"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6281-9" + width="3.8250003" + height="6.3750005" + x="26.85" + y="220.75" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6265-334"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6267-61" + width="2.8977277" + height="5.21591" + x="26.96591" + y="221.32954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6259-5"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6261-61" + width="1.8762827" + height="4.8734746" + x="26.998718" + y="221.50153" /> + </clipPath> + <clipPath + id="clipPath6810-7" + clipPathUnits="userSpaceOnUse"> + <rect + y="281" + x="21" + height="11" + width="14" + id="rect6812-2" + style="color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3668"> + <rect + y="221.50153" + x="26.998718" + height="3.3729413" + width="1.8762826" + id="rect3670" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3697"> + <path + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 26.965789,221.32959 0,5.21591 0.579546,0 0,-1.15909 2.318182,0 0,-4.05682 -2.897728,0 z" + id="path3699" /> + </clipPath> + <inkscape:perspective + id="perspective10762" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <clipPath + id="clipPath6810-7-0" + clipPathUnits="userSpaceOnUse"> + <rect + y="281" + x="21" + height="11" + width="14" + id="rect6812-2-2" + style="color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> + </clipPath> + <inkscape:perspective + id="perspective13870" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective13892" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <clipPath + id="clipPath6810-7-0-7" + clipPathUnits="userSpaceOnUse"> + <rect + y="281" + x="21" + height="11" + width="14" + id="rect6812-2-2-4" + style="color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> + </clipPath> + <inkscape:perspective + id="perspective14766" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <clipPath + id="clipPath6810-7-0-7-1" + clipPathUnits="userSpaceOnUse"> + <rect + y="281" + x="21" + height="11" + width="14" + id="rect6812-2-2-4-8" + style="color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> + </clipPath> + </defs> + <g + transform="translate(-19.9998,-272)" + id="layer3" + style="display:inline" /> + <g + transform="translate(-19.9998,-272)" + id="layer2" + style="display:inline"> + <g + transform="translate(99.9998,334)" + id="g11578" + style="display:inline"> + <g + transform="translate(-93.968752,-337)" + id="g11582" + style="display:inline" /> + </g> + </g> + <g + transform="translate(0,-243)" + id="layer4" + style="display:inline"> + <g + transform="translate(-20.99975,-28)" + id="layer3-5" + style="display:inline" /> + <g + transform="translate(-20.99975,-28)" + id="layer2-1" + style="display:inline" /> + <g + transform="translate(-1,1)" + id="layer4-4" + style="display:inline" /> + <g + transform="translate(-1,244)" + id="layer5-9" /> + <g + transform="translate(-20.99975,-28)" + id="layer1-8" + style="display:inline" /> + </g> + <g + id="layer8" /> + <g + id="layer7" /> + <g + id="layer5"> + <g + transform="translate(14,0)" + id="g11716" /> + </g> + <g + id="layer6" /> + <g + transform="translate(-19.9998,-272)" + id="layer1" + style="display:inline"> + <path + d="m 73.282111,317.71964 c -5.520162,0 -9.427702,-4.34171 -9.427702,-9.6758 0,-5.33408 3.659442,-9.64478 9.179604,-9.64478 3.442349,0 5.39612,1.39555 6.357497,2.23287 l 1.550609,-1.67465 c -2.139838,-1.95377 -4.868915,-2.51199 -7.908106,-2.51199 -6.946721,0 -11.53653,5.21005 -11.53653,11.59855 0,6.26446 4.3107,11.62957 11.846652,11.62957 2.822106,0 6.171426,-0.71328 8.24924,-1.89174 l 0,-10.60617 -7.25685,0 0,1.95377 5.117009,0 0,7.19483 -0.248097,0.12404 c -0.496194,0.27911 -2.387941,1.2715 -5.923326,1.2715" + id="path11291" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 87.219663,306.49324 -0.186073,0.37214 -0.06202,0 0,-1.08542 c 0,-0.58924 0,-0.71329 -0.09304,-1.33353 l -2.077816,0 c 0.09304,0.43417 0.217085,0.99239 0.217085,1.89174 l 0,12.74601 1.953768,0 0,-7.90811 c 0,-4.06259 2.698061,-5.33409 4.682839,-5.33409 1.984777,0 4.124619,0.7443 4.124619,4.31069 l 0,8.93151 1.953765,0 0,-9.24163 c 0,-4.52777 -3.070205,-5.73725 -5.117007,-5.73725 -2.88413,0 -4.8379,1.39555 -5.396119,2.38794" + id="path11293" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 108.09425,319.45633 c 4.40373,0 7.69102,-3.44236 7.69102,-7.629 0,-4.12462 -3.28729,-7.59798 -7.69102,-7.59798 -4.40372,0 -7.72203,3.44235 -7.72203,7.59798 0,4.43474 3.53539,7.629 7.72203,7.629 m 5.55118,-7.629 c 0,3.47336 -2.26389,5.8613 -5.55118,5.8613 -3.3183,0 -5.58219,-2.38794 -5.58219,-5.8613 0,-3.44235 2.26389,-5.8613 5.58219,-5.8613 3.28729,0 5.55118,2.41895 5.55118,5.8613" + id="path11295" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 121.1998,306.49324 -0.18607,0.37214 -0.062,0 0,-1.08542 c 0,-0.58924 0,-0.71329 -0.093,-1.33353 l -2.07782,0 c 0.093,0.43417 0.21709,0.99239 0.21709,1.89174 l 0,12.68399 1.95376,0 0,-7.84609 c 0,-4.06259 2.69807,-5.33409 4.68284,-5.33409 1.98478,0 4.12462,0.7443 4.12462,4.31069 l 0,8.86949 1.98478,0 -0.031,-9.17961 c 0,-0.62024 -0.062,-1.17846 -0.18607,-1.67466 0.93036,-1.70566 2.63603,-2.32591 4.03158,-2.32591 1.98478,0 4.12462,0.7443 4.12462,4.31069 l 0,8.86949 1.95377,0 0,-9.17961 c 0,-4.52777 -3.07021,-5.73725 -5.11701,-5.73725 -2.88413,0 -4.8379,1.39555 -5.39612,2.38794 l -0.093,0.21708 c -1.0234,-1.98478 -2.97717,-2.60502 -4.43474,-2.60502 -2.88413,0 -4.8379,1.39555 -5.39612,2.38794" + id="path11297" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 146.76692,310.99 0,-0.49619 c 0,-2.35693 2.44997,-4.74487 5.27207,-4.74487 2.94616,0 4.8379,1.73669 4.93094,4.74487 l 0.031,0.49619 -10.23402,0 m 5.3341,-6.69863 c -4.49676,0 -7.50495,3.31831 -7.50495,7.47394 0,4.3417 2.82211,7.62899 7.47394,7.62899 2.79109,0 3.90753,-0.43417 5.45814,-0.89935 l -0.34114,-1.42656 c -1.58161,0.46518 -2.94615,0.7753 -4.74486,0.7753 -3.00818,0 -5.67523,-2.07782 -5.67523,-4.99296 l 0,-0.49619 12.37386,0 0,-0.55822 c 0,-4.06259 -2.20187,-7.50495 -7.03976,-7.50495" + id="path11299" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 185.47593,313.03681 c 0,-1.42656 -0.2481,-3.38033 -2.69806,-4.74487 -3.22526,-1.7987 -8.65239,-1.55061 -8.65239,-5.89231 0,-1.5196 1.05442,-4.00057 4.99296,-4.00057 2.20186,0 3.50437,0.99239 4.15563,1.76769 l 1.79871,-1.61263 c -1.0234,-1.11644 -2.57402,-2.10883 -5.95434,-2.10883 -5.39612,0 -7.34989,3.62843 -7.34989,5.95434 0,1.2715 0.15506,3.62842 2.72907,5.24106 3.3183,2.07781 8.6524,1.79871 8.6524,5.76826 0,2.69806 -2.60502,4.31069 -5.086,4.31069 -1.7987,0 -3.69045,-0.68227 -4.96194,-2.23287 l -1.82972,1.55061 c 1.5506,1.86073 4.15563,2.63603 6.69863,2.63603 4.37271,0 7.50494,-2.63604 7.50494,-6.6366" + id="path11301" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 186.64132,304.29137 6.1094,14.42066 -0.4962,1.2715 c -0.86834,2.17085 -2.94615,3.44236 -5.05498,4.34171 l 0.71328,1.73668 c 3.0702,-1.2715 5.39612,-3.25628 6.32648,-5.89231 l 5.5822,-15.87824 -2.07782,0 -4.00057,12.06374 -0.093,0 -4.99296,-12.06374 -2.01579,0" + id="path11303" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 203.93933,306.49324 -0.18607,0.37214 -0.062,0 0,-1.08542 c 0,-0.58924 0,-0.71329 -0.093,-1.33353 l -2.07782,0 c 0.093,0.43417 0.21709,0.99239 0.21709,1.89174 l 0,12.68399 1.95377,0 0,-7.84609 c 0,-4.06259 2.69806,-5.33409 4.68284,-5.33409 1.98477,0 4.12462,0.7443 4.12462,4.31069 l 0,8.86949 1.98478,0 -0.031,-9.17961 c 0,-0.62024 -0.062,-1.17846 -0.18607,-1.67466 0.93036,-1.70566 2.63604,-2.32591 4.03158,-2.32591 1.98478,0 4.12462,0.7443 4.12462,4.31069 l 0,8.86949 1.95377,0 0,-9.17961 c 0,-4.52777 -3.07021,-5.73725 -5.11701,-5.73725 -2.88413,0 -4.8379,1.39555 -5.39612,2.38794 l -0.093,0.21708 c -1.0234,-1.98478 -2.97717,-2.60502 -4.43474,-2.60502 -2.88413,0 -4.8379,1.39555 -5.39612,2.38794" + id="path11305" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 235.61585,306.02805 c 3.3183,0 5.58219,2.38794 5.58219,5.8613 0,3.47337 -2.26389,5.86131 -5.58219,5.86131 -2.26389,0 -4.46576,-1.58163 -5.52017,-3.72146 l -0.031,-0.093 0,-4.0626 0.062,-0.093 c 0.7753,-1.42656 2.20187,-3.75248 5.48916,-3.75248 m -5.76827,13.08714 c 0.12405,-0.65125 0.18607,-1.33352 0.21709,-2.07781 l 0.062,-1.05442 0.80632,1.24049 c 1.36453,1.33352 3.13223,2.2949 5.05498,2.2949 4.68284,0 7.34989,-3.50438 7.34989,-7.629 0,-4.43473 -2.94616,-7.59798 -7.34989,-7.59798 -2.2949,0 -4.18664,1.05442 -5.02397,2.35693 l -0.89935,1.39554 0,-12.43588 -1.95377,0 0,21.46043 c 0,0.68227 -0.031,1.33352 -0.12405,2.0468 l 1.86073,0" + id="path11307" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 252.37357,319.45633 c 4.40373,0 7.69102,-3.44236 7.69102,-7.629 0,-4.12462 -3.28729,-7.59798 -7.69102,-7.59798 -4.40372,0 -7.72203,3.44235 -7.72203,7.59798 0,4.43474 3.53539,7.629 7.72203,7.629 m 5.55118,-7.629 c 0,3.47336 -2.26389,5.8613 -5.55118,5.8613 -3.3183,0 -5.58219,-2.38794 -5.58219,-5.8613 0,-3.44235 2.26389,-5.8613 5.58219,-5.8613 3.28729,0 5.55118,2.41895 5.55118,5.8613" + id="path11309" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 263.43231,295.57695 0,20.49905 c -0.031,2.72907 1.61263,2.94616 2.60502,2.94616 l 0.65126,0 0,-1.55061 -0.55822,0 c -0.43417,0 -0.7753,-0.12405 -0.7753,-0.83733 l 0,-21.05727 -1.92276,0" + id="path11311" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 270.27535,319.02216 1.89174,0 0,-14.57573 -1.89174,0 0,14.57573 m 2.57401,-19.78577 c 0,-0.86834 -0.68227,-1.61264 -1.58162,-1.61264 -0.86834,0 -1.61264,0.68227 -1.61264,1.61264 0,0.83732 0.68227,1.58162 1.61264,1.58162 0.83732,0 1.58162,-0.68227 1.58162,-1.58162" + id="path11313" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 275.88661,311.85834 c 0,4.68284 3.25628,7.53596 7.56697,7.53596 2.88413,0 4.43474,-1.14745 5.17903,-1.86073 l -1.39555,-1.39555 c -1.48858,1.45757 -2.94615,1.48859 -3.75247,1.48859 -3.44235,0 -5.45814,-2.76009 -5.45814,-5.70624 0,-2.94616 1.67466,-5.95434 5.30308,-5.95434 0.83733,0 2.26389,0.062 3.84551,1.5196 l 1.5196,-1.36454 c -1.24049,-1.14745 -3.00819,-1.92276 -5.24106,-1.92276 -4.5898,0 -7.56697,3.19426 -7.56697,7.66001" + id="path11315" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 301.90486,297.03452 0,22.04966 2.13984,0 0,-22.04966 -2.13984,0" + id="path11317" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 307.98907,311.85834 c 0,4.68284 3.25628,7.53596 7.56697,7.53596 2.88413,0 4.43474,-1.14745 5.17903,-1.86073 l -1.39554,-1.39555 c -1.48859,1.45757 -2.94616,1.48859 -3.75248,1.48859 -3.44235,0 -5.45814,-2.76009 -5.45814,-5.70624 0,-2.94616 1.67466,-5.95434 5.30308,-5.95434 0.83733,0 2.26389,0.062 3.84551,1.5196 l 1.5196,-1.36454 c -1.24049,-1.14745 -3.00818,-1.92276 -5.24106,-1.92276 -4.5898,0 -7.56697,3.19426 -7.56697,7.66001" + id="path11319" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 329.90402,319.45633 c 4.40372,0 7.69102,-3.44236 7.69102,-7.629 0,-4.12462 -3.2873,-7.59798 -7.69102,-7.59798 -4.40373,0 -7.72204,3.44235 -7.72204,7.59798 0,4.43474 3.5354,7.629 7.72204,7.629 m 5.55118,-7.629 c 0,3.47336 -2.2639,5.8613 -5.55118,5.8613 -3.3183,0 -5.5822,-2.38794 -5.5822,-5.8613 0,-3.44235 2.2639,-5.8613 5.5822,-5.8613 3.28728,0 5.55118,2.41895 5.55118,5.8613" + id="path11321" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 343.00957,306.49324 -0.18607,0.37214 -0.062,0 0,-1.08542 c 0,-0.58924 0,-0.71329 -0.093,-1.33353 l -2.07782,0 c 0.093,0.43417 0.21709,0.99239 0.21709,1.89174 l 0,12.74601 1.95376,0 0,-7.90811 c 0,-4.06259 2.69806,-5.33409 4.68284,-5.33409 1.98478,0 4.12462,0.7443 4.12462,4.31069 l 0,8.93151 1.95377,0 0,-9.24163 c 0,-4.52777 -3.07021,-5.73725 -5.11701,-5.73725 -2.88413,0 -4.8379,1.39555 -5.39612,2.38794" + id="path11323" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 356.56527,308.32295 c 0,5.42713 8.43532,2.69807 8.43532,6.79167 0,1.45757 -1.5196,2.41895 -3.62843,2.41895 -0.96137,0 -2.10883,-0.12405 -3.75247,-1.64364 l -1.5196,1.24048 c 0.83733,1.05442 2.20187,2.17086 5.27207,2.17086 2.94616,0 5.76827,-1.27151 5.76827,-4.34171 0,-2.44996 -1.48859,-3.41134 -4.12462,-4.03158 l -1.14745,-0.21709 c -1.55061,-0.31012 -3.16325,-1.08543 -3.16325,-2.66705 0,-1.76769 1.95377,-2.20186 3.07021,-2.20186 0.55822,0 1.95377,0.031 3.22527,1.33352 l 1.55061,-1.17846 c -0.99239,-1.2715 -2.63604,-1.92275 -4.62082,-1.92275 -2.63603,0 -5.36511,1.33352 -5.36511,4.24866" + id="path11325" + style="font-size:31.0121994px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 70.96012,347.46538 c 0,-0.68957 -0.119928,-1.634 -1.304201,-2.29359 -1.559044,-0.86947 -4.182438,-0.74954 -4.182438,-2.84826 0,-0.73455 0.509689,-1.93381 2.413521,-1.93381 1.064347,0 1.693963,0.47971 2.00877,0.85448 l 0.869467,-0.77953 C 70.270543,339.925 69.521,339.4453 67.887002,339.4453 c -2.608399,0 -3.552824,1.75392 -3.552824,2.87823 0,0.61463 0.07496,1.75393 1.319192,2.53345 1.604016,1.00439 4.182438,0.86947 4.182438,2.78829 0,1.3042 -1.259229,2.08373 -2.458494,2.08373 -0.869466,0 -1.783907,-0.3298 -2.39853,-1.07934 l -0.884459,0.74954 c 0.749541,0.89945 2.008771,1.27422 3.238017,1.27422 2.113703,0 3.627778,-1.27422 3.627778,-3.20804" + id="path11272" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 84.340983,350.56848 c 2.128693,0 3.717722,-1.66398 3.717722,-3.68774 0,-1.99377 -1.589029,-3.67275 -3.717722,-3.67275 -2.128694,0 -3.732714,1.66399 -3.732714,3.67275 0,2.14369 1.708955,3.68774 3.732714,3.68774 m 2.683356,-3.68774 c 0,1.67897 -1.094331,2.83327 -2.683356,2.83327 -1.604016,0 -2.698348,-1.1543 -2.698348,-2.83327 0,-1.66398 1.094332,-2.83326 2.698348,-2.83326 1.589025,0 2.683356,1.16928 2.683356,2.83326" + id="path11274" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 103.41859,349.36922 0.0899,-0.1649 0.03,0 0,0.50969 c 0,0.28482 0,0.34479 0.045,0.65959 l 1.00438,0 c -0.045,-0.20987 -0.10493,-0.49469 -0.10493,-0.91444 l 0,-6.17621 -0.94442,0 0,3.83765 c 0,1.9488 -1.28922,2.56343 -2.26362,2.56343 -0.94442,0 -1.993776,-0.3448 -1.993776,-2.06874 l 0,-4.33234 -0.944422,0 0,4.46726 c 0,2.18866 1.484092,2.7733 2.473488,2.7733 1.39414,0 2.33856,-0.6596 2.6084,-1.15429" + id="path11276" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 119.05604,343.193 c -0.22486,-0.075 -0.44972,-0.0899 -0.56965,-0.0899 -0.47971,0 -1.55905,0.17989 -2.08372,1.43912 l -0.25485,0.58464 0,-1.85886 -0.94442,0 0,7.09065 0.94442,0 0,-3.61278 c 0,-0.79452 0.64461,-2.63839 2.09872,-2.63839 0.20987,0 0.41974,0.015 0.65959,0.075 l 0.14991,-0.9894" + id="path11278" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 128.78242,346.89573 c 0,2.26361 1.57404,3.64277 3.65776,3.64277 1.39415,0 2.14369,-0.55466 2.50347,-0.89945 l -0.67459,-0.67458 c -0.71956,0.70456 -1.42412,0.71956 -1.81389,0.71956 -1.66397,0 -2.63838,-1.33419 -2.63838,-2.75832 0,-1.42412 0.80951,-2.87823 2.56343,-2.87823 0.40475,0 1.09433,0.03 1.85886,0.73455 l 0.73455,-0.6596 c -0.59963,-0.55466 -1.45411,-0.92943 -2.53345,-0.92943 -2.21863,0 -3.65776,1.54406 -3.65776,3.70273" + id="path11280" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 145.64233,346.47599 0,-0.23985 c 0,-1.1393 1.18427,-2.2936 2.54843,-2.2936 1.42413,0 2.33857,0.83949 2.38354,2.2936 l 0.015,0.23985 -4.94697,0 m 2.57842,-3.23802 c -2.17367,0 -3.62778,1.60402 -3.62778,3.61279 0,2.09871 1.36417,3.68774 3.61279,3.68774 1.34917,0 1.88884,-0.20987 2.63838,-0.43473 l -0.1649,-0.68958 c -0.76453,0.22486 -1.42413,0.37477 -2.29359,0.37477 -1.45411,0 -2.74332,-1.00439 -2.74332,-2.41352 l 0,-0.23985 5.98133,0 0,-0.26984 c 0,-1.96379 -1.06435,-3.62778 -3.40291,-3.62778" + id="path11282" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 181.95367,347.46538 c 0,-0.68957 -0.11992,-1.634 -1.3042,-2.29359 -1.55904,-0.86947 -4.18244,-0.74954 -4.18244,-2.84826 0,-0.73455 0.50969,-1.93381 2.41353,-1.93381 1.06434,0 1.69396,0.47971 2.00876,0.85448 l 0.86947,-0.77953 c -0.49469,-0.53967 -1.24424,-1.01937 -2.87823,-1.01937 -2.6084,0 -3.55283,1.75392 -3.55283,2.87823 0,0.61463 0.075,1.75393 1.31919,2.53345 1.60402,1.00439 4.18244,0.86947 4.18244,2.78829 0,1.3042 -1.25923,2.08373 -2.45849,2.08373 -0.86947,0 -1.78391,-0.3298 -2.39853,-1.07934 l -0.88446,0.74954 c 0.74954,0.89945 2.00877,1.27422 3.23802,1.27422 2.1137,0 3.62777,-1.27422 3.62777,-3.20804" + id="path11284" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 191.04716,339.73012 4.12247,10.65847 0.83949,0 4.19743,-10.65847 -1.1393,0 -3.40292,9.05446 -0.10493,0 -3.268,-9.05446 -1.24424,0" + id="path11286" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + <path + d="m 214.9462,349.729 c -2.66837,0 -4.55721,-2.09872 -4.55721,-4.67714 0,-2.57842 1.76892,-4.66214 4.43728,-4.66214 1.66398,0 2.6084,0.67459 3.07312,1.07934 l 0.74954,-0.80951 c -1.03437,-0.94442 -2.35356,-1.21425 -3.82266,-1.21425 -3.35794,0 -5.57658,2.51846 -5.57658,5.60656 0,3.02814 2.08372,5.62156 5.72649,5.62156 1.36416,0 2.98317,-0.34479 3.98756,-0.91444 l 0,-5.12686 -3.50786,0 0,0.94442 2.47349,0 0,3.47787 -0.11993,0.06 c -0.23985,0.13492 -1.15429,0.61463 -2.86324,0.61463" + id="path11288" + style="font-size:14.9907999px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:125%;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.58435011;marker:none;visibility:visible;font-family:RaveIn" /> + </g> + <g + inkscape:groupmode="layer" + id="layer9" + inkscape:label="status" + style="display:inline"> + <g + style="display:inline" + id="g5493" + transform="translate(21.0002,-39.999999)" + inkscape:label="audio-input-microphone-high"> + <rect + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect5499" + width="16" + height="16" + x="20" + y="217" + inkscape:label="audio-volume-high" /> + <rect + inkscape:label="audio-volume-high" + y="217" + x="20" + height="16" + width="16" + id="rect3704" + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <path + transform="matrix(1.5,0,0,1.5,-8.5002,-83.000001)" + d="m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="209" + sodipodi:cx="28" + id="path4959" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" + sodipodi:type="arc" /> + <rect + ry="2.5" + rx="2.5" + y="217.98712" + x="23.9998" + height="10.012877" + width="5" + id="rect6796-1" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + transform="matrix(0.993968,0,0,1,-1.293301,-58.486139)" + clip-path="url(#clipPath6810-7-0-7)" + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:1.00302994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6806-6" + width="8.062501" + height="13.869018" + x="23.9375" + y="274.13098" + rx="4.0312505" + ry="4.0312505" /> + <path + transform="matrix(0.5,0,0,0.5,10.9998,42.000001)" + d="m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="361" + sodipodi:cx="23" + id="path6814-3" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="path6816-8" + sodipodi:cx="23" + sodipodi:cy="361" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + transform="matrix(0.5,0,0,0.5,18.9998,42.000001)" /> + <path + inkscape:connector-curvature="0" + id="path6818-5" + d="m 22.98733,232 7.047969,0" + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + y="232" + x="21.9998" + height="1" + width="9" + id="rect6822-5" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect6824-0" + width="3" + height="4" + x="24.9998" + y="229" /> + <path + sodipodi:type="arc" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" + id="path13930" + sodipodi:cx="28" + sodipodi:cy="209" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + transform="matrix(1.5,0,0,1.5,-8.5002,-88.000001)" /> + <path + transform="matrix(1.5,0,0,1.5,-8.5002,-93.000001)" + d="m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="209" + sodipodi:cx="28" + id="path13932" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" + sodipodi:type="arc" /> + </g> + <text + sodipodi:linespacing="125%" + id="text6726" + y="165.94501" + x="41.823399" + style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Droid Sans" + xml:space="preserve"><tspan + y="165.94501" + x="41.823399" + id="tspan6728" + sodipodi:role="line">status</tspan></text> + <g + style="display:inline" + inkscape:label="audio-input-microphone-muted" + transform="translate(81.0002,-39.999999)" + id="g3266"> + <rect + inkscape:label="audio-volume-high" + y="217" + x="20" + height="16" + width="16" + id="rect3270" + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccc" + id="path3761-2-3-5-4-8-9-8-0-1-7" + d="m 30.99975,228 1.375,0 1.125,1.09375 L 34.5935,228 l 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" /> + <g + id="g14804" + style="opacity:0.25"> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13968-5" + width="5" + height="10.012877" + x="23.999798" + y="217.98712" + rx="2.5" + ry="2.5" /> + <rect + ry="4.0312505" + rx="4.0312505" + y="274.13098" + x="23.9375" + height="13.869018" + width="8.062501" + id="rect13970-1" + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:1.00302994000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible" + clip-path="url(#clipPath6810-7-0-7-1)" + transform="matrix(0.993968,0,0,1,-1.2933,-58.486138)" /> + <path + sodipodi:type="arc" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="path13972-1" + sodipodi:cx="23" + sodipodi:cy="361" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + transform="matrix(0.5,0,0,0.5,10.9998,42.000002)" /> + <path + transform="matrix(0.5,0,0,0.5,18.9998,42.000002)" + d="m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="361" + sodipodi:cx="23" + id="path13974-3" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 22.98733,232 6.01247,0" + id="path13976-0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13978-6" + width="1.0000021" + height="1" + x="21.999798" + y="232" /> + <rect + y="229" + x="24.999798" + height="4" + width="3" + id="rect13980-4" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + y="231" + x="28.9998" + height="2.000001" + width="0.9999997" + id="rect14813" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + </g> + </g> + <g + inkscape:label="audio-input-microphone-medium" + transform="translate(41.0002,-39.999999)" + id="g13934" + style="display:inline"> + <rect + inkscape:label="audio-volume-high" + y="217" + x="20" + height="16" + width="16" + id="rect13936" + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13938" + width="16" + height="16" + x="20" + y="217" + inkscape:label="audio-volume-high" /> + <path + sodipodi:type="arc" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" + id="path13940" + sodipodi:cx="28" + sodipodi:cy="209" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 29,209 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + transform="matrix(1.5,0,0,1.5,-8.5002,-83.000001)" /> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13942" + width="5" + height="10.012877" + x="23.9998" + y="217.98712" + rx="2.5" + ry="2.5" /> + <rect + ry="4.0312505" + rx="4.0312505" + y="274.13098" + x="23.9375" + height="13.869018" + width="8.062501" + id="rect13944" + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:1.00302994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible" + clip-path="url(#clipPath6810-7-0-7)" + transform="matrix(0.993968,0,0,1,-1.293301,-58.486139)" /> + <path + sodipodi:type="arc" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="path13946" + sodipodi:cx="23" + sodipodi:cy="361" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 24,361 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + transform="matrix(0.5,0,0,0.5,10.9998,42.000001)" /> + <path + transform="matrix(0.5,0,0,0.5,18.9998,42.000001)" + d="m 24,361 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="361" + sodipodi:cx="23" + id="path13948" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 22.98733,232 7.047969,0" + id="path13950" + inkscape:connector-curvature="0" /> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13952" + width="9" + height="1" + x="21.9998" + y="232" /> + <rect + y="229" + x="24.9998" + height="4" + width="3" + id="rect13954" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <path + transform="matrix(1.5,0,0,1.5,-8.5002,-88.000001)" + d="m 29,209 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="209" + sodipodi:cx="28" + id="path13956" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline;opacity:0.25" + id="path13958" + sodipodi:cx="28" + sodipodi:cy="209" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 29,209 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + transform="matrix(1.5,0,0,1.5,-8.5002,-93.000001)" /> + </g> + <g + style="display:inline" + id="g13960" + transform="translate(61.0002,-39.999999)" + inkscape:label="audio-input-microphone-low"> + <rect + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13962" + width="16" + height="16" + x="20" + y="217" + inkscape:label="audio-volume-high" /> + <rect + inkscape:label="audio-volume-high" + y="217" + x="20" + height="16" + width="16" + id="rect13964" + style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <path + transform="matrix(1.5,0,0,1.5,-8.5002,-83.000001)" + d="m 29,209 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="209" + sodipodi:cx="28" + id="path13966" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" + sodipodi:type="arc" /> + <rect + ry="2.5" + rx="2.5" + y="217.98712" + x="23.9998" + height="10.012877" + width="5" + id="rect13968" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + transform="matrix(0.993968,0,0,1,-1.293301,-58.486139)" + clip-path="url(#clipPath6810-7-0-7)" + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:1.00302994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13970" + width="8.062501" + height="13.869018" + x="23.9375" + y="274.13098" + rx="4.0312505" + ry="4.0312505" /> + <path + transform="matrix(0.5,0,0,0.5,10.9998,42.000001)" + d="m 24,361 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="361" + sodipodi:cx="23" + id="path13972" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" + id="path13974" + sodipodi:cx="23" + sodipodi:cy="361" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 24,361 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + transform="matrix(0.5,0,0,0.5,18.9998,42.000001)" /> + <path + inkscape:connector-curvature="0" + id="path13976" + d="m 22.98733,232 7.047969,0" + style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + y="232" + x="21.9998" + height="1" + width="9" + id="rect13978" + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + <rect + style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect13980" + width="3" + height="4" + x="24.9998" + y="229" /> + <path + sodipodi:type="arc" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline;opacity:0.25" + id="path13982" + sodipodi:cx="28" + sodipodi:cy="209" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 29,209 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + transform="matrix(1.5,0,0,1.5,-8.5002,-88.000001)" /> + <path + transform="matrix(1.5,0,0,1.5,-8.5002,-93.000001)" + d="m 29,209 c 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 0.552285,0 1,0.44772 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="209" + sodipodi:cx="28" + id="path13984" + style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline;opacity:0.25" + sodipodi:type="arc" /> + </g> + </g> +</svg> diff --git a/panels/sound/gvc-applet.c b/panels/sound/gvc-applet.c new file mode 100644 index 000000000..ef94ac57d --- /dev/null +++ b/panels/sound/gvc-applet.c @@ -0,0 +1,311 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> + +#include <glib.h> +#include <glib/gi18n.h> +#include <gtk/gtk.h> +#include <pulse/pulseaudio.h> + +#include "gvc-applet.h" +#include "gvc-mixer-control.h" +#include "gvc-stream-status-icon.h" + +#define GVC_APPLET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_APPLET, GvcAppletPrivate)) + +#define SCALE_SIZE 128 + +static const char *output_icon_names[] = { + "audio-volume-muted-symbolic", + "audio-volume-low-symbolic", + "audio-volume-medium-symbolic", + "audio-volume-high-symbolic", + NULL +}; + +static const char *input_icon_names[] = { + "audio-input-microphone-muted-symbolic", + "audio-input-microphone-low-symbolic", + "audio-input-microphone-medium-symbolic", + "audio-input-microphone-high-symbolic", + NULL +}; + +struct GvcAppletPrivate +{ + GvcStreamStatusIcon *input_status_icon; + GvcStreamStatusIcon *output_status_icon; + GvcMixerControl *control; +}; + +static void gvc_applet_class_init (GvcAppletClass *klass); +static void gvc_applet_init (GvcApplet *applet); +static void gvc_applet_finalize (GObject *object); + +G_DEFINE_TYPE (GvcApplet, gvc_applet, G_TYPE_OBJECT) + +static void +maybe_show_status_icons (GvcApplet *applet) +{ + gboolean show; + GvcMixerStream *stream; + GSList *source_outputs, *l; + + show = TRUE; + stream = gvc_mixer_control_get_default_sink (applet->priv->control); + if (stream == NULL) { + show = FALSE; + } + gtk_status_icon_set_visible (GTK_STATUS_ICON (applet->priv->output_status_icon), show); + + + show = FALSE; + stream = gvc_mixer_control_get_default_source (applet->priv->control); + source_outputs = gvc_mixer_control_get_source_outputs (applet->priv->control); + if (stream != NULL && source_outputs != NULL) { + /* Check that we're not trying to add the peak detector + * as an application doing recording */ + for (l = source_outputs ; l ; l = l->next) { + GvcMixerStream *s = l->data; + const char *id; + + id = gvc_mixer_stream_get_application_id (s); + if (id == NULL) { + show = TRUE; + break; + } + + if (!g_str_equal (id, "org.gnome.VolumeControl") && + !g_str_equal (id, "org.PulseAudio.pavucontrol")) { + show = TRUE; + break; + } + } + } + gtk_status_icon_set_visible (GTK_STATUS_ICON (applet->priv->input_status_icon), show); + + g_slist_free (source_outputs); +} + +void +gvc_applet_start (GvcApplet *applet) +{ + g_return_if_fail (GVC_IS_APPLET (applet)); + + maybe_show_status_icons (applet); +} + +static void +gvc_applet_dispose (GObject *object) +{ + GvcApplet *applet = GVC_APPLET (object); + + if (applet->priv->control != NULL) { + g_object_unref (applet->priv->control); + applet->priv->control = NULL; + } + + G_OBJECT_CLASS (gvc_applet_parent_class)->dispose (object); +} + +static void +update_default_source (GvcApplet *applet) +{ + GvcMixerStream *stream; + + stream = gvc_mixer_control_get_default_source (applet->priv->control); + if (stream != NULL) { + gvc_stream_status_icon_set_mixer_stream (applet->priv->input_status_icon, + stream); + maybe_show_status_icons(applet); + } else { + g_debug ("Unable to get default source, or no source available"); + } +} + +static void +update_default_sink (GvcApplet *applet) +{ + GvcMixerStream *stream; + + stream = gvc_mixer_control_get_default_sink (applet->priv->control); + if (stream != NULL) { + gvc_stream_status_icon_set_mixer_stream (applet->priv->output_status_icon, + stream); + maybe_show_status_icons(applet); + } else { + g_warning ("Unable to get default sink"); + } +} + +static void +on_control_ready (GvcMixerControl *control, + GvcApplet *applet) +{ + update_default_sink (applet); + update_default_source (applet); +} + +static void +on_control_connecting (GvcMixerControl *control, + GvcApplet *applet) +{ + g_debug ("Connecting.."); +} + +static void +on_control_default_sink_changed (GvcMixerControl *control, + guint id, + GvcApplet *applet) +{ + update_default_sink (applet); +} + +static void +on_control_default_source_changed (GvcMixerControl *control, + guint id, + GvcApplet *applet) +{ + update_default_source (applet); +} + +static void +on_control_stream_removed (GvcMixerControl *control, + guint id, + GvcApplet *applet) +{ + maybe_show_status_icons (applet); +} + +static void +on_control_stream_added (GvcMixerControl *control, + guint id, + GvcApplet *applet) +{ + maybe_show_status_icons (applet); +} + +static GObject * +gvc_applet_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcApplet *self; + + object = G_OBJECT_CLASS (gvc_applet_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_APPLET (object); + + self->priv->control = gvc_mixer_control_new ("GNOME Volume Control Applet"); + g_signal_connect (self->priv->control, + "ready", + G_CALLBACK (on_control_ready), + self); + g_signal_connect (self->priv->control, + "connecting", + G_CALLBACK (on_control_connecting), + self); + g_signal_connect (self->priv->control, + "default-sink-changed", + G_CALLBACK (on_control_default_sink_changed), + self); + g_signal_connect (self->priv->control, + "default-source-changed", + G_CALLBACK (on_control_default_source_changed), + self); + g_signal_connect (self->priv->control, + "stream-added", + G_CALLBACK (on_control_stream_added), + self); + g_signal_connect (self->priv->control, + "stream-removed", + G_CALLBACK (on_control_stream_removed), + self); + + gvc_mixer_control_open (self->priv->control); + + return object; +} + +static void +gvc_applet_class_init (GvcAppletClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gvc_applet_finalize; + object_class->dispose = gvc_applet_dispose; + object_class->constructor = gvc_applet_constructor; + + g_type_class_add_private (klass, sizeof (GvcAppletPrivate)); +} + +static void +gvc_applet_init (GvcApplet *applet) +{ + applet->priv = GVC_APPLET_GET_PRIVATE (applet); + + applet->priv->output_status_icon = gvc_stream_status_icon_new (NULL, + output_icon_names); + gvc_stream_status_icon_set_display_name (applet->priv->output_status_icon, + _("Output")); + gtk_status_icon_set_title (GTK_STATUS_ICON (applet->priv->output_status_icon), + _("Sound Output Volume")); + applet->priv->input_status_icon = gvc_stream_status_icon_new (NULL, + input_icon_names); + gvc_stream_status_icon_set_display_name (applet->priv->input_status_icon, + _("Input")); + gtk_status_icon_set_title (GTK_STATUS_ICON (applet->priv->input_status_icon), + _("Microphone Volume")); +} + +static void +gvc_applet_finalize (GObject *object) +{ + GvcApplet *applet; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_APPLET (object)); + + applet = GVC_APPLET (object); + + g_return_if_fail (applet->priv != NULL); + + + G_OBJECT_CLASS (gvc_applet_parent_class)->finalize (object); +} + +GvcApplet * +gvc_applet_new (void) +{ + GObject *applet; + + applet = g_object_new (GVC_TYPE_APPLET, NULL); + + return GVC_APPLET (applet); +} diff --git a/panels/sound/gvc-applet.h b/panels/sound/gvc-applet.h new file mode 100644 index 000000000..d9e031126 --- /dev/null +++ b/panels/sound/gvc-applet.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_APPLET_H +#define __GVC_APPLET_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_APPLET (gvc_applet_get_type ()) +#define GVC_APPLET(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_APPLET, GvcApplet)) +#define GVC_APPLET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_APPLET, GvcAppletClass)) +#define GVC_IS_APPLET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_APPLET)) +#define GVC_IS_APPLET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_APPLET)) +#define GVC_APPLET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_APPLET, GvcAppletClass)) + +typedef struct GvcAppletPrivate GvcAppletPrivate; + +typedef struct +{ + GObject parent; + GvcAppletPrivate *priv; +} GvcApplet; + +typedef struct +{ + GObjectClass parent_class; +} GvcAppletClass; + +GType gvc_applet_get_type (void); + +GvcApplet * gvc_applet_new (void); +void gvc_applet_start (GvcApplet *applet); + +G_END_DECLS + +#endif /* __GVC_APPLET_H */ diff --git a/panels/sound/gvc-balance-bar.c b/panels/sound/gvc-balance-bar.c new file mode 100644 index 000000000..78594bf36 --- /dev/null +++ b/panels/sound/gvc-balance-bar.c @@ -0,0 +1,550 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <canberra-gtk.h> +#include <pulse/pulseaudio.h> + +#include "gvc-balance-bar.h" +#include "gvc-channel-map-private.h" + +#define SCALE_SIZE 128 +#define ADJUSTMENT_MAX_NORMAL 65536.0 /* PA_VOLUME_NORM */ + +#define GVC_BALANCE_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_BALANCE_BAR, GvcBalanceBarPrivate)) + +struct GvcBalanceBarPrivate +{ + GvcChannelMap *channel_map; + GvcBalanceType btype; + GtkWidget *scale_box; + GtkWidget *start_box; + GtkWidget *end_box; + GtkWidget *label; + GtkWidget *scale; + GtkAdjustment *adjustment; + GtkSizeGroup *size_group; + gboolean symmetric; + gboolean click_lock; +}; + +enum +{ + PROP_0, + PROP_CHANNEL_MAP, + PROP_BALANCE_TYPE, +}; + +static void gvc_balance_bar_class_init (GvcBalanceBarClass *klass); +static void gvc_balance_bar_init (GvcBalanceBar *balance_bar); +static void gvc_balance_bar_finalize (GObject *object); + +static gboolean on_scale_button_press_event (GtkWidget *widget, + GdkEventButton *event, + GvcBalanceBar *bar); +static gboolean on_scale_button_release_event (GtkWidget *widget, + GdkEventButton *event, + GvcBalanceBar *bar); +static gboolean on_scale_scroll_event (GtkWidget *widget, + GdkEventScroll *event, + GvcBalanceBar *bar); +static void on_adjustment_value_changed (GtkAdjustment *adjustment, + GvcBalanceBar *bar); + +G_DEFINE_TYPE (GvcBalanceBar, gvc_balance_bar, GTK_TYPE_HBOX) + +static GtkWidget * +_scale_box_new (GvcBalanceBar *bar) +{ + GvcBalanceBarPrivate *priv = bar->priv; + GtkWidget *box; + GtkWidget *sbox; + GtkWidget *ebox; + GtkAdjustment *adjustment = bar->priv->adjustment; + char *str_lower, *str_upper; + gdouble lower, upper; + + bar->priv->scale_box = box = gtk_hbox_new (FALSE, 6); + priv->scale = gtk_hscale_new (priv->adjustment); + gtk_widget_set_size_request (priv->scale, SCALE_SIZE, -1); + + gtk_widget_set_name (priv->scale, "balance-bar-scale"); + gtk_rc_parse_string ("style \"balance-bar-scale-style\" {\n" + " GtkScale::trough-side-details = 0\n" + "}\n" + "widget \"*.balance-bar-scale\" style : rc \"balance-bar-scale-style\"\n"); + + bar->priv->start_box = sbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), sbox, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (sbox), priv->label, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (box), priv->scale, TRUE, TRUE, 0); + + switch (bar->priv->btype) { + case BALANCE_TYPE_RL: + str_lower = g_strdup_printf ("<small>%s</small>", C_("balance", "Left")); + str_upper = g_strdup_printf ("<small>%s</small>", C_("balance", "Right")); + break; + case BALANCE_TYPE_FR: + str_lower = g_strdup_printf ("<small>%s</small>", C_("balance", "Rear")); + str_upper = g_strdup_printf ("<small>%s</small>", C_("balance", "Front")); + break; + case BALANCE_TYPE_LFE: + str_lower = g_strdup_printf ("<small>%s</small>", C_("balance", "Minimum")); + str_upper = g_strdup_printf ("<small>%s</small>", C_("balance", "Maximum")); + break; + default: + g_assert_not_reached (); + } + + lower = gtk_adjustment_get_lower (adjustment); + gtk_scale_add_mark (GTK_SCALE (priv->scale), lower, + GTK_POS_BOTTOM, str_lower); + g_free (str_lower); + upper = gtk_adjustment_get_upper (adjustment); + gtk_scale_add_mark (GTK_SCALE (priv->scale), upper, + GTK_POS_BOTTOM, str_upper); + g_free (str_upper); + + if (bar->priv->btype != BALANCE_TYPE_LFE) { + gtk_scale_add_mark (GTK_SCALE (priv->scale), + (upper - lower)/2 + lower, + GTK_POS_BOTTOM, NULL); + } + + bar->priv->end_box = ebox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), ebox, FALSE, FALSE, 0); + + gtk_range_set_update_policy (GTK_RANGE (priv->scale), GTK_UPDATE_CONTINUOUS); + ca_gtk_widget_disable_sounds (bar->priv->scale, FALSE); + gtk_widget_add_events (bar->priv->scale, GDK_SCROLL_MASK); + + g_signal_connect (G_OBJECT (bar->priv->scale), "button-press-event", + G_CALLBACK (on_scale_button_press_event), bar); + g_signal_connect (G_OBJECT (bar->priv->scale), "button-release-event", + G_CALLBACK (on_scale_button_release_event), bar); + g_signal_connect (G_OBJECT (bar->priv->scale), "scroll-event", + G_CALLBACK (on_scale_scroll_event), bar); + + if (bar->priv->size_group != NULL) { + gtk_size_group_add_widget (bar->priv->size_group, sbox); + + if (bar->priv->symmetric) { + gtk_size_group_add_widget (bar->priv->size_group, ebox); + } + } + + gtk_scale_set_draw_value (GTK_SCALE (priv->scale), FALSE); + + return box; +} + +void +gvc_balance_bar_set_size_group (GvcBalanceBar *bar, + GtkSizeGroup *group, + gboolean symmetric) +{ + g_return_if_fail (GVC_IS_BALANCE_BAR (bar)); + + bar->priv->size_group = group; + bar->priv->symmetric = symmetric; + + if (bar->priv->size_group != NULL) { + gtk_size_group_add_widget (bar->priv->size_group, + bar->priv->start_box); + + if (bar->priv->symmetric) { + gtk_size_group_add_widget (bar->priv->size_group, + bar->priv->end_box); + } + } + gtk_widget_queue_draw (GTK_WIDGET (bar)); +} + +static const char * +btype_to_string (guint btype) +{ + switch (btype) { + case BALANCE_TYPE_RL: + return "Balance"; + case BALANCE_TYPE_FR: + return "Fade"; + break; + case BALANCE_TYPE_LFE: + return "LFE"; + default: + g_assert_not_reached (); + } + return NULL; +} + +static void +update_level_from_map (GvcBalanceBar *bar, + GvcChannelMap *map) +{ + const gdouble *volumes; + gdouble val; + + g_debug ("Volume changed (for %s bar)", btype_to_string (bar->priv->btype)); + + volumes = gvc_channel_map_get_volume (map); + switch (bar->priv->btype) { + case BALANCE_TYPE_RL: + val = volumes[BALANCE]; + break; + case BALANCE_TYPE_FR: + val = volumes[FADE]; + break; + case BALANCE_TYPE_LFE: + val = volumes[LFE]; + break; + default: + g_assert_not_reached (); + } + + gtk_adjustment_set_value (bar->priv->adjustment, val); +} + +static void +on_channel_map_volume_changed (GvcChannelMap *map, + gboolean set, + GvcBalanceBar *bar) +{ + update_level_from_map (bar, map); +} + +static void +gvc_balance_bar_set_channel_map (GvcBalanceBar *bar, + GvcChannelMap *map) +{ + g_return_if_fail (GVC_BALANCE_BAR (bar)); + + if (bar->priv->channel_map != NULL) { + g_signal_handlers_disconnect_by_func (G_OBJECT (bar->priv->channel_map), + on_channel_map_volume_changed, bar); + g_object_unref (bar->priv->channel_map); + } + bar->priv->channel_map = g_object_ref (map); + + update_level_from_map (bar, map); + + g_signal_connect (G_OBJECT (map), "volume-changed", + G_CALLBACK (on_channel_map_volume_changed), bar); + + g_object_notify (G_OBJECT (bar), "channel-map"); +} + +static void +gvc_balance_bar_set_balance_type (GvcBalanceBar *bar, + GvcBalanceType btype) +{ + GtkWidget *frame; + + g_return_if_fail (GVC_BALANCE_BAR (bar)); + + bar->priv->btype = btype; + if (bar->priv->btype != BALANCE_TYPE_LFE) { + bar->priv->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, + -1.0, + 1.0, + 0.5, + 0.5, + 0.0)); + } else { + bar->priv->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, + 0.0, + ADJUSTMENT_MAX_NORMAL, + ADJUSTMENT_MAX_NORMAL/100.0, + ADJUSTMENT_MAX_NORMAL/10.0, + 0.0)); + } + + g_object_ref_sink (bar->priv->adjustment); + g_signal_connect (bar->priv->adjustment, + "value-changed", + G_CALLBACK (on_adjustment_value_changed), + bar); + + switch (btype) { + case BALANCE_TYPE_RL: + bar->priv->label = gtk_label_new_with_mnemonic (_("_Balance:")); + break; + case BALANCE_TYPE_FR: + bar->priv->label = gtk_label_new_with_mnemonic (_("_Fade:")); + break; + case BALANCE_TYPE_LFE: + bar->priv->label = gtk_label_new_with_mnemonic (_("_Subwoofer:")); + break; + default: + g_assert_not_reached (); + } + gtk_misc_set_alignment (GTK_MISC (bar->priv->label), + 0.0, + 0.0); + /* frame */ + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_container_add (GTK_CONTAINER (bar), frame); + + /* box with scale */ + bar->priv->scale_box = _scale_box_new (bar); + gtk_container_add (GTK_CONTAINER (frame), bar->priv->scale_box); + gtk_widget_show_all (frame); + + gtk_widget_set_direction (bar->priv->scale, GTK_TEXT_DIR_LTR); + gtk_label_set_mnemonic_widget (GTK_LABEL (bar->priv->label), + bar->priv->scale); + + g_object_notify (G_OBJECT (bar), "balance-type"); +} + +static void +gvc_balance_bar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcBalanceBar *self = GVC_BALANCE_BAR (object); + + switch (prop_id) { + case PROP_CHANNEL_MAP: + gvc_balance_bar_set_channel_map (self, g_value_get_object (value)); + break; + case PROP_BALANCE_TYPE: + gvc_balance_bar_set_balance_type (self, g_value_get_int (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_balance_bar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcBalanceBar *self = GVC_BALANCE_BAR (object); + + switch (prop_id) { + case PROP_CHANNEL_MAP: + g_value_set_object (value, self->priv->channel_map); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GObject * +gvc_balance_bar_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + return G_OBJECT_CLASS (gvc_balance_bar_parent_class)->constructor (type, n_construct_properties, construct_params); +} + +static void +gvc_balance_bar_class_init (GvcBalanceBarClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_balance_bar_constructor; + object_class->finalize = gvc_balance_bar_finalize; + object_class->set_property = gvc_balance_bar_set_property; + object_class->get_property = gvc_balance_bar_get_property; + + g_object_class_install_property (object_class, + PROP_CHANNEL_MAP, + g_param_spec_object ("channel-map", + "channel map", + "The channel map", + GVC_TYPE_CHANNEL_MAP, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_BALANCE_TYPE, + g_param_spec_int ("balance-type", + "balance type", + "Whether the balance is right-left or front-rear", + BALANCE_TYPE_RL, NUM_BALANCE_TYPES - 1, BALANCE_TYPE_RL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (klass, sizeof (GvcBalanceBarPrivate)); +} + + +static gboolean +on_scale_button_press_event (GtkWidget *widget, + GdkEventButton *event, + GvcBalanceBar *bar) +{ + bar->priv->click_lock = TRUE; + + return FALSE; +} + +static gboolean +on_scale_button_release_event (GtkWidget *widget, + GdkEventButton *event, + GvcBalanceBar *bar) +{ + bar->priv->click_lock = FALSE; + + return FALSE; +} + +static gboolean +on_scale_scroll_event (GtkWidget *widget, + GdkEventScroll *event, + GvcBalanceBar *bar) +{ + gdouble value; + + value = gtk_adjustment_get_value (bar->priv->adjustment); + + if (bar->priv->btype == BALANCE_TYPE_LFE) { + if (event->direction == GDK_SCROLL_UP) { + if (value + ADJUSTMENT_MAX_NORMAL/100.0 > ADJUSTMENT_MAX_NORMAL) + value = ADJUSTMENT_MAX_NORMAL; + else + value = value + ADJUSTMENT_MAX_NORMAL/100.0; + } else if (event->direction == GDK_SCROLL_DOWN) { + if (value - ADJUSTMENT_MAX_NORMAL/100.0 < 0) + value = 0.0; + else + value = value - ADJUSTMENT_MAX_NORMAL/100.0; + } + } else { + if (event->direction == GDK_SCROLL_UP) { + if (value + 0.01 > 1.0) + value = 1.0; + else + value = value + 0.01; + } else if (event->direction == GDK_SCROLL_DOWN) { + if (value - 0.01 < 0) + value = 0.0; + else + value = value - 0.01; + } + } + gtk_adjustment_set_value (bar->priv->adjustment, value); + + return TRUE; +} + +/* FIXME remove when we depend on a newer PA */ +static pa_cvolume * +gvc_pa_cvolume_set_position (pa_cvolume *cv, const pa_channel_map *map, pa_channel_position_t t, pa_volume_t v) { + unsigned c; + gboolean good = FALSE; + + g_assert(cv); + g_assert(map); + + g_return_val_if_fail(pa_cvolume_compatible_with_channel_map(cv, map), NULL); + g_return_val_if_fail(t < PA_CHANNEL_POSITION_MAX, NULL); + + for (c = 0; c < map->channels; c++) + if (map->map[c] == t) { + cv->values[c] = v; + good = TRUE; + } + + return good ? cv : NULL; +} + +static void +on_adjustment_value_changed (GtkAdjustment *adjustment, + GvcBalanceBar *bar) +{ + gdouble val; + pa_cvolume cv; + const pa_channel_map *pa_map; + + if (bar->priv->channel_map == NULL) + return; + + cv = *gvc_channel_map_get_cvolume (bar->priv->channel_map); + val = gtk_adjustment_get_value (adjustment); + + pa_map = gvc_channel_map_get_pa_channel_map (bar->priv->channel_map); + + switch (bar->priv->btype) { + case BALANCE_TYPE_RL: + pa_cvolume_set_balance (&cv, pa_map, val); + break; + case BALANCE_TYPE_FR: + pa_cvolume_set_fade (&cv, pa_map, val); + break; + case BALANCE_TYPE_LFE: + gvc_pa_cvolume_set_position (&cv, pa_map, PA_CHANNEL_POSITION_LFE, val); + break; + } + + gvc_channel_map_volume_changed (bar->priv->channel_map, &cv, TRUE); +} + +static void +gvc_balance_bar_init (GvcBalanceBar *bar) +{ + bar->priv = GVC_BALANCE_BAR_GET_PRIVATE (bar); +} + +static void +gvc_balance_bar_finalize (GObject *object) +{ + GvcBalanceBar *bar; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_BALANCE_BAR (object)); + + bar = GVC_BALANCE_BAR (object); + + g_return_if_fail (bar->priv != NULL); + + if (bar->priv->channel_map != NULL) { + g_signal_handlers_disconnect_by_func (G_OBJECT (bar->priv->channel_map), + on_channel_map_volume_changed, bar); + g_object_unref (bar->priv->channel_map); + } + + G_OBJECT_CLASS (gvc_balance_bar_parent_class)->finalize (object); +} + +GtkWidget * +gvc_balance_bar_new (const GvcChannelMap *channel_map, GvcBalanceType btype) +{ + GObject *bar; + bar = g_object_new (GVC_TYPE_BALANCE_BAR, + "channel-map", channel_map, + "balance-type", btype, + NULL); + return GTK_WIDGET (bar); +} diff --git a/panels/sound/gvc-balance-bar.h b/panels/sound/gvc-balance-bar.h new file mode 100644 index 000000000..95e96dc33 --- /dev/null +++ b/panels/sound/gvc-balance-bar.h @@ -0,0 +1,69 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_BALANCE_BAR_H +#define __GVC_BALANCE_BAR_H + +#include <glib-object.h> + +#include "gvc-channel-map.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_BALANCE_BAR (gvc_balance_bar_get_type ()) +#define GVC_BALANCE_BAR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_BALANCE_BAR, GvcBalanceBar)) +#define GVC_BALANCE_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_BALANCE_BAR, GvcBalanceBarClass)) +#define GVC_IS_BALANCE_BAR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_BALANCE_BAR)) +#define GVC_IS_BALANCE_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_BALANCE_BAR)) +#define GVC_BALANCE_BAR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_BALANCE_BAR, GvcBalanceBarClass)) + +typedef enum { + BALANCE_TYPE_RL, + BALANCE_TYPE_FR, + BALANCE_TYPE_LFE, +} GvcBalanceType; + +#define NUM_BALANCE_TYPES BALANCE_TYPE_LFE + 1 + +typedef struct GvcBalanceBarPrivate GvcBalanceBarPrivate; + +typedef struct +{ + GtkHBox parent; + GvcBalanceBarPrivate *priv; +} GvcBalanceBar; + +typedef struct +{ + GtkHBoxClass parent_class; +} GvcBalanceBarClass; + +GType gvc_balance_bar_get_type (void); + +GtkWidget * gvc_balance_bar_new (const GvcChannelMap *map, + GvcBalanceType btype); + +void gvc_balance_bar_set_size_group (GvcBalanceBar *bar, + GtkSizeGroup *group, + gboolean symmetric); + +G_END_DECLS + +#endif /* __GVC_BALANCE_BAR_H */ diff --git a/panels/sound/gvc-channel-bar.c b/panels/sound/gvc-channel-bar.c new file mode 100644 index 000000000..37b87bc2a --- /dev/null +++ b/panels/sound/gvc-channel-bar.c @@ -0,0 +1,963 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <pulse/pulseaudio.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <canberra-gtk.h> + +#include "gvc-channel-bar.h" + +#define SCALE_SIZE 128 +#define ADJUSTMENT_MAX_NORMAL 65536.0 /* PA_VOLUME_NORM */ +#define ADJUSTMENT_MAX_AMPLIFIED 98304.0 /* 1.5 * ADJUSTMENT_MAX_NORMAL */ +#define ADJUSTMENT_MAX (bar->priv->is_amplified ? ADJUSTMENT_MAX_AMPLIFIED : ADJUSTMENT_MAX_NORMAL) +#define SCROLLSTEP (ADJUSTMENT_MAX / 100.0 * 5.0) + +#define GVC_CHANNEL_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_CHANNEL_BAR, GvcChannelBarPrivate)) + +struct GvcChannelBarPrivate +{ + GtkOrientation orientation; + GtkWidget *scale_box; + GtkWidget *start_box; + GtkWidget *end_box; + GtkWidget *image; + GtkWidget *label; + GtkWidget *low_image; + GtkWidget *scale; + GtkWidget *high_image; + GtkWidget *mute_box; + GtkWidget *mute_button; + GtkAdjustment *adjustment; + GtkAdjustment *zero_adjustment; + gboolean show_mute; + gboolean is_muted; + char *name; + char *icon_name; + char *low_icon_name; + char *high_icon_name; + GtkSizeGroup *size_group; + gboolean symmetric; + gboolean click_lock; + gboolean is_amplified; + guint32 base_volume; +}; + +enum +{ + PROP_0, + PROP_ORIENTATION, + PROP_SHOW_MUTE, + PROP_IS_MUTED, + PROP_ADJUSTMENT, + PROP_NAME, + PROP_ICON_NAME, + PROP_LOW_ICON_NAME, + PROP_HIGH_ICON_NAME, + PROP_IS_AMPLIFIED, + PROP_ELLIPSIZE +}; + +static void gvc_channel_bar_class_init (GvcChannelBarClass *klass); +static void gvc_channel_bar_init (GvcChannelBar *channel_bar); +static void gvc_channel_bar_finalize (GObject *object); + +static gboolean on_scale_button_press_event (GtkWidget *widget, + GdkEventButton *event, + GvcChannelBar *bar); +static gboolean on_scale_button_release_event (GtkWidget *widget, + GdkEventButton *event, + GvcChannelBar *bar); +static gboolean on_scale_scroll_event (GtkWidget *widget, + GdkEventScroll *event, + GvcChannelBar *bar); + +G_DEFINE_TYPE (GvcChannelBar, gvc_channel_bar, GTK_TYPE_HBOX) + +static GtkWidget * +_scale_box_new (GvcChannelBar *bar) +{ + GvcChannelBarPrivate *priv = bar->priv; + GtkWidget *box; + GtkWidget *sbox; + GtkWidget *ebox; + + if (priv->orientation == GTK_ORIENTATION_VERTICAL) { + bar->priv->scale_box = box = gtk_vbox_new (FALSE, 6); + + priv->scale = gtk_vscale_new (priv->adjustment); + + gtk_widget_set_size_request (priv->scale, -1, SCALE_SIZE); + gtk_range_set_inverted (GTK_RANGE (priv->scale), TRUE); + + bar->priv->start_box = sbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), sbox, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (sbox), priv->image, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (sbox), priv->label, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (sbox), priv->high_image, FALSE, FALSE, 0); + gtk_widget_hide (priv->high_image); + gtk_box_pack_start (GTK_BOX (box), priv->scale, TRUE, TRUE, 0); + + bar->priv->end_box = ebox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), ebox, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (ebox), priv->low_image, FALSE, FALSE, 0); + gtk_widget_hide (priv->low_image); + + gtk_box_pack_start (GTK_BOX (ebox), priv->mute_box, FALSE, FALSE, 0); + } else { + bar->priv->scale_box = box = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), priv->image, FALSE, FALSE, 0); + + priv->scale = gtk_hscale_new (priv->adjustment); + + gtk_widget_set_size_request (priv->scale, SCALE_SIZE, -1); + + bar->priv->start_box = sbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), sbox, FALSE, FALSE, 0); + + gtk_box_pack_end (GTK_BOX (sbox), priv->low_image, FALSE, FALSE, 0); + gtk_widget_show (priv->low_image); + + gtk_box_pack_start (GTK_BOX (sbox), priv->label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box), priv->scale, TRUE, TRUE, 0); + + bar->priv->end_box = ebox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), ebox, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (ebox), priv->high_image, FALSE, FALSE, 0); + gtk_widget_show (priv->high_image); + gtk_box_pack_start (GTK_BOX (ebox), priv->mute_box, FALSE, FALSE, 0); + } + + gtk_range_set_update_policy (GTK_RANGE (priv->scale), GTK_UPDATE_CONTINUOUS); + ca_gtk_widget_disable_sounds (bar->priv->scale, FALSE); + gtk_widget_add_events (bar->priv->scale, GDK_SCROLL_MASK); + + g_signal_connect (G_OBJECT (bar->priv->scale), "button-press-event", + G_CALLBACK (on_scale_button_press_event), bar); + g_signal_connect (G_OBJECT (bar->priv->scale), "button-release-event", + G_CALLBACK (on_scale_button_release_event), bar); + g_signal_connect (G_OBJECT (bar->priv->scale), "scroll-event", + G_CALLBACK (on_scale_scroll_event), bar); + + if (bar->priv->size_group != NULL) { + gtk_size_group_add_widget (bar->priv->size_group, sbox); + + if (bar->priv->symmetric) { + gtk_size_group_add_widget (bar->priv->size_group, ebox); + } + } + + gtk_scale_set_draw_value (GTK_SCALE (priv->scale), FALSE); + + return box; +} + +static void +update_image (GvcChannelBar *bar) +{ + gtk_image_set_from_icon_name (GTK_IMAGE (bar->priv->image), + bar->priv->icon_name, + GTK_ICON_SIZE_DIALOG); + + if (bar->priv->icon_name != NULL) { + gtk_widget_show (bar->priv->image); + } else { + gtk_widget_hide (bar->priv->image); + } +} + +static void +update_label (GvcChannelBar *bar) +{ + if (bar->priv->name != NULL) { + gtk_label_set_text_with_mnemonic (GTK_LABEL (bar->priv->label), + bar->priv->name); + gtk_label_set_mnemonic_widget (GTK_LABEL (bar->priv->label), + bar->priv->scale); + gtk_widget_show (bar->priv->label); + } else { + gtk_label_set_text (GTK_LABEL (bar->priv->label), NULL); + gtk_widget_hide (bar->priv->label); + } +} + +static void +update_layout (GvcChannelBar *bar) +{ + GtkWidget *box; + GtkWidget *frame; + + if (bar->priv->scale == NULL) { + return; + } + + box = bar->priv->scale_box; + frame = gtk_widget_get_parent (box); + + g_object_ref (bar->priv->image); + g_object_ref (bar->priv->label); + g_object_ref (bar->priv->mute_box); + g_object_ref (bar->priv->low_image); + g_object_ref (bar->priv->high_image); + + gtk_container_remove (GTK_CONTAINER (bar->priv->start_box), bar->priv->image); + gtk_container_remove (GTK_CONTAINER (bar->priv->start_box), bar->priv->label); + gtk_container_remove (GTK_CONTAINER (bar->priv->end_box), bar->priv->mute_box); + + if (bar->priv->orientation == GTK_ORIENTATION_VERTICAL) { + gtk_container_remove (GTK_CONTAINER (bar->priv->start_box), bar->priv->low_image); + gtk_container_remove (GTK_CONTAINER (bar->priv->end_box), bar->priv->high_image); + } else { + gtk_container_remove (GTK_CONTAINER (bar->priv->end_box), bar->priv->low_image); + gtk_container_remove (GTK_CONTAINER (bar->priv->start_box), bar->priv->high_image); + } + + gtk_container_remove (GTK_CONTAINER (box), bar->priv->start_box); + gtk_container_remove (GTK_CONTAINER (box), bar->priv->scale); + gtk_container_remove (GTK_CONTAINER (box), bar->priv->end_box); + gtk_container_remove (GTK_CONTAINER (frame), box); + + bar->priv->scale_box = _scale_box_new (bar); + gtk_container_add (GTK_CONTAINER (frame), bar->priv->scale_box); + + g_object_unref (bar->priv->image); + g_object_unref (bar->priv->label); + g_object_unref (bar->priv->mute_box); + g_object_unref (bar->priv->low_image); + g_object_unref (bar->priv->high_image); + + gtk_widget_show_all (frame); +} + +void +gvc_channel_bar_set_size_group (GvcChannelBar *bar, + GtkSizeGroup *group, + gboolean symmetric) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + bar->priv->size_group = group; + bar->priv->symmetric = symmetric; + + if (bar->priv->size_group != NULL) { + gtk_size_group_add_widget (bar->priv->size_group, + bar->priv->start_box); + + if (bar->priv->symmetric) { + gtk_size_group_add_widget (bar->priv->size_group, + bar->priv->end_box); + } + } + gtk_widget_queue_draw (GTK_WIDGET (bar)); +} + +void +gvc_channel_bar_set_name (GvcChannelBar *bar, + const char *name) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + g_free (bar->priv->name); + bar->priv->name = g_strdup (name); + update_label (bar); + g_object_notify (G_OBJECT (bar), "name"); +} + +void +gvc_channel_bar_set_icon_name (GvcChannelBar *bar, + const char *name) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + g_free (bar->priv->icon_name); + bar->priv->icon_name = g_strdup (name); + update_image (bar); + g_object_notify (G_OBJECT (bar), "icon-name"); +} + +void +gvc_channel_bar_set_low_icon_name (GvcChannelBar *bar, + const char *name) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (name != NULL && strcmp (bar->priv->low_icon_name, name) != 0) { + g_free (bar->priv->low_icon_name); + bar->priv->low_icon_name = g_strdup (name); + gtk_image_set_from_icon_name (GTK_IMAGE (bar->priv->low_image), + bar->priv->low_icon_name, + GTK_ICON_SIZE_BUTTON); + g_object_notify (G_OBJECT (bar), "low-icon-name"); + } +} + +void +gvc_channel_bar_set_high_icon_name (GvcChannelBar *bar, + const char *name) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (name != NULL && strcmp (bar->priv->high_icon_name, name) != 0) { + g_free (bar->priv->high_icon_name); + bar->priv->high_icon_name = g_strdup (name); + gtk_image_set_from_icon_name (GTK_IMAGE (bar->priv->high_image), + bar->priv->high_icon_name, + GTK_ICON_SIZE_BUTTON); + g_object_notify (G_OBJECT (bar), "high-icon-name"); + } +} + +void +gvc_channel_bar_set_orientation (GvcChannelBar *bar, + GtkOrientation orientation) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (orientation != bar->priv->orientation) { + bar->priv->orientation = orientation; + update_layout (bar); + g_object_notify (G_OBJECT (bar), "orientation"); + } +} + +static void +gvc_channel_bar_set_adjustment (GvcChannelBar *bar, + GtkAdjustment *adjustment) +{ + g_return_if_fail (GVC_CHANNEL_BAR (bar)); + g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); + + if (bar->priv->adjustment != NULL) { + g_object_unref (bar->priv->adjustment); + } + bar->priv->adjustment = g_object_ref_sink (adjustment); + + if (bar->priv->scale != NULL) { + gtk_range_set_adjustment (GTK_RANGE (bar->priv->scale), adjustment); + } + + g_object_notify (G_OBJECT (bar), "adjustment"); +} + +GtkAdjustment * +gvc_channel_bar_get_adjustment (GvcChannelBar *bar) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_BAR (bar), NULL); + + return bar->priv->adjustment; +} + +static gboolean +on_scale_button_press_event (GtkWidget *widget, + GdkEventButton *event, + GvcChannelBar *bar) +{ + /* HACK: we want the behaviour you get with the middle button, so we + * mangle the event. clicking with other buttons moves the slider in + * step increments, clicking with the middle button moves the slider to + * the location of the click. + */ + if (event->button == 1) + event->button = 2; + + bar->priv->click_lock = TRUE; + + return FALSE; +} + +static gboolean +on_scale_button_release_event (GtkWidget *widget, + GdkEventButton *event, + GvcChannelBar *bar) +{ + GtkAdjustment *adj; + gdouble value; + + /* HACK: see on_scale_button_press_event() */ + if (event->button == 1) + event->button = 2; + + bar->priv->click_lock = FALSE; + + adj = gtk_range_get_adjustment (GTK_RANGE (widget)); + + value = gtk_adjustment_get_value (adj); + + /* this means the adjustment moved away from zero and + * therefore we should unmute and set the volume. */ + gvc_channel_bar_set_is_muted (bar, (value == 0.0)); + + /* Play a sound! */ + ca_gtk_play_for_widget (GTK_WIDGET (bar), 0, + CA_PROP_EVENT_ID, "audio-volume-change", + CA_PROP_EVENT_DESCRIPTION, "foobar event happened", + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", + NULL); + + return FALSE; +} + +gboolean +gvc_channel_bar_scroll (GvcChannelBar *bar, GdkScrollDirection direction) +{ + GtkAdjustment *adj; + gdouble value; + + g_return_val_if_fail (bar != NULL, FALSE); + g_return_val_if_fail (GVC_IS_CHANNEL_BAR (bar), FALSE); + + if (bar->priv->orientation == GTK_ORIENTATION_VERTICAL) { + if (direction != GDK_SCROLL_UP && direction != GDK_SCROLL_DOWN) + return FALSE; + } else { + /* Switch direction for RTL */ + if (gtk_widget_get_direction (GTK_WIDGET (bar)) == GTK_TEXT_DIR_RTL) { + if (direction == GDK_SCROLL_RIGHT) + direction = GDK_SCROLL_LEFT; + else if (direction == GDK_SCROLL_LEFT) + direction = GDK_SCROLL_RIGHT; + } + /* Switch side scroll to vertical */ + if (direction == GDK_SCROLL_RIGHT) + direction = GDK_SCROLL_UP; + else if (GDK_SCROLL_LEFT) + direction = GDK_SCROLL_DOWN; + } + + adj = gtk_range_get_adjustment (GTK_RANGE (bar->priv->scale)); + if (adj == bar->priv->zero_adjustment) { + if (direction == GDK_SCROLL_UP) + gvc_channel_bar_set_is_muted (bar, FALSE); + return TRUE; + } + + value = gtk_adjustment_get_value (adj); + + if (direction == GDK_SCROLL_UP) { + if (value + SCROLLSTEP > ADJUSTMENT_MAX) + value = ADJUSTMENT_MAX; + else + value = value + SCROLLSTEP; + } else if (direction == GDK_SCROLL_DOWN) { + if (value - SCROLLSTEP < 0) + value = 0.0; + else + value = value - SCROLLSTEP; + } + + gvc_channel_bar_set_is_muted (bar, (value == 0.0)); + adj = gtk_range_get_adjustment (GTK_RANGE (bar->priv->scale)); + gtk_adjustment_set_value (adj, value); + + return TRUE; +} + +static gboolean +on_scale_scroll_event (GtkWidget *widget, + GdkEventScroll *event, + GvcChannelBar *bar) +{ + return gvc_channel_bar_scroll (bar, event->direction); +} + +static void +on_zero_adjustment_value_changed (GtkAdjustment *adjustment, + GvcChannelBar *bar) +{ + gdouble value; + + if (bar->priv->click_lock != FALSE) { + return; + } + + value = gtk_adjustment_get_value (bar->priv->zero_adjustment); + gtk_adjustment_set_value (bar->priv->adjustment, value); + + + if (bar->priv->show_mute == FALSE) { + /* this means the adjustment moved away from zero and + * therefore we should unmute and set the volume. */ + gvc_channel_bar_set_is_muted (bar, value > 0.0); + } +} + +static void +update_mute_button (GvcChannelBar *bar) +{ + if (bar->priv->show_mute) { + gtk_widget_show (bar->priv->mute_button); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bar->priv->mute_button), + bar->priv->is_muted); + } else { + gtk_widget_hide (bar->priv->mute_button); + + if (bar->priv->is_muted) { + /* If we aren't showing the mute button then + * move slider to the zero. But we don't want to + * change the adjustment. */ + g_signal_handlers_block_by_func (bar->priv->zero_adjustment, + on_zero_adjustment_value_changed, + bar); + gtk_adjustment_set_value (bar->priv->zero_adjustment, 0); + g_signal_handlers_unblock_by_func (bar->priv->zero_adjustment, + on_zero_adjustment_value_changed, + bar); + gtk_range_set_adjustment (GTK_RANGE (bar->priv->scale), + bar->priv->zero_adjustment); + } else { + /* no longer muted so restore the original adjustment + * and tell the front-end that the value changed */ + gtk_range_set_adjustment (GTK_RANGE (bar->priv->scale), + bar->priv->adjustment); + gtk_adjustment_value_changed (bar->priv->adjustment); + } + } +} + +void +gvc_channel_bar_set_is_muted (GvcChannelBar *bar, + gboolean is_muted) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (is_muted != bar->priv->is_muted) { + /* Update our internal state before telling the + * front-end about our changes */ + bar->priv->is_muted = is_muted; + update_mute_button (bar); + g_object_notify (G_OBJECT (bar), "is-muted"); + } +} + +gboolean +gvc_channel_bar_get_is_muted (GvcChannelBar *bar) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_BAR (bar), FALSE); + return bar->priv->is_muted; +} + +void +gvc_channel_bar_set_show_mute (GvcChannelBar *bar, + gboolean show_mute) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (show_mute != bar->priv->show_mute) { + bar->priv->show_mute = show_mute; + g_object_notify (G_OBJECT (bar), "show-mute"); + update_mute_button (bar); + } +} + +gboolean +gvc_channel_bar_get_show_mute (GvcChannelBar *bar) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_BAR (bar), FALSE); + return bar->priv->show_mute; +} + +void +gvc_channel_bar_set_is_amplified (GvcChannelBar *bar, gboolean amplified) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + bar->priv->is_amplified = amplified; + gtk_adjustment_set_upper (bar->priv->adjustment, ADJUSTMENT_MAX); + gtk_adjustment_set_upper (bar->priv->zero_adjustment, ADJUSTMENT_MAX); + gtk_scale_clear_marks (GTK_SCALE (bar->priv->scale)); + + if (amplified) { + char *str; + + if (bar->priv->base_volume == ADJUSTMENT_MAX_NORMAL) { + str = g_strdup_printf ("<small>%s</small>", C_("volume", "100%")); + gtk_scale_add_mark (GTK_SCALE (bar->priv->scale), ADJUSTMENT_MAX_NORMAL, + GTK_POS_BOTTOM, str); + } else { + str = g_strdup_printf ("<small>%s</small>", C_("volume", "Unamplified")); + gtk_scale_add_mark (GTK_SCALE (bar->priv->scale), bar->priv->base_volume, + GTK_POS_BOTTOM, str); + /* Only show 100% if it's higher than the base volume */ + if (bar->priv->base_volume < ADJUSTMENT_MAX_NORMAL) { + str = g_strdup_printf ("<small>%s</small>", C_("volume", "100%")); + gtk_scale_add_mark (GTK_SCALE (bar->priv->scale), ADJUSTMENT_MAX_NORMAL, + GTK_POS_BOTTOM, str); + } + } + + g_free (str); + gtk_alignment_set (GTK_ALIGNMENT (bar->priv->mute_box), 0.5, 0, 0, 0); + gtk_misc_set_alignment (GTK_MISC (bar->priv->low_image), 0.5, 0); + gtk_misc_set_alignment (GTK_MISC (bar->priv->high_image), 0.5, 0); + gtk_misc_set_alignment (GTK_MISC (bar->priv->label), 0, 0); + } else { + gtk_alignment_set (GTK_ALIGNMENT (bar->priv->mute_box), 0.5, 0.5, 0, 0); + gtk_misc_set_alignment (GTK_MISC (bar->priv->low_image), 0.5, 0.5); + gtk_misc_set_alignment (GTK_MISC (bar->priv->high_image), 0.5, 0.5); + gtk_misc_set_alignment (GTK_MISC (bar->priv->label), 0, 0.5); + } +} + +gboolean +gvc_channel_bar_get_ellipsize (GvcChannelBar *bar) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_BAR (bar), FALSE); + + return gtk_label_get_ellipsize (GTK_LABEL (bar->priv->label)) != PANGO_ELLIPSIZE_NONE; +} + +void +gvc_channel_bar_set_ellipsize (GvcChannelBar *bar, + gboolean ellipsized) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (ellipsized) + gtk_label_set_ellipsize (GTK_LABEL (bar->priv->label), PANGO_ELLIPSIZE_END); + else + gtk_label_set_ellipsize (GTK_LABEL (bar->priv->label), PANGO_ELLIPSIZE_NONE); +} + +void +gvc_channel_bar_set_base_volume (GvcChannelBar *bar, + pa_volume_t base_volume) +{ + g_return_if_fail (GVC_IS_CHANNEL_BAR (bar)); + + if (base_volume == 0) { + bar->priv->base_volume = ADJUSTMENT_MAX_NORMAL; + return; + } + + /* Note that you need to call _is_amplified() afterwards to update the marks */ + bar->priv->base_volume = base_volume; +} + +static void +gvc_channel_bar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcChannelBar *self = GVC_CHANNEL_BAR (object); + + switch (prop_id) { + case PROP_ORIENTATION: + gvc_channel_bar_set_orientation (self, g_value_get_enum (value)); + break; + case PROP_IS_MUTED: + gvc_channel_bar_set_is_muted (self, g_value_get_boolean (value)); + break; + case PROP_SHOW_MUTE: + gvc_channel_bar_set_show_mute (self, g_value_get_boolean (value)); + break; + case PROP_NAME: + gvc_channel_bar_set_name (self, g_value_get_string (value)); + break; + case PROP_ICON_NAME: + gvc_channel_bar_set_icon_name (self, g_value_get_string (value)); + break; + case PROP_LOW_ICON_NAME: + gvc_channel_bar_set_low_icon_name (self, g_value_get_string (value)); + break; + case PROP_HIGH_ICON_NAME: + gvc_channel_bar_set_high_icon_name (self, g_value_get_string (value)); + break; + case PROP_ADJUSTMENT: + gvc_channel_bar_set_adjustment (self, g_value_get_object (value)); + break; + case PROP_IS_AMPLIFIED: + gvc_channel_bar_set_is_amplified (self, g_value_get_boolean (value)); + break; + case PROP_ELLIPSIZE: + gvc_channel_bar_set_ellipsize (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_channel_bar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcChannelBar *self = GVC_CHANNEL_BAR (object); + GvcChannelBarPrivate *priv = self->priv; + + switch (prop_id) { + case PROP_ORIENTATION: + g_value_set_enum (value, priv->orientation); + break; + case PROP_IS_MUTED: + g_value_set_boolean (value, priv->is_muted); + break; + case PROP_SHOW_MUTE: + g_value_set_boolean (value, priv->show_mute); + break; + case PROP_NAME: + g_value_set_string (value, priv->name); + break; + case PROP_ICON_NAME: + g_value_set_string (value, priv->icon_name); + break; + case PROP_LOW_ICON_NAME: + g_value_set_string (value, priv->low_icon_name); + break; + case PROP_HIGH_ICON_NAME: + g_value_set_string (value, priv->high_icon_name); + break; + case PROP_ADJUSTMENT: + g_value_set_object (value, gvc_channel_bar_get_adjustment (self)); + break; + case PROP_IS_AMPLIFIED: + g_value_set_boolean (value, priv->is_amplified); + break; + case PROP_ELLIPSIZE: + g_value_set_boolean (value, gvc_channel_bar_get_ellipsize (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GObject * +gvc_channel_bar_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcChannelBar *self; + + object = G_OBJECT_CLASS (gvc_channel_bar_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_CHANNEL_BAR (object); + + update_mute_button (self); + + return object; +} + +static void +gvc_channel_bar_class_init (GvcChannelBarClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_channel_bar_constructor; + object_class->finalize = gvc_channel_bar_finalize; + object_class->set_property = gvc_channel_bar_set_property; + object_class->get_property = gvc_channel_bar_get_property; + + g_object_class_install_property (object_class, + PROP_ORIENTATION, + g_param_spec_enum ("orientation", + "Orientation", + "The orientation of the scale", + GTK_TYPE_ORIENTATION, + GTK_ORIENTATION_VERTICAL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_IS_MUTED, + g_param_spec_boolean ("is-muted", + "is muted", + "Whether stream is muted", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_SHOW_MUTE, + g_param_spec_boolean ("show-mute", + "show mute", + "Whether stream is muted", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, + PROP_ADJUSTMENT, + g_param_spec_object ("adjustment", + "Adjustment", + "The GtkAdjustment that contains the current value of this scale button object", + GTK_TYPE_ADJUSTMENT, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "Name to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_ICON_NAME, + g_param_spec_string ("icon-name", + "Icon Name", + "Name of icon to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_LOW_ICON_NAME, + g_param_spec_string ("low-icon-name", + "Icon Name", + "Name of icon to display for this stream", + "audio-volume-low", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_HIGH_ICON_NAME, + g_param_spec_string ("high-icon-name", + "Icon Name", + "Name of icon to display for this stream", + "audio-volume-high", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_IS_AMPLIFIED, + g_param_spec_boolean ("is-amplified", + "Is amplified", + "Whether the stream is digitally amplified", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_ELLIPSIZE, + g_param_spec_boolean ("ellipsize", + "Label is ellipsized", + "Whether the label is ellipsized", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_type_class_add_private (klass, sizeof (GvcChannelBarPrivate)); +} + +static void +on_mute_button_toggled (GtkToggleButton *button, + GvcChannelBar *bar) +{ + gboolean is_muted; + is_muted = gtk_toggle_button_get_active (button); + gvc_channel_bar_set_is_muted (bar, is_muted); +} + +static void +gvc_channel_bar_init (GvcChannelBar *bar) +{ + GtkWidget *frame; + + bar->priv = GVC_CHANNEL_BAR_GET_PRIVATE (bar); + + bar->priv->base_volume = ADJUSTMENT_MAX_NORMAL; + bar->priv->low_icon_name = g_strdup ("audio-volume-low"); + bar->priv->high_icon_name = g_strdup ("audio-volume-high"); + + bar->priv->orientation = GTK_ORIENTATION_VERTICAL; + bar->priv->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, + 0.0, + ADJUSTMENT_MAX_NORMAL, + ADJUSTMENT_MAX_NORMAL/100.0, + ADJUSTMENT_MAX_NORMAL/10.0, + 0.0)); + g_object_ref_sink (bar->priv->adjustment); + + bar->priv->zero_adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, + 0.0, + ADJUSTMENT_MAX_NORMAL, + ADJUSTMENT_MAX_NORMAL/100.0, + ADJUSTMENT_MAX_NORMAL/10.0, + 0.0)); + g_object_ref_sink (bar->priv->zero_adjustment); + + g_signal_connect (bar->priv->zero_adjustment, + "value-changed", + G_CALLBACK (on_zero_adjustment_value_changed), + bar); + + bar->priv->mute_button = gtk_check_button_new_with_label (_("Mute")); + gtk_widget_set_no_show_all (bar->priv->mute_button, TRUE); + g_signal_connect (bar->priv->mute_button, + "toggled", + G_CALLBACK (on_mute_button_toggled), + bar); + bar->priv->mute_box = gtk_alignment_new (0.5, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (bar->priv->mute_box), bar->priv->mute_button); + + bar->priv->low_image = gtk_image_new_from_icon_name ("audio-volume-low", + GTK_ICON_SIZE_BUTTON); + gtk_widget_set_no_show_all (bar->priv->low_image, TRUE); + bar->priv->high_image = gtk_image_new_from_icon_name ("audio-volume-high", + GTK_ICON_SIZE_BUTTON); + gtk_widget_set_no_show_all (bar->priv->high_image, TRUE); + + bar->priv->image = gtk_image_new (); + gtk_widget_set_no_show_all (bar->priv->image, TRUE); + + bar->priv->label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (bar->priv->label), 0.0, 0.5); + gtk_widget_set_no_show_all (bar->priv->label, TRUE); + + /* frame */ + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_container_add (GTK_CONTAINER (bar), frame); + gtk_widget_show_all (frame); + + /* box with scale */ + bar->priv->scale_box = _scale_box_new (bar); + + gtk_container_add (GTK_CONTAINER (frame), bar->priv->scale_box); +} + +static void +gvc_channel_bar_finalize (GObject *object) +{ + GvcChannelBar *channel_bar; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_CHANNEL_BAR (object)); + + channel_bar = GVC_CHANNEL_BAR (object); + + g_return_if_fail (channel_bar->priv != NULL); + + g_free (channel_bar->priv->name); + g_free (channel_bar->priv->icon_name); + g_free (channel_bar->priv->low_icon_name); + g_free (channel_bar->priv->high_icon_name); + + G_OBJECT_CLASS (gvc_channel_bar_parent_class)->finalize (object); +} + +GtkWidget * +gvc_channel_bar_new (void) +{ + GObject *bar; + bar = g_object_new (GVC_TYPE_CHANNEL_BAR, + NULL); + return GTK_WIDGET (bar); +} diff --git a/panels/sound/gvc-channel-bar.h b/panels/sound/gvc-channel-bar.h new file mode 100644 index 000000000..6d3402d04 --- /dev/null +++ b/panels/sound/gvc-channel-bar.h @@ -0,0 +1,89 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_CHANNEL_BAR_H +#define __GVC_CHANNEL_BAR_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_CHANNEL_BAR (gvc_channel_bar_get_type ()) +#define GVC_CHANNEL_BAR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_CHANNEL_BAR, GvcChannelBar)) +#define GVC_CHANNEL_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_CHANNEL_BAR, GvcChannelBarClass)) +#define GVC_IS_CHANNEL_BAR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_CHANNEL_BAR)) +#define GVC_IS_CHANNEL_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_CHANNEL_BAR)) +#define GVC_CHANNEL_BAR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_CHANNEL_BAR, GvcChannelBarClass)) + +typedef struct GvcChannelBarPrivate GvcChannelBarPrivate; + +typedef struct +{ + GtkHBox parent; + GvcChannelBarPrivate *priv; +} GvcChannelBar; + +typedef struct +{ + GtkHBoxClass parent_class; +} GvcChannelBarClass; + +GType gvc_channel_bar_get_type (void); + +GtkWidget * gvc_channel_bar_new (void); + +void gvc_channel_bar_set_name (GvcChannelBar *bar, + const char *name); +void gvc_channel_bar_set_icon_name (GvcChannelBar *bar, + const char *icon_name); +void gvc_channel_bar_set_low_icon_name (GvcChannelBar *bar, + const char *icon_name); +void gvc_channel_bar_set_high_icon_name (GvcChannelBar *bar, + const char *icon_name); + +void gvc_channel_bar_set_orientation (GvcChannelBar *bar, + GtkOrientation orientation); +GtkOrientation gvc_channel_bar_get_orientation (GvcChannelBar *bar); + +GtkAdjustment * gvc_channel_bar_get_adjustment (GvcChannelBar *bar); + +gboolean gvc_channel_bar_get_is_muted (GvcChannelBar *bar); +void gvc_channel_bar_set_is_muted (GvcChannelBar *bar, + gboolean is_muted); +gboolean gvc_channel_bar_get_show_mute (GvcChannelBar *bar); +void gvc_channel_bar_set_show_mute (GvcChannelBar *bar, + gboolean show_mute); +void gvc_channel_bar_set_size_group (GvcChannelBar *bar, + GtkSizeGroup *group, + gboolean symmetric); +void gvc_channel_bar_set_is_amplified (GvcChannelBar *bar, + gboolean amplified); +void gvc_channel_bar_set_base_volume (GvcChannelBar *bar, + guint32 base_volume); +gboolean gvc_channel_bar_get_ellipsize (GvcChannelBar *bar); +void gvc_channel_bar_set_ellipsize (GvcChannelBar *bar, + gboolean ellipsized); + +gboolean gvc_channel_bar_scroll (GvcChannelBar *bar, + GdkScrollDirection direction); + +G_END_DECLS + +#endif /* __GVC_CHANNEL_BAR_H */ diff --git a/panels/sound/gvc-channel-map-private.h b/panels/sound/gvc-channel-map-private.h new file mode 100644 index 000000000..3949de3a6 --- /dev/null +++ b/panels/sound/gvc-channel-map-private.h @@ -0,0 +1,39 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_CHANNEL_MAP_PRIVATE_H +#define __GVC_CHANNEL_MAP_PRIVATE_H + +#include <glib-object.h> +#include <pulse/pulseaudio.h> + +G_BEGIN_DECLS + +GvcChannelMap * gvc_channel_map_new_from_pa_channel_map (const pa_channel_map *map); +const pa_channel_map * gvc_channel_map_get_pa_channel_map (const GvcChannelMap *map); + +void gvc_channel_map_volume_changed (GvcChannelMap *map, + const pa_cvolume *cv, + gboolean set); +const pa_cvolume * gvc_channel_map_get_cvolume (const GvcChannelMap *map); + +G_END_DECLS + +#endif /* __GVC_CHANNEL_MAP_PRIVATE_H */ diff --git a/panels/sound/gvc-channel-map.c b/panels/sound/gvc-channel-map.c new file mode 100644 index 000000000..a2073fd33 --- /dev/null +++ b/panels/sound/gvc-channel-map.c @@ -0,0 +1,254 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-channel-map.h" +#include "gvc-channel-map-private.h" + +#define GVC_CHANNEL_MAP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_CHANNEL_MAP, GvcChannelMapPrivate)) + +struct GvcChannelMapPrivate +{ + pa_channel_map pa_map; + gboolean pa_volume_is_set; + pa_cvolume pa_volume; + gdouble extern_volume[NUM_TYPES]; /* volume, balance, fade, lfe */ + gboolean can_balance; + gboolean can_fade; +}; + +enum { + VOLUME_CHANGED, + LAST_SIGNAL +}; + +static guint signals [LAST_SIGNAL] = { 0, }; + +static void gvc_channel_map_class_init (GvcChannelMapClass *klass); +static void gvc_channel_map_init (GvcChannelMap *channel_map); +static void gvc_channel_map_finalize (GObject *object); + +G_DEFINE_TYPE (GvcChannelMap, gvc_channel_map, G_TYPE_OBJECT) + +guint +gvc_channel_map_get_num_channels (const GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), 0); + + if (!pa_channel_map_valid(&map->priv->pa_map)) + return 0; + + return map->priv->pa_map.channels; +} + +const gdouble * +gvc_channel_map_get_volume (GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL); + + if (!pa_channel_map_valid(&map->priv->pa_map)) + return NULL; + + map->priv->extern_volume[VOLUME] = (gdouble) pa_cvolume_max (&map->priv->pa_volume); + if (gvc_channel_map_can_balance (map)) + map->priv->extern_volume[BALANCE] = (gdouble) pa_cvolume_get_balance (&map->priv->pa_volume, &map->priv->pa_map); + else + map->priv->extern_volume[BALANCE] = 0; + if (gvc_channel_map_can_fade (map)) + map->priv->extern_volume[FADE] = (gdouble) pa_cvolume_get_fade (&map->priv->pa_volume, &map->priv->pa_map); + else + map->priv->extern_volume[FADE] = 0; + if (gvc_channel_map_has_lfe (map)) + map->priv->extern_volume[LFE] = (gdouble) pa_cvolume_get_position (&map->priv->pa_volume, &map->priv->pa_map, PA_CHANNEL_POSITION_LFE); + else + map->priv->extern_volume[LFE] = 0; + + return map->priv->extern_volume; +} + +gboolean +gvc_channel_map_can_balance (const GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE); + + return map->priv->can_balance; +} + +gboolean +gvc_channel_map_can_fade (const GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE); + + return map->priv->can_fade; +} + +const char * +gvc_channel_map_get_mapping (const GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL); + + if (!pa_channel_map_valid(&map->priv->pa_map)) + return NULL; + + return pa_channel_map_to_pretty_name (&map->priv->pa_map); +} + +/** + * gvc_channel_map_has_position: (skip) + * + * @map: + * @position: + * + * Returns: + */ +gboolean +gvc_channel_map_has_position (const GvcChannelMap *map, + pa_channel_position_t position) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE); + + return pa_channel_map_has_position (&(map->priv->pa_map), position); +} + +const pa_channel_map * +gvc_channel_map_get_pa_channel_map (const GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL); + + if (!pa_channel_map_valid(&map->priv->pa_map)) + return NULL; + + return &map->priv->pa_map; +} + +const pa_cvolume * +gvc_channel_map_get_cvolume (const GvcChannelMap *map) +{ + g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL); + + if (!pa_channel_map_valid(&map->priv->pa_map)) + return NULL; + + return &map->priv->pa_volume; +} + +static void +gvc_channel_map_class_init (GvcChannelMapClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = gvc_channel_map_finalize; + + signals [VOLUME_CHANGED] = + g_signal_new ("volume-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcChannelMapClass, volume_changed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + g_type_class_add_private (klass, sizeof (GvcChannelMapPrivate)); +} + +void +gvc_channel_map_volume_changed (GvcChannelMap *map, + const pa_cvolume *cv, + gboolean set) +{ + g_return_if_fail (GVC_IS_CHANNEL_MAP (map)); + g_return_if_fail (cv != NULL); + g_return_if_fail (pa_cvolume_compatible_with_channel_map(cv, &map->priv->pa_map)); + + if (pa_cvolume_equal(cv, &map->priv->pa_volume)) + return; + + map->priv->pa_volume = *cv; + + if (map->priv->pa_volume_is_set == FALSE) { + map->priv->pa_volume_is_set = TRUE; + return; + } + g_signal_emit (map, signals[VOLUME_CHANGED], 0, set); +} + +static void +gvc_channel_map_init (GvcChannelMap *map) +{ + map->priv = GVC_CHANNEL_MAP_GET_PRIVATE (map); + map->priv->pa_volume_is_set = FALSE; +} + +static void +gvc_channel_map_finalize (GObject *object) +{ + GvcChannelMap *channel_map; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_CHANNEL_MAP (object)); + + channel_map = GVC_CHANNEL_MAP (object); + + g_return_if_fail (channel_map->priv != NULL); + + G_OBJECT_CLASS (gvc_channel_map_parent_class)->finalize (object); +} + +GvcChannelMap * +gvc_channel_map_new (void) +{ + GObject *map; + map = g_object_new (GVC_TYPE_CHANNEL_MAP, NULL); + return GVC_CHANNEL_MAP (map); +} + +static void +set_from_pa_map (GvcChannelMap *map, + const pa_channel_map *pa_map) +{ + g_assert (pa_channel_map_valid(pa_map)); + + map->priv->can_balance = pa_channel_map_can_balance (pa_map); + map->priv->can_fade = pa_channel_map_can_fade (pa_map); + + map->priv->pa_map = *pa_map; + pa_cvolume_set(&map->priv->pa_volume, pa_map->channels, PA_VOLUME_NORM); +} + +GvcChannelMap * +gvc_channel_map_new_from_pa_channel_map (const pa_channel_map *pa_map) +{ + GObject *map; + map = g_object_new (GVC_TYPE_CHANNEL_MAP, NULL); + + set_from_pa_map (GVC_CHANNEL_MAP (map), pa_map); + + return GVC_CHANNEL_MAP (map); +} diff --git a/panels/sound/gvc-channel-map.h b/panels/sound/gvc-channel-map.h new file mode 100644 index 000000000..85c577289 --- /dev/null +++ b/panels/sound/gvc-channel-map.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_CHANNEL_MAP_H +#define __GVC_CHANNEL_MAP_H + +#include <glib-object.h> +#include <gvc-pulseaudio-fake.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_CHANNEL_MAP (gvc_channel_map_get_type ()) +#define GVC_CHANNEL_MAP(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_CHANNEL_MAP, GvcChannelMap)) +#define GVC_CHANNEL_MAP_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_CHANNEL_MAP, GvcChannelMapClass)) +#define GVC_IS_CHANNEL_MAP(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_CHANNEL_MAP)) +#define GVC_IS_CHANNEL_MAP_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_CHANNEL_MAP)) +#define GVC_CHANNEL_MAP_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_CHANNEL_MAP, GvcChannelMapClass)) + +typedef struct GvcChannelMapPrivate GvcChannelMapPrivate; + +typedef struct +{ + GObject parent; + GvcChannelMapPrivate *priv; +} GvcChannelMap; + +typedef struct +{ + GObjectClass parent_class; + void (*volume_changed) (GvcChannelMap *channel_map, gboolean set); +} GvcChannelMapClass; + +enum { + VOLUME, + BALANCE, + FADE, + LFE, + NUM_TYPES +}; + +GType gvc_channel_map_get_type (void); + +GvcChannelMap * gvc_channel_map_new (void); +guint gvc_channel_map_get_num_channels (const GvcChannelMap *map); +const gdouble * gvc_channel_map_get_volume (GvcChannelMap *map); +gboolean gvc_channel_map_can_balance (const GvcChannelMap *map); +gboolean gvc_channel_map_can_fade (const GvcChannelMap *map); +gboolean gvc_channel_map_has_position (const GvcChannelMap *map, + pa_channel_position_t position); +#define gvc_channel_map_has_lfe(x) gvc_channel_map_has_position (x, PA_CHANNEL_POSITION_LFE) + +const char * gvc_channel_map_get_mapping (const GvcChannelMap *map); + +G_END_DECLS + +#endif /* __GVC_CHANNEL_MAP_H */ diff --git a/panels/sound/gvc-combo-box.c b/panels/sound/gvc-combo-box.c new file mode 100644 index 000000000..7e14fb27c --- /dev/null +++ b/panels/sound/gvc-combo-box.c @@ -0,0 +1,395 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2009 Bastien Nocera + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <canberra-gtk.h> +#include <pulse/pulseaudio.h> + +#include "gvc-combo-box.h" +#include "gvc-mixer-stream.h" +#include "gvc-mixer-card.h" + +#define GVC_COMBO_BOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_COMBO_BOX, GvcComboBoxPrivate)) + +struct GvcComboBoxPrivate +{ + GtkWidget *drop_box; + GtkWidget *start_box; + GtkWidget *end_box; + GtkWidget *label; + GtkWidget *button; + GtkTreeModel *model; + GtkWidget *combobox; + gboolean set_called; + GtkSizeGroup *size_group; + gboolean symmetric; +}; + +enum { + COL_NAME, + COL_HUMAN_NAME, + NUM_COLS +}; + +enum { + CHANGED, + BUTTON_CLICKED, + LAST_SIGNAL +}; + +enum { + PROP_0, + PROP_LABEL, + PROP_SHOW_BUTTON, + PROP_BUTTON_LABEL +}; + +static guint signals [LAST_SIGNAL] = { 0, }; + +static void gvc_combo_box_class_init (GvcComboBoxClass *klass); +static void gvc_combo_box_init (GvcComboBox *combo_box); +static void gvc_combo_box_finalize (GObject *object); + +G_DEFINE_TYPE (GvcComboBox, gvc_combo_box, GTK_TYPE_HBOX) + +void +gvc_combo_box_set_size_group (GvcComboBox *combo_box, + GtkSizeGroup *group, + gboolean symmetric) +{ + g_return_if_fail (GVC_IS_COMBO_BOX (combo_box)); + + combo_box->priv->size_group = group; + combo_box->priv->symmetric = symmetric; + + if (combo_box->priv->size_group != NULL) { + gtk_size_group_add_widget (combo_box->priv->size_group, + combo_box->priv->start_box); + + if (combo_box->priv->symmetric) { + gtk_size_group_add_widget (combo_box->priv->size_group, + combo_box->priv->end_box); + } + } + gtk_widget_queue_draw (GTK_WIDGET (combo_box)); +} + +static void +gvc_combo_box_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcComboBox *self = GVC_COMBO_BOX (object); + + switch (prop_id) { + case PROP_LABEL: + gtk_label_set_text_with_mnemonic (GTK_LABEL (self->priv->label), g_value_get_string (value)); + break; + case PROP_BUTTON_LABEL: + gtk_button_set_label (GTK_BUTTON (self->priv->button), g_value_get_string (value)); + break; + case PROP_SHOW_BUTTON: + gtk_widget_set_visible (self->priv->button, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_combo_box_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcComboBox *self = GVC_COMBO_BOX (object); + + switch (prop_id) { + case PROP_LABEL: + g_value_set_string (value, + gtk_label_get_text (GTK_LABEL (self->priv->label))); + break; + case PROP_BUTTON_LABEL: + g_value_set_string (value, + gtk_button_get_label (GTK_BUTTON (self->priv->button))); + break; + case PROP_SHOW_BUTTON: + g_value_set_boolean (value, + gtk_widget_get_visible (self->priv->button)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_combo_box_class_init (GvcComboBoxClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gvc_combo_box_finalize; + object_class->set_property = gvc_combo_box_set_property; + object_class->get_property = gvc_combo_box_get_property; + + g_object_class_install_property (object_class, + PROP_LABEL, + g_param_spec_string ("label", + "label", + "The combo box label", + _("_Profile:"), + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_SHOW_BUTTON, + g_param_spec_boolean ("show-button", + "show-button", + "Whether to show the button", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_BUTTON_LABEL, + g_param_spec_string ("button-label", + "button-label", + "The button's label", + "APPLICATION BUG", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + signals [CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcComboBoxClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + signals [BUTTON_CLICKED] = + g_signal_new ("button-clicked", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcComboBoxClass, button_clicked), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + g_type_class_add_private (klass, sizeof (GvcComboBoxPrivate)); +} + +void +gvc_combo_box_set_profiles (GvcComboBox *combo_box, + const GList *profiles) +{ + const GList *l; + + g_return_if_fail (GVC_IS_COMBO_BOX (combo_box)); + g_return_if_fail (combo_box->priv->set_called == FALSE); + + for (l = profiles; l != NULL; l = l->next) { + GvcMixerCardProfile *p = l->data; + + gtk_list_store_insert_with_values (GTK_LIST_STORE (combo_box->priv->model), + NULL, + G_MAXINT, + COL_NAME, p->profile, + COL_HUMAN_NAME, p->human_profile, + -1); + } + combo_box->priv->set_called = TRUE; +} + +void +gvc_combo_box_set_ports (GvcComboBox *combo_box, + const GList *ports) +{ + const GList *l; + + g_return_if_fail (GVC_IS_COMBO_BOX (combo_box)); + g_return_if_fail (combo_box->priv->set_called == FALSE); + + for (l = ports; l != NULL; l = l->next) { + GvcMixerStreamPort *p = l->data; + + gtk_list_store_insert_with_values (GTK_LIST_STORE (combo_box->priv->model), + NULL, + G_MAXINT, + COL_NAME, p->port, + COL_HUMAN_NAME, p->human_port, + -1); + } + combo_box->priv->set_called = TRUE; +} + +void +gvc_combo_box_set_active (GvcComboBox *combo_box, + const char *id) +{ + GtkTreeIter iter; + gboolean cont; + + cont = gtk_tree_model_get_iter_first (combo_box->priv->model, &iter); + while (cont != FALSE) { + char *name; + + gtk_tree_model_get (combo_box->priv->model, &iter, + COL_NAME, &name, + -1); + if (g_strcmp0 (name, id) == 0) { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo_box->priv->combobox), &iter); + return; + } + gtk_tree_model_iter_next (combo_box->priv->model, &iter); + } + g_warning ("Could not find id '%s' in combo box", id); +} + +static void +on_combo_box_changed (GtkComboBox *widget, + GvcComboBox *combo_box) +{ + GtkTreeIter iter; + char *profile; + + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter) == FALSE) { + g_warning ("Could not find an active profile or port"); + return; + } + + gtk_tree_model_get (combo_box->priv->model, &iter, + COL_NAME, &profile, + -1); + g_signal_emit (combo_box, signals[CHANGED], 0, profile); + g_free (profile); +} + +static void +on_combo_box_button_clicked (GtkButton *button, + GvcComboBox *combo_box) +{ + g_signal_emit (combo_box, signals[BUTTON_CLICKED], 0); +} + +static void +gvc_combo_box_init (GvcComboBox *combo_box) +{ + GtkWidget *frame; + GtkWidget *box; + GtkWidget *sbox; + GtkWidget *ebox; + GtkCellRenderer *renderer; + + + combo_box->priv = GVC_COMBO_BOX_GET_PRIVATE (combo_box); + + combo_box->priv->model = GTK_TREE_MODEL (gtk_list_store_new (NUM_COLS, + G_TYPE_STRING, + G_TYPE_STRING)); + + combo_box->priv->label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (combo_box->priv->label), + 0.0, + 0.5); + + /* frame */ + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_container_add (GTK_CONTAINER (combo_box), frame); + + combo_box->priv->drop_box = box = gtk_hbox_new (FALSE, 6); + combo_box->priv->combobox = gtk_combo_box_new_with_model (combo_box->priv->model); + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box->priv->combobox), + renderer, FALSE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo_box->priv->combobox), + renderer, + "text", COL_HUMAN_NAME); + +/* gtk_widget_set_size_request (combo_box->priv->combobox, 128, -1); */ + + combo_box->priv->start_box = sbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), sbox, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (sbox), combo_box->priv->label, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (box), combo_box->priv->combobox, TRUE, TRUE, 0); + + combo_box->priv->button = gtk_button_new_with_label ("APPLICATION BUG"); + gtk_widget_set_no_show_all (combo_box->priv->button, TRUE); + gtk_box_pack_start (GTK_BOX (box), combo_box->priv->button, FALSE, FALSE, 0); + + + combo_box->priv->end_box = ebox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), ebox, FALSE, FALSE, 0); + + if (combo_box->priv->size_group != NULL) { + gtk_size_group_add_widget (combo_box->priv->size_group, sbox); + + if (combo_box->priv->symmetric) { + gtk_size_group_add_widget (combo_box->priv->size_group, ebox); + } + } + + gtk_container_add (GTK_CONTAINER (frame), combo_box->priv->drop_box); + gtk_widget_show_all (frame); + + gtk_label_set_mnemonic_widget (GTK_LABEL (combo_box->priv->label), + combo_box->priv->combobox); + + g_signal_connect (G_OBJECT (combo_box->priv->combobox), "changed", + G_CALLBACK (on_combo_box_changed), combo_box); + g_signal_connect (G_OBJECT (combo_box->priv->button), "clicked", + G_CALLBACK (on_combo_box_button_clicked), combo_box); +} + +static void +gvc_combo_box_finalize (GObject *object) +{ + GvcComboBox *combo_box; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_COMBO_BOX (object)); + + combo_box = GVC_COMBO_BOX (object); + + g_return_if_fail (combo_box->priv != NULL); + + g_object_unref (combo_box->priv->model); + combo_box->priv->model = NULL; + + G_OBJECT_CLASS (gvc_combo_box_parent_class)->finalize (object); +} + +GtkWidget * +gvc_combo_box_new (const char *label) +{ + GObject *combo_box; + combo_box = g_object_new (GVC_TYPE_COMBO_BOX, + "label", label, + NULL); + return GTK_WIDGET (combo_box); +} + diff --git a/panels/sound/gvc-combo-box.h b/panels/sound/gvc-combo-box.h new file mode 100644 index 000000000..f1ffc0dc0 --- /dev/null +++ b/panels/sound/gvc-combo-box.h @@ -0,0 +1,67 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_COMBO_BOX_H +#define __GVC_COMBO_BOX_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_COMBO_BOX (gvc_combo_box_get_type ()) +#define GVC_COMBO_BOX(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_COMBO_BOX, GvcComboBox)) +#define GVC_COMBO_BOX_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_COMBO_BOX, GvcComboBoxClass)) +#define GVC_IS_COMBO_BOX(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_COMBO_BOX)) +#define GVC_IS_COMBO_BOX_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_COMBO_BOX)) +#define GVC_COMBO_BOX_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_COMBO_BOX, GvcComboBoxClass)) + +typedef struct GvcComboBoxPrivate GvcComboBoxPrivate; + +typedef struct +{ + GtkHBox parent; + GvcComboBoxPrivate *priv; +} GvcComboBox; + +typedef struct +{ + GtkHBoxClass parent_class; + void (* changed) (GvcComboBox *combobox, const char *name); + void (* button_clicked) (GvcComboBox *combobox); +} GvcComboBoxClass; + +GType gvc_combo_box_get_type (void); + +GtkWidget * gvc_combo_box_new (const char *label); + +void gvc_combo_box_set_size_group (GvcComboBox *combo_box, + GtkSizeGroup *group, + gboolean symmetric); + +void gvc_combo_box_set_profiles (GvcComboBox *combo_box, + const GList *profiles); +void gvc_combo_box_set_ports (GvcComboBox *combo_box, + const GList *ports); +void gvc_combo_box_set_active (GvcComboBox *combo_box, + const char *id); + +G_END_DECLS + +#endif /* __GVC_COMBO_BOX_H */ diff --git a/panels/sound/gvc-level-bar.c b/panels/sound/gvc-level-bar.c new file mode 100644 index 000000000..2d3d9da22 --- /dev/null +++ b/panels/sound/gvc-level-bar.c @@ -0,0 +1,747 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann <william.jon.mccann@gmail.com> + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <math.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> + +#include "gvc-level-bar.h" + +#define NUM_BOXES 30 + +#define GVC_LEVEL_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_LEVEL_BAR, GvcLevelBarPrivate)) + +#define MIN_HORIZONTAL_BAR_WIDTH 150 +#define HORIZONTAL_BAR_HEIGHT 6 +#define VERTICAL_BAR_WIDTH 6 +#define MIN_VERTICAL_BAR_HEIGHT 400 + +typedef struct { + int peak_num; + int max_peak_num; + + GdkRectangle area; + int delta; + int box_width; + int box_height; + int box_radius; + double bg_r; + double bg_g; + double bg_b; + double bdr_r; + double bdr_g; + double bdr_b; + double fl_r; + double fl_g; + double fl_b; +} LevelBarLayout; + +struct GvcLevelBarPrivate +{ + GtkOrientation orientation; + GtkAdjustment *peak_adjustment; + GtkAdjustment *rms_adjustment; + int scale; + gdouble peak_fraction; + gdouble rms_fraction; + gdouble max_peak; + guint max_peak_id; + LevelBarLayout layout; +}; + +enum +{ + PROP_0, + PROP_PEAK_ADJUSTMENT, + PROP_RMS_ADJUSTMENT, + PROP_SCALE, + PROP_ORIENTATION, +}; + +static void gvc_level_bar_class_init (GvcLevelBarClass *klass); +static void gvc_level_bar_init (GvcLevelBar *level_bar); +static void gvc_level_bar_finalize (GObject *object); + +G_DEFINE_TYPE (GvcLevelBar, gvc_level_bar, GTK_TYPE_HBOX) + +#define check_rectangle(rectangle1, rectangle2) \ + { \ + if (rectangle1.x != rectangle2.x) return TRUE; \ + if (rectangle1.y != rectangle2.y) return TRUE; \ + if (rectangle1.width != rectangle2.width) return TRUE; \ + if (rectangle1.height != rectangle2.height) return TRUE; \ + } + +static gboolean +layout_changed (LevelBarLayout *layout1, + LevelBarLayout *layout2) +{ + check_rectangle (layout1->area, layout2->area); + if (layout1->delta != layout2->delta) return TRUE; + if (layout1->peak_num != layout2->peak_num) return TRUE; + if (layout1->max_peak_num != layout2->max_peak_num) return TRUE; + if (layout1->bg_r != layout2->bg_r + || layout1->bg_g != layout2->bg_g + || layout1->bg_b != layout2->bg_b) + return TRUE; + if (layout1->bdr_r != layout2->bdr_r + || layout1->bdr_g != layout2->bdr_g + || layout1->bdr_b != layout2->bdr_b) + return TRUE; + if (layout1->fl_r != layout2->fl_r + || layout1->fl_g != layout2->fl_g + || layout1->fl_b != layout2->fl_b) + return TRUE; + + return FALSE; +} + +static gdouble +fraction_from_adjustment (GvcLevelBar *bar, + GtkAdjustment *adjustment) +{ + gdouble level; + gdouble fraction; + gdouble min; + gdouble max; + + level = gtk_adjustment_get_value (adjustment); + + min = gtk_adjustment_get_lower (adjustment); + max = gtk_adjustment_get_upper (adjustment); + + switch (bar->priv->scale) { + case GVC_LEVEL_SCALE_LINEAR: + fraction = (level - min) / (max - min); + break; + case GVC_LEVEL_SCALE_LOG: + fraction = log10 ((level - min + 1) / (max - min + 1)); + break; + default: + g_assert_not_reached (); + } + + return fraction; +} + +static gboolean +reset_max_peak (GvcLevelBar *bar) +{ + gdouble min; + + min = gtk_adjustment_get_lower (bar->priv->peak_adjustment); + bar->priv->max_peak = min; + bar->priv->layout.max_peak_num = 0; + gtk_widget_queue_draw (GTK_WIDGET (bar)); + bar->priv->max_peak_id = 0; + return FALSE; +} + +static void +bar_calc_layout (GvcLevelBar *bar) +{ + GdkColor color; + int peak_level; + int max_peak_level; + GtkAllocation allocation; + GtkStyle *style; + + gtk_widget_get_allocation (GTK_WIDGET (bar), &allocation); + bar->priv->layout.area.width = allocation.width - 2; + bar->priv->layout.area.height = allocation.height - 2; + + style = gtk_widget_get_style (GTK_WIDGET (bar)); + color = style->bg [GTK_STATE_NORMAL]; + bar->priv->layout.bg_r = (float)color.red / 65535.0; + bar->priv->layout.bg_g = (float)color.green / 65535.0; + bar->priv->layout.bg_b = (float)color.blue / 65535.0; + color = style->dark [GTK_STATE_NORMAL]; + bar->priv->layout.bdr_r = (float)color.red / 65535.0; + bar->priv->layout.bdr_g = (float)color.green / 65535.0; + bar->priv->layout.bdr_b = (float)color.blue / 65535.0; + color = style->bg [GTK_STATE_SELECTED]; + bar->priv->layout.fl_r = (float)color.red / 65535.0; + bar->priv->layout.fl_g = (float)color.green / 65535.0; + bar->priv->layout.fl_b = (float)color.blue / 65535.0; + + if (bar->priv->orientation == GTK_ORIENTATION_VERTICAL) { + peak_level = bar->priv->peak_fraction * bar->priv->layout.area.height; + max_peak_level = bar->priv->max_peak * bar->priv->layout.area.height; + + bar->priv->layout.delta = bar->priv->layout.area.height / NUM_BOXES; + bar->priv->layout.area.x = 0; + bar->priv->layout.area.y = 0; + bar->priv->layout.box_height = bar->priv->layout.delta / 2; + bar->priv->layout.box_width = bar->priv->layout.area.width; + bar->priv->layout.box_radius = bar->priv->layout.box_width / 2; + } else { + peak_level = bar->priv->peak_fraction * bar->priv->layout.area.width; + max_peak_level = bar->priv->max_peak * bar->priv->layout.area.width; + + bar->priv->layout.delta = bar->priv->layout.area.width / NUM_BOXES; + bar->priv->layout.area.x = 0; + bar->priv->layout.area.y = 0; + bar->priv->layout.box_width = bar->priv->layout.delta / 2; + bar->priv->layout.box_height = bar->priv->layout.area.height; + bar->priv->layout.box_radius = bar->priv->layout.box_height / 2; + } + + /* This can happen if the level bar isn't realized */ + if (bar->priv->layout.delta == 0) + return; + + bar->priv->layout.peak_num = peak_level / bar->priv->layout.delta; + bar->priv->layout.max_peak_num = max_peak_level / bar->priv->layout.delta; +} + +static void +update_peak_value (GvcLevelBar *bar) +{ + gdouble val; + LevelBarLayout layout; + + layout = bar->priv->layout; + + val = fraction_from_adjustment (bar, bar->priv->peak_adjustment); + bar->priv->peak_fraction = val; + + if (val > bar->priv->max_peak) { + if (bar->priv->max_peak_id > 0) { + g_source_remove (bar->priv->max_peak_id); + } + bar->priv->max_peak_id = g_timeout_add_seconds (1, (GSourceFunc)reset_max_peak, bar); + bar->priv->max_peak = val; + } + + bar_calc_layout (bar); + + if (layout_changed (&bar->priv->layout, &layout)) { + gtk_widget_queue_draw (GTK_WIDGET (bar)); + } +} + +static void +update_rms_value (GvcLevelBar *bar) +{ + gdouble val; + + val = fraction_from_adjustment (bar, bar->priv->rms_adjustment); + bar->priv->rms_fraction = val; +} + +GtkOrientation +gvc_level_bar_get_orientation (GvcLevelBar *bar) +{ + g_return_val_if_fail (GVC_IS_LEVEL_BAR (bar), 0); + return bar->priv->orientation; +} + +void +gvc_level_bar_set_orientation (GvcLevelBar *bar, + GtkOrientation orientation) +{ + g_return_if_fail (GVC_IS_LEVEL_BAR (bar)); + + if (orientation != bar->priv->orientation) { + bar->priv->orientation = orientation; + gtk_widget_queue_draw (GTK_WIDGET (bar)); + g_object_notify (G_OBJECT (bar), "orientation"); + } +} + +static void +on_peak_adjustment_value_changed (GtkAdjustment *adjustment, + GvcLevelBar *bar) +{ + update_peak_value (bar); +} + +static void +on_rms_adjustment_value_changed (GtkAdjustment *adjustment, + GvcLevelBar *bar) +{ + update_rms_value (bar); +} + +void +gvc_level_bar_set_peak_adjustment (GvcLevelBar *bar, + GtkAdjustment *adjustment) +{ + g_return_if_fail (GVC_LEVEL_BAR (bar)); + g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); + + if (bar->priv->peak_adjustment != NULL) { + g_signal_handlers_disconnect_by_func (bar->priv->peak_adjustment, + G_CALLBACK (on_peak_adjustment_value_changed), + bar); + g_object_unref (bar->priv->peak_adjustment); + } + + bar->priv->peak_adjustment = g_object_ref_sink (adjustment); + + g_signal_connect (bar->priv->peak_adjustment, + "value-changed", + G_CALLBACK (on_peak_adjustment_value_changed), + bar); + + update_peak_value (bar); + + g_object_notify (G_OBJECT (bar), "peak-adjustment"); +} + +void +gvc_level_bar_set_rms_adjustment (GvcLevelBar *bar, + GtkAdjustment *adjustment) +{ + g_return_if_fail (GVC_LEVEL_BAR (bar)); + g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); + + if (bar->priv->rms_adjustment != NULL) { + g_signal_handlers_disconnect_by_func (bar->priv->peak_adjustment, + G_CALLBACK (on_rms_adjustment_value_changed), + bar); + g_object_unref (bar->priv->rms_adjustment); + } + + bar->priv->rms_adjustment = g_object_ref_sink (adjustment); + + + g_signal_connect (bar->priv->peak_adjustment, + "value-changed", + G_CALLBACK (on_peak_adjustment_value_changed), + bar); + + update_rms_value (bar); + + g_object_notify (G_OBJECT (bar), "rms-adjustment"); +} + +GtkAdjustment * +gvc_level_bar_get_peak_adjustment (GvcLevelBar *bar) +{ + g_return_val_if_fail (GVC_IS_LEVEL_BAR (bar), NULL); + + return bar->priv->peak_adjustment; +} + +GtkAdjustment * +gvc_level_bar_get_rms_adjustment (GvcLevelBar *bar) +{ + g_return_val_if_fail (GVC_IS_LEVEL_BAR (bar), NULL); + + return bar->priv->rms_adjustment; +} + +void +gvc_level_bar_set_scale (GvcLevelBar *bar, + GvcLevelScale scale) +{ + g_return_if_fail (GVC_IS_LEVEL_BAR (bar)); + + if (scale != bar->priv->scale) { + bar->priv->scale = scale; + + update_peak_value (bar); + update_rms_value (bar); + + g_object_notify (G_OBJECT (bar), "scale"); + } +} + +static void +gvc_level_bar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcLevelBar *self = GVC_LEVEL_BAR (object); + + switch (prop_id) { + case PROP_SCALE: + gvc_level_bar_set_scale (self, g_value_get_int (value)); + break; + case PROP_ORIENTATION: + gvc_level_bar_set_orientation (self, g_value_get_enum (value)); + break; + case PROP_PEAK_ADJUSTMENT: + gvc_level_bar_set_peak_adjustment (self, g_value_get_object (value)); + break; + case PROP_RMS_ADJUSTMENT: + gvc_level_bar_set_rms_adjustment (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_level_bar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcLevelBar *self = GVC_LEVEL_BAR (object); + + switch (prop_id) { + case PROP_SCALE: + g_value_set_int (value, self->priv->scale); + break; + case PROP_ORIENTATION: + g_value_set_enum (value, self->priv->orientation); + break; + case PROP_PEAK_ADJUSTMENT: + g_value_set_object (value, self->priv->peak_adjustment); + break; + case PROP_RMS_ADJUSTMENT: + g_value_set_object (value, self->priv->rms_adjustment); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GObject * +gvc_level_bar_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + return G_OBJECT_CLASS (gvc_level_bar_parent_class)->constructor (type, n_construct_properties, construct_params); +} + +static void +gvc_level_bar_size_request (GtkWidget *widget, + GtkRequisition *requisition) +{ + GvcLevelBar *bar; + + g_return_if_fail (GVC_IS_LEVEL_BAR (widget)); + g_return_if_fail (requisition != NULL); + + bar = GVC_LEVEL_BAR (widget); + + switch (bar->priv->orientation) { + case GTK_ORIENTATION_VERTICAL: + requisition->width = VERTICAL_BAR_WIDTH; + requisition->height = MIN_VERTICAL_BAR_HEIGHT; + break; + case GTK_ORIENTATION_HORIZONTAL: + requisition->width = MIN_HORIZONTAL_BAR_WIDTH; + requisition->height = HORIZONTAL_BAR_HEIGHT; + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +gvc_level_bar_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GvcLevelBar *bar; + + g_return_if_fail (GVC_IS_LEVEL_BAR (widget)); + g_return_if_fail (allocation != NULL); + + bar = GVC_LEVEL_BAR (widget); + + /* FIXME: add height property, labels, etc */ + GTK_WIDGET_CLASS (gvc_level_bar_parent_class)->size_allocate (widget, allocation); + + gtk_widget_set_allocation (widget, allocation); + gtk_widget_get_allocation (widget, allocation); + + if (bar->priv->orientation == GTK_ORIENTATION_VERTICAL) { + allocation->height = MIN (allocation->height, MIN_VERTICAL_BAR_HEIGHT); + allocation->width = MAX (allocation->width, VERTICAL_BAR_WIDTH); + } else { + allocation->width = MIN (allocation->width, MIN_HORIZONTAL_BAR_WIDTH); + allocation->height = MAX (allocation->height, HORIZONTAL_BAR_HEIGHT); + } + + bar_calc_layout (bar); +} + +static void +curved_rectangle (cairo_t *cr, + double x0, + double y0, + double width, + double height, + double radius) +{ + double x1; + double y1; + + x1 = x0 + width; + y1 = y0 + height; + + if (!width || !height) { + return; + } + + if (width / 2 < radius) { + if (height / 2 < radius) { + cairo_move_to (cr, x0, (y0 + y1) / 2); + cairo_curve_to (cr, x0 ,y0, x0, y0, (x0 + x1) / 2, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1) / 2); + cairo_curve_to (cr, x1, y1, x1, y1, (x1 + x0) / 2, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1) / 2); + } else { + cairo_move_to (cr, x0, y0 + radius); + cairo_curve_to (cr, x0, y0, x0, y0, (x0 + x1) / 2, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius); + cairo_line_to (cr, x1, y1 - radius); + cairo_curve_to (cr, x1, y1, x1, y1, (x1 + x0) / 2, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, y1 - radius); + } + } else { + if (height / 2 < radius) { + cairo_move_to (cr, x0, (y0 + y1) / 2); + cairo_curve_to (cr, x0, y0, x0 , y0, x0 + radius, y0); + cairo_line_to (cr, x1 - radius, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1) / 2); + cairo_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1); + cairo_line_to (cr, x0 + radius, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1) / 2); + } else { + cairo_move_to (cr, x0, y0 + radius); + cairo_curve_to (cr, x0 , y0, x0 , y0, x0 + radius, y0); + cairo_line_to (cr, x1 - radius, y0); + cairo_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius); + cairo_line_to (cr, x1, y1 - radius); + cairo_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1); + cairo_line_to (cr, x0 + radius, y1); + cairo_curve_to (cr, x0, y1, x0, y1, x0, y1 - radius); + } + } + + cairo_close_path (cr); +} + +static int +gvc_level_bar_draw (GtkWidget *widget, + cairo_t *cr) +{ + GvcLevelBar *bar; + GtkAllocation allocation; + + g_return_val_if_fail (GVC_IS_LEVEL_BAR (widget), FALSE); + + bar = GVC_LEVEL_BAR (widget); + + gtk_widget_get_allocation (widget, &allocation); + cairo_translate (cr, + allocation.x, + allocation.y); + + if (bar->priv->orientation == GTK_ORIENTATION_VERTICAL) { + int i; + int by; + + for (i = 0; i < NUM_BOXES; i++) { + by = i * bar->priv->layout.delta; + curved_rectangle (cr, + bar->priv->layout.area.x + 0.5, + by + 0.5, + bar->priv->layout.box_width - 1, + bar->priv->layout.box_height - 1, + bar->priv->layout.box_radius); + if ((bar->priv->layout.max_peak_num - 1) == i) { + /* fill peak foreground */ + cairo_set_source_rgb (cr, bar->priv->layout.fl_r, bar->priv->layout.fl_g, bar->priv->layout.fl_b); + cairo_fill_preserve (cr); + } else if ((bar->priv->layout.peak_num - 1) >= i) { + /* fill background */ + cairo_set_source_rgb (cr, bar->priv->layout.bg_r, bar->priv->layout.bg_g, bar->priv->layout.bg_b); + cairo_fill_preserve (cr); + /* fill foreground */ + cairo_set_source_rgba (cr, bar->priv->layout.fl_r, bar->priv->layout.fl_g, bar->priv->layout.fl_b, 0.5); + cairo_fill_preserve (cr); + } else { + /* fill background */ + cairo_set_source_rgb (cr, bar->priv->layout.bg_r, bar->priv->layout.bg_g, bar->priv->layout.bg_b); + cairo_fill_preserve (cr); + } + + /* stroke border */ + cairo_set_source_rgb (cr, bar->priv->layout.bdr_r, bar->priv->layout.bdr_g, bar->priv->layout.bdr_b); + cairo_set_line_width (cr, 1); + cairo_stroke (cr); + } + + } else { + int i; + int bx; + + for (i = 0; i < NUM_BOXES; i++) { + bx = i * bar->priv->layout.delta; + curved_rectangle (cr, + bx + 0.5, + bar->priv->layout.area.y + 0.5, + bar->priv->layout.box_width - 1, + bar->priv->layout.box_height - 1, + bar->priv->layout.box_radius); + + if ((bar->priv->layout.max_peak_num - 1) == i) { + /* fill peak foreground */ + cairo_set_source_rgb (cr, bar->priv->layout.fl_r, bar->priv->layout.fl_g, bar->priv->layout.fl_b); + cairo_fill_preserve (cr); + } else if ((bar->priv->layout.peak_num - 1) >= i) { + /* fill background */ + cairo_set_source_rgb (cr, bar->priv->layout.bg_r, bar->priv->layout.bg_g, bar->priv->layout.bg_b); + cairo_fill_preserve (cr); + /* fill foreground */ + cairo_set_source_rgba (cr, bar->priv->layout.fl_r, bar->priv->layout.fl_g, bar->priv->layout.fl_b, 0.5); + cairo_fill_preserve (cr); + } else { + /* fill background */ + cairo_set_source_rgb (cr, bar->priv->layout.bg_r, bar->priv->layout.bg_g, bar->priv->layout.bg_b); + cairo_fill_preserve (cr); + } + + /* stroke border */ + cairo_set_source_rgb (cr, bar->priv->layout.bdr_r, bar->priv->layout.bdr_g, bar->priv->layout.bdr_b); + cairo_set_line_width (cr, 1); + cairo_stroke (cr); + } + } + + return FALSE; +} + +static void +gvc_level_bar_class_init (GvcLevelBarClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->constructor = gvc_level_bar_constructor; + object_class->finalize = gvc_level_bar_finalize; + object_class->set_property = gvc_level_bar_set_property; + object_class->get_property = gvc_level_bar_get_property; + + widget_class->draw = gvc_level_bar_draw; + widget_class->size_request = gvc_level_bar_size_request; + widget_class->size_allocate = gvc_level_bar_size_allocate; + + g_object_class_install_property (object_class, + PROP_ORIENTATION, + g_param_spec_enum ("orientation", + "Orientation", + "The orientation of the bar", + GTK_TYPE_ORIENTATION, + GTK_ORIENTATION_HORIZONTAL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_PEAK_ADJUSTMENT, + g_param_spec_object ("peak-adjustment", + "Peak Adjustment", + "The GtkAdjustment that contains the current peak value", + GTK_TYPE_ADJUSTMENT, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_RMS_ADJUSTMENT, + g_param_spec_object ("rms-adjustment", + "RMS Adjustment", + "The GtkAdjustment that contains the current rms value", + GTK_TYPE_ADJUSTMENT, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_SCALE, + g_param_spec_int ("scale", + "Scale", + "Scale", + 0, + G_MAXINT, + GVC_LEVEL_SCALE_LINEAR, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_type_class_add_private (klass, sizeof (GvcLevelBarPrivate)); +} + +static void +gvc_level_bar_init (GvcLevelBar *bar) +{ + bar->priv = GVC_LEVEL_BAR_GET_PRIVATE (bar); + + bar->priv->peak_adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, + 0.0, + 1.0, + 0.05, + 0.1, + 0.1)); + g_object_ref_sink (bar->priv->peak_adjustment); + g_signal_connect (bar->priv->peak_adjustment, + "value-changed", + G_CALLBACK (on_peak_adjustment_value_changed), + bar); + + bar->priv->rms_adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, + 0.0, + 1.0, + 0.05, + 0.1, + 0.1)); + g_object_ref_sink (bar->priv->rms_adjustment); + g_signal_connect (bar->priv->rms_adjustment, + "value-changed", + G_CALLBACK (on_rms_adjustment_value_changed), + bar); + + gtk_widget_set_has_window (GTK_WIDGET (bar), FALSE); +} + +static void +gvc_level_bar_finalize (GObject *object) +{ + GvcLevelBar *bar; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_LEVEL_BAR (object)); + + bar = GVC_LEVEL_BAR (object); + + if (bar->priv->max_peak_id > 0) { + g_source_remove (bar->priv->max_peak_id); + } + + g_return_if_fail (bar->priv != NULL); + + G_OBJECT_CLASS (gvc_level_bar_parent_class)->finalize (object); +} + +GtkWidget * +gvc_level_bar_new (void) +{ + GObject *bar; + bar = g_object_new (GVC_TYPE_LEVEL_BAR, + NULL); + return GTK_WIDGET (bar); +} diff --git a/panels/sound/gvc-level-bar.h b/panels/sound/gvc-level-bar.h new file mode 100644 index 000000000..917b415bc --- /dev/null +++ b/panels/sound/gvc-level-bar.h @@ -0,0 +1,75 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann <william.jon.mccann@gmail.com> + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_LEVEL_BAR_H +#define __GVC_LEVEL_BAR_H + +#include <glib-object.h> +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_LEVEL_BAR (gvc_level_bar_get_type ()) +#define GVC_LEVEL_BAR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_LEVEL_BAR, GvcLevelBar)) +#define GVC_LEVEL_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_LEVEL_BAR, GvcLevelBarClass)) +#define GVC_IS_LEVEL_BAR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_LEVEL_BAR)) +#define GVC_IS_LEVEL_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_LEVEL_BAR)) +#define GVC_LEVEL_BAR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_LEVEL_BAR, GvcLevelBarClass)) + +typedef struct GvcLevelBarPrivate GvcLevelBarPrivate; + +typedef struct +{ + GtkHBox parent; + GvcLevelBarPrivate *priv; +} GvcLevelBar; + +typedef struct +{ + GtkHBoxClass parent_class; +} GvcLevelBarClass; + +typedef enum +{ + GVC_LEVEL_SCALE_LINEAR, + GVC_LEVEL_SCALE_LOG, + GVC_LEVEL_SCALE_LAST +} GvcLevelScale; + +GType gvc_level_bar_get_type (void); + +GtkWidget * gvc_level_bar_new (void); +void gvc_level_bar_set_orientation (GvcLevelBar *bar, + GtkOrientation orientation); +GtkOrientation gvc_level_bar_get_orientation (GvcLevelBar *bar); + +void gvc_level_bar_set_peak_adjustment (GvcLevelBar *bar, + GtkAdjustment *adjustment); +GtkAdjustment * gvc_level_bar_get_peak_adjustment (GvcLevelBar *bar); +void gvc_level_bar_set_rms_adjustment (GvcLevelBar *bar, + GtkAdjustment *adjustment); +GtkAdjustment * gvc_level_bar_get_rms_adjustment (GvcLevelBar *bar); +void gvc_level_bar_set_scale (GvcLevelBar *bar, + GvcLevelScale scale); + + +G_END_DECLS + +#endif /* __GVC_LEVEL_BAR_H */ diff --git a/panels/sound/gvc-log.c b/panels/sound/gvc-log.c new file mode 100644 index 000000000..03a9486fb --- /dev/null +++ b/panels/sound/gvc-log.c @@ -0,0 +1,62 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + + +#include "config.h" + +#include <glib.h> +#include <glib/gstdio.h> + +#include "gvc-log.h" + + +static int log_levels = G_LOG_LEVEL_CRITICAL | + G_LOG_LEVEL_ERROR | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_DEBUG; + +static void +gvc_log_default_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data) +{ + if ((log_level & log_levels) == 0) + return; + + g_log_default_handler (log_domain, log_level, message, unused_data); +} + +void +gvc_log_init (void) +{ + g_log_set_default_handler (gvc_log_default_handler, NULL); +} + +void +gvc_log_set_debug (gboolean debug) +{ + if (debug) { + log_levels |= G_LOG_LEVEL_DEBUG; + g_debug ("Enabling debugging"); + } else { + log_levels &= ~G_LOG_LEVEL_DEBUG; + } +} diff --git a/panels/sound/gvc-log.h b/panels/sound/gvc-log.h new file mode 100644 index 000000000..bc1cdd5ac --- /dev/null +++ b/panels/sound/gvc-log.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_LOG_H +#define __GVC_LOG_H + +#include <glib.h> + +G_BEGIN_DECLS + + +void gvc_log_init (void); +void gvc_log_set_debug (gboolean debug); + + +G_END_DECLS + +#endif /* __GVC_LOG_H */ diff --git a/panels/sound/gvc-mixer-card-private.h b/panels/sound/gvc-mixer-card-private.h new file mode 100644 index 000000000..e190f7f4b --- /dev/null +++ b/panels/sound/gvc-mixer-card-private.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008-2009 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_CARD_PRIVATE_H +#define __GVC_MIXER_CARD_PRIVATE_H + +#include <pulse/pulseaudio.h> +#include "gvc-mixer-card.h" + +G_BEGIN_DECLS + +GvcMixerCard * gvc_mixer_card_new (pa_context *context, + guint index); +pa_context * gvc_mixer_card_get_pa_context (GvcMixerCard *card); + +G_END_DECLS + +#endif /* __GVC_MIXER_CARD_PRIVATE_H */ diff --git a/panels/sound/gvc-mixer-card.c b/panels/sound/gvc-mixer-card.c new file mode 100644 index 000000000..f198f1b1c --- /dev/null +++ b/panels/sound/gvc-mixer-card.c @@ -0,0 +1,506 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * Copyright (C) 2009 Bastien Nocera + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-card.h" +#include "gvc-mixer-card-private.h" + +#define GVC_MIXER_CARD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_CARD, GvcMixerCardPrivate)) + +static guint32 card_serial = 1; + +struct GvcMixerCardPrivate +{ + pa_context *pa_context; + guint id; + guint index; + char *name; + char *icon_name; + char *profile; + char *target_profile; + char *human_profile; + GList *profiles; + pa_operation *profile_op; +}; + +enum +{ + PROP_0, + PROP_ID, + PROP_PA_CONTEXT, + PROP_INDEX, + PROP_NAME, + PROP_ICON_NAME, + PROP_PROFILE, + PROP_HUMAN_PROFILE, +}; + +static void gvc_mixer_card_class_init (GvcMixerCardClass *klass); +static void gvc_mixer_card_init (GvcMixerCard *mixer_card); +static void gvc_mixer_card_finalize (GObject *object); + +G_DEFINE_TYPE (GvcMixerCard, gvc_mixer_card, G_TYPE_OBJECT) + +static guint32 +get_next_card_serial (void) +{ + guint32 serial; + + serial = card_serial++; + + if ((gint32)card_serial < 0) { + card_serial = 1; + } + + return serial; +} + +pa_context * +gvc_mixer_card_get_pa_context (GvcMixerCard *card) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), 0); + return card->priv->pa_context; +} + +guint +gvc_mixer_card_get_index (GvcMixerCard *card) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), 0); + return card->priv->index; +} + +guint +gvc_mixer_card_get_id (GvcMixerCard *card) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), 0); + return card->priv->id; +} + +const char * +gvc_mixer_card_get_name (GvcMixerCard *card) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL); + return card->priv->name; +} + +gboolean +gvc_mixer_card_set_name (GvcMixerCard *card, + const char *name) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + + g_free (card->priv->name); + card->priv->name = g_strdup (name); + g_object_notify (G_OBJECT (card), "name"); + + return TRUE; +} + +const char * +gvc_mixer_card_get_icon_name (GvcMixerCard *card) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL); + return card->priv->icon_name; +} + +gboolean +gvc_mixer_card_set_icon_name (GvcMixerCard *card, + const char *icon_name) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + + g_free (card->priv->icon_name); + card->priv->icon_name = g_strdup (icon_name); + g_object_notify (G_OBJECT (card), "icon-name"); + + return TRUE; +} + +/** + * gvc_mixer_card_get_profile: (skip) + * + * @card: + * + * Returns: + */ +GvcMixerCardProfile * +gvc_mixer_card_get_profile (GvcMixerCard *card) +{ + GList *l; + + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL); + g_return_val_if_fail (card->priv->profiles != NULL, FALSE); + + for (l = card->priv->profiles; l != NULL; l = l->next) { + GvcMixerCardProfile *p = l->data; + if (g_str_equal (card->priv->profile, p->profile)) { + return p; + } + } + + g_assert_not_reached (); + + return NULL; +} + +gboolean +gvc_mixer_card_set_profile (GvcMixerCard *card, + const char *profile) +{ + GList *l; + + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + g_return_val_if_fail (card->priv->profiles != NULL, FALSE); + + g_free (card->priv->profile); + card->priv->profile = g_strdup (profile); + + g_free (card->priv->human_profile); + card->priv->human_profile = NULL; + + for (l = card->priv->profiles; l != NULL; l = l->next) { + GvcMixerCardProfile *p = l->data; + if (g_str_equal (card->priv->profile, p->profile)) { + card->priv->human_profile = g_strdup (p->human_profile); + break; + } + } + + g_object_notify (G_OBJECT (card), "profile"); + + return TRUE; +} + +static void +_pa_context_set_card_profile_by_index_cb (pa_context *context, + int success, + void *userdata) +{ + GvcMixerCard *card = GVC_MIXER_CARD (userdata); + + g_assert (card->priv->target_profile); + + if (success > 0) { + gvc_mixer_card_set_profile (card, card->priv->target_profile); + } else { + g_debug ("Failed to switch profile on '%s' from '%s' to '%s'", + card->priv->name, + card->priv->profile, + card->priv->target_profile); + } + g_free (card->priv->target_profile); + card->priv->target_profile = NULL; + + pa_operation_unref (card->priv->profile_op); + card->priv->profile_op = NULL; +} + +gboolean +gvc_mixer_card_change_profile (GvcMixerCard *card, + const char *profile) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + g_return_val_if_fail (card->priv->profiles != NULL, FALSE); + + /* Same profile, or already requested? */ + if (g_strcmp0 (card->priv->profile, profile) == 0) + return TRUE; + if (g_strcmp0 (profile, card->priv->target_profile) == 0) + return TRUE; + if (card->priv->profile_op != NULL) { + pa_operation_cancel (card->priv->profile_op); + pa_operation_unref (card->priv->profile_op); + card->priv->profile_op = NULL; + } + + if (card->priv->profile != NULL) { + g_free (card->priv->target_profile); + card->priv->target_profile = g_strdup (profile); + + card->priv->profile_op = pa_context_set_card_profile_by_index (card->priv->pa_context, + card->priv->index, + card->priv->target_profile, + _pa_context_set_card_profile_by_index_cb, + card); + + if (card->priv->profile_op == NULL) { + g_warning ("pa_context_set_card_profile_by_index() failed"); + return FALSE; + } + } else { + g_assert (card->priv->human_profile == NULL); + card->priv->profile = g_strdup (profile); + } + + return TRUE; +} + +const GList * +gvc_mixer_card_get_profiles (GvcMixerCard *card) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + return card->priv->profiles; +} + +static int +sort_profiles (GvcMixerCardProfile *a, + GvcMixerCardProfile *b) +{ + if (a->priority == b->priority) + return 0; + if (a->priority > b->priority) + return 1; + return -1; +} + +gboolean +gvc_mixer_card_set_profiles (GvcMixerCard *card, + GList *profiles) +{ + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + g_return_val_if_fail (card->priv->profiles == NULL, FALSE); + + card->priv->profiles = g_list_sort (profiles, (GCompareFunc) sort_profiles); + + return TRUE; +} + +static void +gvc_mixer_card_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcMixerCard *self = GVC_MIXER_CARD (object); + + switch (prop_id) { + case PROP_PA_CONTEXT: + self->priv->pa_context = g_value_get_pointer (value); + break; + case PROP_INDEX: + self->priv->index = g_value_get_ulong (value); + break; + case PROP_ID: + self->priv->id = g_value_get_ulong (value); + break; + case PROP_NAME: + gvc_mixer_card_set_name (self, g_value_get_string (value)); + break; + case PROP_ICON_NAME: + gvc_mixer_card_set_icon_name (self, g_value_get_string (value)); + break; + case PROP_PROFILE: + gvc_mixer_card_set_profile (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_mixer_card_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcMixerCard *self = GVC_MIXER_CARD (object); + + switch (prop_id) { + case PROP_PA_CONTEXT: + g_value_set_pointer (value, self->priv->pa_context); + break; + case PROP_INDEX: + g_value_set_ulong (value, self->priv->index); + break; + case PROP_ID: + g_value_set_ulong (value, self->priv->id); + break; + case PROP_NAME: + g_value_set_string (value, self->priv->name); + break; + case PROP_ICON_NAME: + g_value_set_string (value, self->priv->icon_name); + break; + case PROP_PROFILE: + g_value_set_string (value, self->priv->profile); + break; + case PROP_HUMAN_PROFILE: + g_value_set_string (value, self->priv->human_profile); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GObject * +gvc_mixer_card_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerCard *self; + + object = G_OBJECT_CLASS (gvc_mixer_card_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_CARD (object); + + self->priv->id = get_next_card_serial (); + + return object; +} + +static void +gvc_mixer_card_class_init (GvcMixerCardClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructor = gvc_mixer_card_constructor; + gobject_class->finalize = gvc_mixer_card_finalize; + + gobject_class->set_property = gvc_mixer_card_set_property; + gobject_class->get_property = gvc_mixer_card_get_property; + + g_object_class_install_property (gobject_class, + PROP_INDEX, + g_param_spec_ulong ("index", + "Index", + "The index for this card", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_ID, + g_param_spec_ulong ("id", + "id", + "The id for this card", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_PA_CONTEXT, + g_param_spec_pointer ("pa-context", + "PulseAudio context", + "The PulseAudio context for this card", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "Name to display for this card", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_ICON_NAME, + g_param_spec_string ("icon-name", + "Icon Name", + "Name of icon to display for this card", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_PROFILE, + g_param_spec_string ("profile", + "Profile", + "Name of current profile for this card", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_HUMAN_PROFILE, + g_param_spec_string ("human-profile", + "Profile (Human readable)", + "Name of current profile for this card in human readable form", + NULL, + G_PARAM_READABLE)); + + g_type_class_add_private (klass, sizeof (GvcMixerCardPrivate)); +} + +static void +gvc_mixer_card_init (GvcMixerCard *card) +{ + card->priv = GVC_MIXER_CARD_GET_PRIVATE (card); +} + +GvcMixerCard * +gvc_mixer_card_new (pa_context *context, + guint index) +{ + GObject *object; + + object = g_object_new (GVC_TYPE_MIXER_CARD, + "index", index, + "pa-context", context, + NULL); + return GVC_MIXER_CARD (object); +} + +static void +free_profile (GvcMixerCardProfile *p) +{ + g_free (p->profile); + g_free (p->human_profile); + g_free (p->status); + g_free (p); +} + +static void +gvc_mixer_card_finalize (GObject *object) +{ + GvcMixerCard *mixer_card; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_CARD (object)); + + mixer_card = GVC_MIXER_CARD (object); + + g_return_if_fail (mixer_card->priv != NULL); + + g_free (mixer_card->priv->name); + mixer_card->priv->name = NULL; + + g_free (mixer_card->priv->icon_name); + mixer_card->priv->icon_name = NULL; + + g_free (mixer_card->priv->target_profile); + mixer_card->priv->target_profile = NULL; + + g_free (mixer_card->priv->profile); + mixer_card->priv->profile = NULL; + + g_free (mixer_card->priv->human_profile); + mixer_card->priv->human_profile = NULL; + + g_list_foreach (mixer_card->priv->profiles, (GFunc) free_profile, NULL); + g_list_free (mixer_card->priv->profiles); + mixer_card->priv->profiles = NULL; + + G_OBJECT_CLASS (gvc_mixer_card_parent_class)->finalize (object); +} + diff --git a/panels/sound/gvc-mixer-card.h b/panels/sound/gvc-mixer-card.h new file mode 100644 index 000000000..5a3a7bc45 --- /dev/null +++ b/panels/sound/gvc-mixer-card.h @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008-2009 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_CARD_H +#define __GVC_MIXER_CARD_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_CARD (gvc_mixer_card_get_type ()) +#define GVC_MIXER_CARD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_CARD, GvcMixerCard)) +#define GVC_MIXER_CARD_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_CARD, GvcMixerCardClass)) +#define GVC_IS_MIXER_CARD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_CARD)) +#define GVC_IS_MIXER_CARD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_CARD)) +#define GVC_MIXER_CARD_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_CARD, GvcMixerCardClass)) + +typedef struct GvcMixerCardPrivate GvcMixerCardPrivate; + +typedef struct +{ + GObject parent; + GvcMixerCardPrivate *priv; +} GvcMixerCard; + +typedef struct +{ + GObjectClass parent_class; + + /* vtable */ +} GvcMixerCardClass; + +typedef struct +{ + char *profile; + char *human_profile; + char *status; + guint priority; + guint n_sinks, n_sources; +} GvcMixerCardProfile; + +GType gvc_mixer_card_get_type (void); + +guint gvc_mixer_card_get_id (GvcMixerCard *card); +guint gvc_mixer_card_get_index (GvcMixerCard *card); +const char * gvc_mixer_card_get_name (GvcMixerCard *card); +const char * gvc_mixer_card_get_icon_name (GvcMixerCard *card); +GvcMixerCardProfile * gvc_mixer_card_get_profile (GvcMixerCard *card); +const GList * gvc_mixer_card_get_profiles (GvcMixerCard *card); + +gboolean gvc_mixer_card_change_profile (GvcMixerCard *card, + const char *profile); + +/* private */ +gboolean gvc_mixer_card_set_name (GvcMixerCard *card, + const char *name); +gboolean gvc_mixer_card_set_icon_name (GvcMixerCard *card, + const char *name); +gboolean gvc_mixer_card_set_profile (GvcMixerCard *card, + const char *profile); +gboolean gvc_mixer_card_set_profiles (GvcMixerCard *card, + GList *profiles); + +G_END_DECLS + +#endif /* __GVC_MIXER_CARD_H */ diff --git a/panels/sound/gvc-mixer-control-private.h b/panels/sound/gvc-mixer-control-private.h new file mode 100644 index 000000000..ac79975aa --- /dev/null +++ b/panels/sound/gvc-mixer-control-private.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_CONTROL_PRIVATE_H +#define __GVC_MIXER_CONTROL_PRIVATE_H + +#include <glib-object.h> +#include <pulse/pulseaudio.h> +#include "gvc-mixer-stream.h" +#include "gvc-mixer-card.h" + +G_BEGIN_DECLS + +pa_context * gvc_mixer_control_get_pa_context (GvcMixerControl *control); + +G_END_DECLS + +#endif /* __GVC_MIXER_CONTROL_PRIVATE_H */ diff --git a/panels/sound/gvc-mixer-control.c b/panels/sound/gvc-mixer-control.c new file mode 100644 index 000000000..d8d80f6af --- /dev/null +++ b/panels/sound/gvc-mixer-control.c @@ -0,0 +1,2232 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2006-2008 Lennart Poettering + * Copyright (C) 2008 Sjoerd Simons <sjoerd@luon.net> + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> +#include <pulse/glib-mainloop.h> +#include <pulse/ext-stream-restore.h> + +#include "gvc-mixer-control.h" +#include "gvc-mixer-sink.h" +#include "gvc-mixer-source.h" +#include "gvc-mixer-sink-input.h" +#include "gvc-mixer-source-output.h" +#include "gvc-mixer-event-role.h" +#include "gvc-mixer-card.h" +#include "gvc-mixer-card-private.h" +#include "gvc-channel-map-private.h" +#include "gvc-mixer-control-private.h" + +#define GVC_MIXER_CONTROL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_CONTROL, GvcMixerControlPrivate)) + +#define RECONNECT_DELAY 5 + +enum { + PROP_0, + PROP_NAME +}; + +struct GvcMixerControlPrivate +{ + pa_glib_mainloop *pa_mainloop; + pa_mainloop_api *pa_api; + pa_context *pa_context; + int n_outstanding; + guint reconnect_id; + char *name; + + gboolean default_sink_is_set; + guint default_sink_id; + char *default_sink_name; + gboolean default_source_is_set; + guint default_source_id; + char *default_source_name; + + gboolean event_sink_input_is_set; + guint event_sink_input_id; + + GHashTable *all_streams; + GHashTable *sinks; /* fixed outputs */ + GHashTable *sources; /* fixed inputs */ + GHashTable *sink_inputs; /* routable output streams */ + GHashTable *source_outputs; /* routable input streams */ + GHashTable *clients; + GHashTable *cards; + + GvcMixerStream *new_default_stream; /* new default stream, used in gvc_mixer_control_set_default_sink () */ +}; + +enum { + CONNECTING, + READY, + STREAM_ADDED, + STREAM_REMOVED, + CARD_ADDED, + CARD_REMOVED, + DEFAULT_SINK_CHANGED, + DEFAULT_SOURCE_CHANGED, + LAST_SIGNAL +}; + +static guint signals [LAST_SIGNAL] = { 0, }; + +static void gvc_mixer_control_class_init (GvcMixerControlClass *klass); +static void gvc_mixer_control_init (GvcMixerControl *mixer_control); +static void gvc_mixer_control_finalize (GObject *object); + +G_DEFINE_TYPE (GvcMixerControl, gvc_mixer_control, G_TYPE_OBJECT) + +pa_context * +gvc_mixer_control_get_pa_context (GvcMixerControl *control) +{ + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + return control->priv->pa_context; +} + +/** + * gvc_mixer_control_get_event_sink_input: + * + * @control: + * + * Returns: (transfer none): + */ +GvcMixerStream * +gvc_mixer_control_get_event_sink_input (GvcMixerControl *control) +{ + GvcMixerStream *stream; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + stream = g_hash_table_lookup (control->priv->all_streams, + GUINT_TO_POINTER (control->priv->event_sink_input_id)); + + return stream; +} + +static void +gvc_mixer_control_stream_restore_cb (pa_context *c, + const pa_ext_stream_restore_info *info, + int eol, + void *userdata) +{ + pa_operation *o; + GvcMixerControl *control = (GvcMixerControl *) userdata; + pa_ext_stream_restore_info new_info; + + if (eol || control->priv->new_default_stream == NULL) + return; + + new_info.name = info->name; + new_info.channel_map = info->channel_map; + new_info.volume = info->volume; + new_info.mute = info->mute; + + new_info.device = gvc_mixer_stream_get_name (control->priv->new_default_stream); + + o = pa_ext_stream_restore_write (control->priv->pa_context, + PA_UPDATE_REPLACE, + &new_info, 1, + TRUE, NULL, NULL); + + if (o == NULL) { + g_warning ("pa_ext_stream_restore_write() failed: %s", + pa_strerror (pa_context_errno (control->priv->pa_context))); + return; + } + + g_debug ("Changed default device for %s to %s", info->name, info->device); + + pa_operation_unref (o); +} + +gboolean +gvc_mixer_control_set_default_sink (GvcMixerControl *control, + GvcMixerStream *stream) +{ + pa_operation *o; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE); + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + o = pa_context_set_default_sink (control->priv->pa_context, + gvc_mixer_stream_get_name (stream), + NULL, + NULL); + if (o == NULL) { + g_warning ("pa_context_set_default_sink() failed: %s", + pa_strerror (pa_context_errno (control->priv->pa_context))); + return FALSE; + } + + pa_operation_unref (o); + + control->priv->new_default_stream = stream; + g_object_add_weak_pointer (G_OBJECT (stream), (gpointer *) &control->priv->new_default_stream); + + o = pa_ext_stream_restore_read (control->priv->pa_context, + gvc_mixer_control_stream_restore_cb, + control); + + if (o == NULL) { + g_warning ("pa_ext_stream_restore_read() failed: %s", + pa_strerror (pa_context_errno (control->priv->pa_context))); + return FALSE; + } + + pa_operation_unref (o); + + return TRUE; +} + +gboolean +gvc_mixer_control_set_default_source (GvcMixerControl *control, + GvcMixerStream *stream) +{ + pa_operation *o; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE); + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + o = pa_context_set_default_source (control->priv->pa_context, + gvc_mixer_stream_get_name (stream), + NULL, + NULL); + if (o == NULL) { + g_warning ("pa_context_set_default_source() failed"); + return FALSE; + } + + pa_operation_unref (o); + + return TRUE; +} + +/** + * gvc_mixer_control_get_default_sink: + * + * @control: + * + * Returns: (transfer none): + */ +GvcMixerStream * +gvc_mixer_control_get_default_sink (GvcMixerControl *control) +{ + GvcMixerStream *stream; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + if (control->priv->default_sink_is_set) { + stream = g_hash_table_lookup (control->priv->all_streams, + GUINT_TO_POINTER (control->priv->default_sink_id)); + } else { + stream = NULL; + } + + return stream; +} + +/** + * gvc_mixer_control_get_default_source: + * + * @control: + * + * Returns: (transfer none): + */ +GvcMixerStream * +gvc_mixer_control_get_default_source (GvcMixerControl *control) +{ + GvcMixerStream *stream; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + if (control->priv->default_source_is_set) { + stream = g_hash_table_lookup (control->priv->all_streams, + GUINT_TO_POINTER (control->priv->default_source_id)); + } else { + stream = NULL; + } + + return stream; +} + +static gpointer +gvc_mixer_control_lookup_id (GHashTable *hash_table, + guint id) +{ + return g_hash_table_lookup (hash_table, + GUINT_TO_POINTER (id)); +} + +/** + * gvc_mixer_control_lookup_stream_id: + * + * @control: + * @id: + * + * Returns: (transfer none): + */ +GvcMixerStream * +gvc_mixer_control_lookup_stream_id (GvcMixerControl *control, + guint id) +{ + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + return gvc_mixer_control_lookup_id (control->priv->all_streams, id); +} + +/** + * gvc_mixer_control_lookup_card_id: + * + * @control: + * @id: + * + * Returns: (transfer none): + */ +GvcMixerCard * +gvc_mixer_control_lookup_card_id (GvcMixerControl *control, + guint id) +{ + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + return gvc_mixer_control_lookup_id (control->priv->cards, id); +} + +static void +listify_hash_values_hfunc (gpointer key, + gpointer value, + gpointer user_data) +{ + GSList **list = user_data; + + *list = g_slist_prepend (*list, value); +} + +static int +gvc_name_collate (const char *namea, + const char *nameb) +{ + if (nameb == NULL && namea == NULL) + return 0; + if (nameb == NULL) + return 1; + if (namea == NULL) + return -1; + + return g_utf8_collate (namea, nameb); +} + +static int +gvc_card_collate (GvcMixerCard *a, + GvcMixerCard *b) +{ + const char *namea; + const char *nameb; + + g_return_val_if_fail (a == NULL || GVC_IS_MIXER_CARD (a), 0); + g_return_val_if_fail (b == NULL || GVC_IS_MIXER_CARD (b), 0); + + namea = gvc_mixer_card_get_name (a); + nameb = gvc_mixer_card_get_name (b); + + return gvc_name_collate (namea, nameb); +} + +/** + * gvc_mixer_control_get_cards: + * + * @control: + * + * Returns: (transfer container) (element-type Gvc.MixerCard): + */ +GSList * +gvc_mixer_control_get_cards (GvcMixerControl *control) +{ + GSList *retval; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + retval = NULL; + g_hash_table_foreach (control->priv->cards, + listify_hash_values_hfunc, + &retval); + return g_slist_sort (retval, (GCompareFunc) gvc_card_collate); +} + +static int +gvc_stream_collate (GvcMixerStream *a, + GvcMixerStream *b) +{ + const char *namea; + const char *nameb; + + g_return_val_if_fail (a == NULL || GVC_IS_MIXER_STREAM (a), 0); + g_return_val_if_fail (b == NULL || GVC_IS_MIXER_STREAM (b), 0); + + namea = gvc_mixer_stream_get_name (a); + nameb = gvc_mixer_stream_get_name (b); + + return gvc_name_collate (namea, nameb); +} + +/** + * gvc_mixer_control_get_streams: + * + * @control: + * + * Returns: (transfer container) (element-type Gvc.MixerStream): + */ +GSList * +gvc_mixer_control_get_streams (GvcMixerControl *control) +{ + GSList *retval; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + retval = NULL; + g_hash_table_foreach (control->priv->all_streams, + listify_hash_values_hfunc, + &retval); + return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate); +} + +/** + * gvc_mixer_control_get_sinks: + * + * @control: + * + * Returns: (transfer container) (element-type Gvc.MixerSink): + */ +GSList * +gvc_mixer_control_get_sinks (GvcMixerControl *control) +{ + GSList *retval; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + retval = NULL; + g_hash_table_foreach (control->priv->sinks, + listify_hash_values_hfunc, + &retval); + return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate); +} + +/** + * gvc_mixer_control_get_sources: + * + * @control: + * + * Returns: (transfer container) (element-type Gvc.MixerSource): + */ +GSList * +gvc_mixer_control_get_sources (GvcMixerControl *control) +{ + GSList *retval; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + retval = NULL; + g_hash_table_foreach (control->priv->sources, + listify_hash_values_hfunc, + &retval); + return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate); +} + +/** + * gvc_mixer_control_get_sink_inputs: + * + * @control: + * + * Returns: (transfer container) (element-type Gvc.MixerSinkInput): + */ +GSList * +gvc_mixer_control_get_sink_inputs (GvcMixerControl *control) +{ + GSList *retval; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + retval = NULL; + g_hash_table_foreach (control->priv->sink_inputs, + listify_hash_values_hfunc, + &retval); + return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate); +} + +/** + * gvc_mixer_control_get_source_outputs: + * + * @control: + * + * Returns: (transfer container) (element-type Gvc.MixerSourceOutput): + */ +GSList * +gvc_mixer_control_get_source_outputs (GvcMixerControl *control) +{ + GSList *retval; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL); + + retval = NULL; + g_hash_table_foreach (control->priv->source_outputs, + listify_hash_values_hfunc, + &retval); + return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate); +} + +static void +dec_outstanding (GvcMixerControl *control) +{ + if (control->priv->n_outstanding <= 0) { + return; + } + + if (--control->priv->n_outstanding <= 0) { + g_signal_emit (G_OBJECT (control), signals[READY], 0); + } +} + +gboolean +gvc_mixer_control_is_ready (GvcMixerControl *control) +{ + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE); + + return (control->priv->n_outstanding == 0); +} + + +static void +_set_default_source (GvcMixerControl *control, + GvcMixerStream *stream) +{ + guint new_id; + + if (stream == NULL) { + control->priv->default_source_id = 0; + control->priv->default_source_is_set = FALSE; + g_signal_emit (control, + signals[DEFAULT_SOURCE_CHANGED], + 0, + PA_INVALID_INDEX); + return; + } + + new_id = gvc_mixer_stream_get_id (stream); + + if (control->priv->default_source_id != new_id) { + control->priv->default_source_id = new_id; + control->priv->default_source_is_set = TRUE; + g_signal_emit (control, + signals[DEFAULT_SOURCE_CHANGED], + 0, + new_id); + } +} + +static void +_set_default_sink (GvcMixerControl *control, + GvcMixerStream *stream) +{ + guint new_id; + + if (stream == NULL) { + /* Don't tell front-ends about an unset default + * sink if it's already unset */ + if (control->priv->default_sink_is_set == FALSE) + return; + control->priv->default_sink_id = 0; + control->priv->default_sink_is_set = FALSE; + g_signal_emit (control, + signals[DEFAULT_SINK_CHANGED], + 0, + PA_INVALID_INDEX); + return; + } + + new_id = gvc_mixer_stream_get_id (stream); + + if (control->priv->default_sink_id != new_id) { + control->priv->default_sink_id = new_id; + control->priv->default_sink_is_set = TRUE; + g_signal_emit (control, + signals[DEFAULT_SINK_CHANGED], + 0, + new_id); + } +} + +static gboolean +_stream_has_name (gpointer key, + GvcMixerStream *stream, + const char *name) +{ + const char *t_name; + + t_name = gvc_mixer_stream_get_name (stream); + + if (t_name != NULL + && name != NULL + && strcmp (t_name, name) == 0) { + return TRUE; + } + + return FALSE; +} + +static GvcMixerStream * +find_stream_for_name (GvcMixerControl *control, + const char *name) +{ + GvcMixerStream *stream; + + stream = g_hash_table_find (control->priv->all_streams, + (GHRFunc)_stream_has_name, + (char *)name); + return stream; +} + +static void +update_default_source_from_name (GvcMixerControl *control, + const char *name) +{ + gboolean changed; + + if ((control->priv->default_source_name == NULL + && name != NULL) + || (control->priv->default_source_name != NULL + && name == NULL) + || strcmp (control->priv->default_source_name, name) != 0) { + changed = TRUE; + } + + if (changed) { + GvcMixerStream *stream; + + g_free (control->priv->default_source_name); + control->priv->default_source_name = g_strdup (name); + + stream = find_stream_for_name (control, name); + _set_default_source (control, stream); + } +} + +static void +update_default_sink_from_name (GvcMixerControl *control, + const char *name) +{ + gboolean changed; + + if ((control->priv->default_sink_name == NULL + && name != NULL) + || (control->priv->default_sink_name != NULL + && name == NULL) + || strcmp (control->priv->default_sink_name, name) != 0) { + changed = TRUE; + } + + if (changed) { + GvcMixerStream *stream; + g_free (control->priv->default_sink_name); + control->priv->default_sink_name = g_strdup (name); + + stream = find_stream_for_name (control, name); + _set_default_sink (control, stream); + } +} + +static void +update_server (GvcMixerControl *control, + const pa_server_info *info) +{ + if (info->default_source_name != NULL) { + update_default_source_from_name (control, info->default_source_name); + } + if (info->default_sink_name != NULL) { + update_default_sink_from_name (control, info->default_sink_name); + } +} + +static void +remove_stream (GvcMixerControl *control, + GvcMixerStream *stream) +{ + guint id; + + g_object_ref (stream); + + id = gvc_mixer_stream_get_id (stream); + + if (id == control->priv->default_sink_id) { + _set_default_sink (control, NULL); + } else if (id == control->priv->default_source_id) { + _set_default_source (control, NULL); + } + + g_hash_table_remove (control->priv->all_streams, + GUINT_TO_POINTER (id)); + g_signal_emit (G_OBJECT (control), + signals[STREAM_REMOVED], + 0, + gvc_mixer_stream_get_id (stream)); + g_object_unref (stream); +} + +static void +add_stream (GvcMixerControl *control, + GvcMixerStream *stream) +{ + g_hash_table_insert (control->priv->all_streams, + GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)), + stream); + g_signal_emit (G_OBJECT (control), + signals[STREAM_ADDED], + 0, + gvc_mixer_stream_get_id (stream)); +} + +static void +update_sink (GvcMixerControl *control, + const pa_sink_info *info) +{ + GvcMixerStream *stream; + gboolean is_new; + pa_volume_t max_volume; + GvcChannelMap *map; + char map_buff[PA_CHANNEL_MAP_SNPRINT_MAX]; + + pa_channel_map_snprint (map_buff, PA_CHANNEL_MAP_SNPRINT_MAX, &info->channel_map); +#if 1 + g_debug ("Updating sink: index=%u name='%s' description='%s' map='%s'", + info->index, + info->name, + info->description, + map_buff); +#endif + + map = NULL; + is_new = FALSE; + stream = g_hash_table_lookup (control->priv->sinks, + GUINT_TO_POINTER (info->index)); + if (stream == NULL) { +#if PA_MICRO > 15 + GList *list = NULL; + guint i; +#endif /* PA_MICRO > 15 */ + + map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map); + stream = gvc_mixer_sink_new (control->priv->pa_context, + info->index, + map); +#if PA_MICRO > 15 + for (i = 0; i < info->n_ports; i++) { + GvcMixerStreamPort *port; + + port = g_new0 (GvcMixerStreamPort, 1); + port->port = g_strdup (info->ports[i]->name); + port->human_port = g_strdup (info->ports[i]->description); + port->priority = info->ports[i]->priority; + list = g_list_prepend (list, port); + } + gvc_mixer_stream_set_ports (stream, list); +#endif /* PA_MICRO > 15 */ + g_object_unref (map); + is_new = TRUE; + } else if (gvc_mixer_stream_is_running (stream)) { + /* Ignore events if volume changes are outstanding */ + g_debug ("Ignoring event, volume changes are outstanding"); + return; + } + + max_volume = pa_cvolume_max (&info->volume); + gvc_mixer_stream_set_name (stream, info->name); + gvc_mixer_stream_set_card_index (stream, info->card); + gvc_mixer_stream_set_description (stream, info->description); + gvc_mixer_stream_set_icon_name (stream, "audio-card"); + gvc_mixer_stream_set_volume (stream, (guint)max_volume); + gvc_mixer_stream_set_is_muted (stream, info->mute); + gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SINK_DECIBEL_VOLUME)); + gvc_mixer_stream_set_base_volume (stream, (guint32) info->base_volume); +#if PA_MICRO > 15 + if (info->active_port != NULL) + gvc_mixer_stream_set_port (stream, info->active_port->name); +#endif /* PA_MICRO > 15 */ + + if (is_new) { + g_hash_table_insert (control->priv->sinks, + GUINT_TO_POINTER (info->index), + g_object_ref (stream)); + add_stream (control, stream); + } + + if (control->priv->default_sink_name != NULL + && info->name != NULL + && strcmp (control->priv->default_sink_name, info->name) == 0) { + _set_default_sink (control, stream); + } + + if (map == NULL) + map = (GvcChannelMap *) gvc_mixer_stream_get_channel_map (stream); + gvc_channel_map_volume_changed (map, &info->volume, FALSE); +} + +static void +update_source (GvcMixerControl *control, + const pa_source_info *info) +{ + GvcMixerStream *stream; + gboolean is_new; + pa_volume_t max_volume; + +#if 1 + g_debug ("Updating source: index=%u name='%s' description='%s'", + info->index, + info->name, + info->description); +#endif + + /* completely ignore monitors, they're not real sources */ + if (info->monitor_of_sink != PA_INVALID_INDEX) { + return; + } + + is_new = FALSE; + + stream = g_hash_table_lookup (control->priv->sources, + GUINT_TO_POINTER (info->index)); + if (stream == NULL) { +#if PA_MICRO > 15 + GList *list = NULL; + guint i; +#endif /* PA_MICRO > 15 */ + GvcChannelMap *map; + + map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map); + stream = gvc_mixer_source_new (control->priv->pa_context, + info->index, + map); +#if PA_MICRO > 15 + for (i = 0; i < info->n_ports; i++) { + GvcMixerStreamPort *port; + + port = g_new0 (GvcMixerStreamPort, 1); + port->port = g_strdup (info->ports[i]->name); + port->human_port = g_strdup (info->ports[i]->description); + port->priority = info->ports[i]->priority; + list = g_list_prepend (list, port); + } + gvc_mixer_stream_set_ports (stream, list); +#endif /* PA_MICRO > 15 */ + + g_object_unref (map); + is_new = TRUE; + } else if (gvc_mixer_stream_is_running (stream)) { + /* Ignore events if volume changes are outstanding */ + g_debug ("Ignoring event, volume changes are outstanding"); + return; + } + + max_volume = pa_cvolume_max (&info->volume); + + gvc_mixer_stream_set_name (stream, info->name); + gvc_mixer_stream_set_card_index (stream, info->card); + gvc_mixer_stream_set_description (stream, info->description); + gvc_mixer_stream_set_icon_name (stream, "audio-input-microphone"); + gvc_mixer_stream_set_volume (stream, (guint)max_volume); + gvc_mixer_stream_set_is_muted (stream, info->mute); + gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SOURCE_DECIBEL_VOLUME)); + gvc_mixer_stream_set_base_volume (stream, (guint32) info->base_volume); +#if PA_MICRO > 15 + if (info->active_port != NULL) + gvc_mixer_stream_set_port (stream, info->active_port->name); +#endif /* PA_MICRO > 15 */ + + if (is_new) { + g_hash_table_insert (control->priv->sources, + GUINT_TO_POINTER (info->index), + g_object_ref (stream)); + add_stream (control, stream); + } + + if (control->priv->default_source_name != NULL + && info->name != NULL + && strcmp (control->priv->default_source_name, info->name) == 0) { + _set_default_source (control, stream); + } +} + +static void +set_icon_name_from_proplist (GvcMixerStream *stream, + pa_proplist *l, + const char *default_icon_name) +{ + const char *t; + + if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_WINDOW_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_APPLICATION_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ROLE))) { + + if (strcmp (t, "video") == 0 || + strcmp (t, "phone") == 0) { + goto finish; + } + + if (strcmp (t, "music") == 0) { + t = "audio"; + goto finish; + } + + if (strcmp (t, "game") == 0) { + t = "applications-games"; + goto finish; + } + + if (strcmp (t, "event") == 0) { + t = "dialog-information"; + goto finish; + } + } + + t = default_icon_name; + + finish: + gvc_mixer_stream_set_icon_name (stream, t); +} + +static void +set_is_event_stream_from_proplist (GvcMixerStream *stream, + pa_proplist *l) +{ + const char *t; + gboolean is_event_stream; + + is_event_stream = FALSE; + + if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ROLE))) { + if (g_str_equal (t, "event")) + is_event_stream = TRUE; + } + + gvc_mixer_stream_set_is_event_stream (stream, is_event_stream); +} + +static void +set_application_id_from_proplist (GvcMixerStream *stream, + pa_proplist *l) +{ + const char *t; + + if ((t = pa_proplist_gets (l, PA_PROP_APPLICATION_ID))) { + gvc_mixer_stream_set_application_id (stream, t); + } +} + +static void +update_sink_input (GvcMixerControl *control, + const pa_sink_input_info *info) +{ + GvcMixerStream *stream; + gboolean is_new; + pa_volume_t max_volume; + const char *name; + +#if 0 + g_debug ("Updating sink input: index=%u name='%s' client=%u sink=%u", + info->index, + info->name, + info->client, + info->sink); +#endif + + is_new = FALSE; + + stream = g_hash_table_lookup (control->priv->sink_inputs, + GUINT_TO_POINTER (info->index)); + if (stream == NULL) { + GvcChannelMap *map; + map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map); + stream = gvc_mixer_sink_input_new (control->priv->pa_context, + info->index, + map); + g_object_unref (map); + is_new = TRUE; + } else if (gvc_mixer_stream_is_running (stream)) { + /* Ignore events if volume changes are outstanding */ + g_debug ("Ignoring event, volume changes are outstanding"); + return; + } + + max_volume = pa_cvolume_max (&info->volume); + + name = (const char *)g_hash_table_lookup (control->priv->clients, + GUINT_TO_POINTER (info->client)); + gvc_mixer_stream_set_name (stream, name); + gvc_mixer_stream_set_description (stream, info->name); + + set_application_id_from_proplist (stream, info->proplist); + set_is_event_stream_from_proplist (stream, info->proplist); + set_icon_name_from_proplist (stream, info->proplist, "applications-multimedia"); + gvc_mixer_stream_set_volume (stream, (guint)max_volume); + gvc_mixer_stream_set_is_muted (stream, info->mute); + gvc_mixer_stream_set_is_virtual (stream, info->client == PA_INVALID_INDEX); + + if (is_new) { + g_hash_table_insert (control->priv->sink_inputs, + GUINT_TO_POINTER (info->index), + g_object_ref (stream)); + add_stream (control, stream); + } +} + +static void +update_source_output (GvcMixerControl *control, + const pa_source_output_info *info) +{ + GvcMixerStream *stream; + gboolean is_new; + const char *name; + +#if 1 + g_debug ("Updating source output: index=%u name='%s' client=%u source=%u", + info->index, + info->name, + info->client, + info->source); +#endif + + is_new = FALSE; + stream = g_hash_table_lookup (control->priv->source_outputs, + GUINT_TO_POINTER (info->index)); + if (stream == NULL) { + GvcChannelMap *map; + map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map); + stream = gvc_mixer_source_output_new (control->priv->pa_context, + info->index, + map); + g_object_unref (map); + is_new = TRUE; + } + + name = (const char *)g_hash_table_lookup (control->priv->clients, + GUINT_TO_POINTER (info->client)); + + gvc_mixer_stream_set_name (stream, name); + gvc_mixer_stream_set_description (stream, info->name); + set_application_id_from_proplist (stream, info->proplist); + set_is_event_stream_from_proplist (stream, info->proplist); + set_icon_name_from_proplist (stream, info->proplist, "audio-input-microphone"); + + if (is_new) { + g_hash_table_insert (control->priv->source_outputs, + GUINT_TO_POINTER (info->index), + g_object_ref (stream)); + add_stream (control, stream); + } +} + +static void +update_client (GvcMixerControl *control, + const pa_client_info *info) +{ +#if 1 + g_debug ("Updating client: index=%u name='%s'", + info->index, + info->name); +#endif + g_hash_table_insert (control->priv->clients, + GUINT_TO_POINTER (info->index), + g_strdup (info->name)); +} + +static char * +card_num_streams_to_status (guint sinks, + guint sources) +{ + char *sinks_str; + char *sources_str; + char *ret; + + if (sinks == 0 && sources == 0) { + /* translators: + * The device has been disabled */ + return g_strdup (_("Disabled")); + } + if (sinks == 0) { + sinks_str = NULL; + } else { + /* translators: + * The number of sound outputs on a particular device */ + sinks_str = g_strdup_printf (ngettext ("%u Output", + "%u Outputs", + sinks), + sinks); + } + if (sources == 0) { + sources_str = NULL; + } else { + /* translators: + * The number of sound inputs on a particular device */ + sources_str = g_strdup_printf (ngettext ("%u Input", + "%u Inputs", + sources), + sources); + } + if (sources_str == NULL) + return sinks_str; + if (sinks_str == NULL) + return sources_str; + ret = g_strdup_printf ("%s / %s", sinks_str, sources_str); + g_free (sinks_str); + g_free (sources_str); + return ret; +} + +static void +update_card (GvcMixerControl *control, + const pa_card_info *info) +{ + GvcMixerCard *card; + gboolean is_new; +#if 1 + guint i; + const char *key; + void *state; + + g_debug ("Udpating card %s (index: %u driver: %s):", + info->name, info->index, info->driver); + + for (i = 0; i < info->n_profiles; i++) { + struct pa_card_profile_info pi = info->profiles[i]; + gboolean is_default; + + is_default = (g_strcmp0 (pi.name, info->active_profile->name) == 0); + g_debug ("\tProfile '%s': %d sources %d sinks%s", + pi.name, pi.n_sources, pi.n_sinks, + is_default ? " (Current)" : ""); + } + state = NULL; + key = pa_proplist_iterate (info->proplist, &state); + while (key != NULL) { + g_debug ("\tProperty: '%s' = '%s'", + key, pa_proplist_gets (info->proplist, key)); + key = pa_proplist_iterate (info->proplist, &state); + } +#endif + card = g_hash_table_lookup (control->priv->cards, + GUINT_TO_POINTER (info->index)); + if (card == NULL) { + GList *list = NULL; + + for (i = 0; i < info->n_profiles; i++) { + struct pa_card_profile_info pi = info->profiles[i]; + GvcMixerCardProfile *profile; + + profile = g_new0 (GvcMixerCardProfile, 1); + profile->profile = g_strdup (pi.name); + profile->human_profile = g_strdup (pi.description); + profile->status = card_num_streams_to_status (pi.n_sinks, pi.n_sources); + profile->n_sinks = pi.n_sinks; + profile->n_sources = pi.n_sources; + profile->priority = pi.priority; + list = g_list_prepend (list, profile); + } + card = gvc_mixer_card_new (control->priv->pa_context, + info->index); + gvc_mixer_card_set_profiles (card, list); + is_new = TRUE; + } + + gvc_mixer_card_set_name (card, pa_proplist_gets (info->proplist, "device.description")); + gvc_mixer_card_set_icon_name (card, pa_proplist_gets (info->proplist, "device.icon_name")); + gvc_mixer_card_set_profile (card, info->active_profile->name); + + if (is_new) { + g_hash_table_insert (control->priv->cards, + GUINT_TO_POINTER (info->index), + g_object_ref (card)); + } + g_signal_emit (G_OBJECT (control), + signals[CARD_ADDED], + 0, + info->index); +} + +static void +_pa_context_get_sink_info_cb (pa_context *context, + const pa_sink_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + if (pa_context_errno (context) == PA_ERR_NOENTITY) { + return; + } + + g_warning ("Sink callback failure"); + return; + } + + if (eol > 0) { + dec_outstanding (control); + return; + } + + update_sink (control, i); +} + +static void +_pa_context_get_source_info_cb (pa_context *context, + const pa_source_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + if (pa_context_errno (context) == PA_ERR_NOENTITY) { + return; + } + + g_warning ("Source callback failure"); + return; + } + + if (eol > 0) { + dec_outstanding (control); + return; + } + + update_source (control, i); +} + +static void +_pa_context_get_sink_input_info_cb (pa_context *context, + const pa_sink_input_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + if (pa_context_errno (context) == PA_ERR_NOENTITY) { + return; + } + + g_warning ("Sink input callback failure"); + return; + } + + if (eol > 0) { + dec_outstanding (control); + return; + } + + update_sink_input (control, i); +} + +static void +_pa_context_get_source_output_info_cb (pa_context *context, + const pa_source_output_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + if (pa_context_errno (context) == PA_ERR_NOENTITY) { + return; + } + + g_warning ("Source output callback failure"); + return; + } + + if (eol > 0) { + dec_outstanding (control); + return; + } + + update_source_output (control, i); +} + +static void +_pa_context_get_client_info_cb (pa_context *context, + const pa_client_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + if (pa_context_errno (context) == PA_ERR_NOENTITY) { + return; + } + + g_warning ("Client callback failure"); + return; + } + + if (eol > 0) { + dec_outstanding (control); + return; + } + + update_client (control, i); +} + +static void +_pa_context_get_card_info_by_index_cb (pa_context *context, + const pa_card_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + if (pa_context_errno (context) == PA_ERR_NOENTITY) + return; + + g_warning ("Card callback failure"); + return; + } + + if (eol > 0) { + dec_outstanding (control); + return; + } + + update_card (control, i); +} + +static void +_pa_context_get_server_info_cb (pa_context *context, + const pa_server_info *i, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (i == NULL) { + g_warning ("Server info callback failure"); + return; + } + + update_server (control, i); + dec_outstanding (control); +} + +static void +remove_event_role_stream (GvcMixerControl *control) +{ + g_debug ("Removing event role"); +} + +static void +update_event_role_stream (GvcMixerControl *control, + const pa_ext_stream_restore_info *info) +{ + GvcMixerStream *stream; + gboolean is_new; + pa_volume_t max_volume; + + if (strcmp (info->name, "sink-input-by-media-role:event") != 0) { + return; + } + +#if 0 + g_debug ("Updating event role: name='%s' device='%s'", + info->name, + info->device); +#endif + + is_new = FALSE; + + if (!control->priv->event_sink_input_is_set) { + pa_channel_map pa_map; + GvcChannelMap *map; + + pa_map.channels = 1; + pa_map.map[0] = PA_CHANNEL_POSITION_MONO; + map = gvc_channel_map_new_from_pa_channel_map (&pa_map); + + stream = gvc_mixer_event_role_new (control->priv->pa_context, + info->device, + map); + control->priv->event_sink_input_id = gvc_mixer_stream_get_id (stream); + control->priv->event_sink_input_is_set = TRUE; + + is_new = TRUE; + } else { + stream = g_hash_table_lookup (control->priv->all_streams, + GUINT_TO_POINTER (control->priv->event_sink_input_id)); + } + + max_volume = pa_cvolume_max (&info->volume); + + gvc_mixer_stream_set_name (stream, _("System Sounds")); + gvc_mixer_stream_set_icon_name (stream, "multimedia-volume-control"); + gvc_mixer_stream_set_volume (stream, (guint)max_volume); + gvc_mixer_stream_set_is_muted (stream, info->mute); + + if (is_new) { + add_stream (control, stream); + } +} + +static void +_pa_ext_stream_restore_read_cb (pa_context *context, + const pa_ext_stream_restore_info *i, + int eol, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + if (eol < 0) { + g_debug ("Failed to initialized stream_restore extension: %s", + pa_strerror (pa_context_errno (context))); + remove_event_role_stream (control); + return; + } + + if (eol > 0) { + dec_outstanding (control); + /* If we don't have an event stream to restore, then + * set one up with a default 100% volume */ + if (!control->priv->event_sink_input_is_set) { + pa_ext_stream_restore_info info; + + memset (&info, 0, sizeof(info)); + info.name = "sink-input-by-media-role:event"; + info.volume.channels = 1; + info.volume.values[0] = PA_VOLUME_NORM; + update_event_role_stream (control, &info); + } + return; + } + + update_event_role_stream (control, i); +} + +static void +_pa_ext_stream_restore_subscribe_cb (pa_context *context, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + pa_operation *o; + + o = pa_ext_stream_restore_read (context, + _pa_ext_stream_restore_read_cb, + control); + if (o == NULL) { + g_warning ("pa_ext_stream_restore_read() failed"); + return; + } + + pa_operation_unref (o); +} + +static void +req_update_server_info (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + o = pa_context_get_server_info (control->priv->pa_context, + _pa_context_get_server_info_cb, + control); + if (o == NULL) { + g_warning ("pa_context_get_server_info() failed"); + return; + } + pa_operation_unref (o); +} + +static void +req_update_client_info (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + if (index < 0) { + o = pa_context_get_client_info_list (control->priv->pa_context, + _pa_context_get_client_info_cb, + control); + } else { + o = pa_context_get_client_info (control->priv->pa_context, + index, + _pa_context_get_client_info_cb, + control); + } + + if (o == NULL) { + g_warning ("pa_context_client_info_list() failed"); + return; + } + pa_operation_unref (o); +} + +static void +req_update_card (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + if (index < 0) { + o = pa_context_get_card_info_list (control->priv->pa_context, + _pa_context_get_card_info_by_index_cb, + control); + } else { + o = pa_context_get_card_info_by_index (control->priv->pa_context, + index, + _pa_context_get_card_info_by_index_cb, + control); + } + + if (o == NULL) { + g_warning ("pa_context_get_card_info_by_index() failed"); + return; + } + pa_operation_unref (o); +} + +static void +req_update_sink_info (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + if (index < 0) { + o = pa_context_get_sink_info_list (control->priv->pa_context, + _pa_context_get_sink_info_cb, + control); + } else { + o = pa_context_get_sink_info_by_index (control->priv->pa_context, + index, + _pa_context_get_sink_info_cb, + control); + } + + if (o == NULL) { + g_warning ("pa_context_get_sink_info_list() failed"); + return; + } + pa_operation_unref (o); +} + +static void +req_update_source_info (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + if (index < 0) { + o = pa_context_get_source_info_list (control->priv->pa_context, + _pa_context_get_source_info_cb, + control); + } else { + o = pa_context_get_source_info_by_index(control->priv->pa_context, + index, + _pa_context_get_source_info_cb, + control); + } + + if (o == NULL) { + g_warning ("pa_context_get_source_info_list() failed"); + return; + } + pa_operation_unref (o); +} + +static void +req_update_sink_input_info (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + if (index < 0) { + o = pa_context_get_sink_input_info_list (control->priv->pa_context, + _pa_context_get_sink_input_info_cb, + control); + } else { + o = pa_context_get_sink_input_info (control->priv->pa_context, + index, + _pa_context_get_sink_input_info_cb, + control); + } + + if (o == NULL) { + g_warning ("pa_context_get_sink_input_info_list() failed"); + return; + } + pa_operation_unref (o); +} + +static void +req_update_source_output_info (GvcMixerControl *control, + int index) +{ + pa_operation *o; + + if (index < 0) { + o = pa_context_get_source_output_info_list (control->priv->pa_context, + _pa_context_get_source_output_info_cb, + control); + } else { + o = pa_context_get_source_output_info (control->priv->pa_context, + index, + _pa_context_get_source_output_info_cb, + control); + } + + if (o == NULL) { + g_warning ("pa_context_get_source_output_info_list() failed"); + return; + } + pa_operation_unref (o); +} + +static void +remove_client (GvcMixerControl *control, + guint index) +{ + g_hash_table_remove (control->priv->clients, + GUINT_TO_POINTER (index)); +} + +static void +remove_card (GvcMixerControl *control, + guint index) +{ + g_hash_table_remove (control->priv->cards, + GUINT_TO_POINTER (index)); + + g_signal_emit (G_OBJECT (control), + signals[CARD_REMOVED], + 0, + index); +} + +static void +remove_sink (GvcMixerControl *control, + guint index) +{ + GvcMixerStream *stream; + +#if 0 + g_debug ("Removing sink: index=%u", index); +#endif + + stream = g_hash_table_lookup (control->priv->sinks, + GUINT_TO_POINTER (index)); + if (stream == NULL) { + return; + } + g_hash_table_remove (control->priv->sinks, + GUINT_TO_POINTER (index)); + + remove_stream (control, stream); +} + +static void +remove_source (GvcMixerControl *control, + guint index) +{ + GvcMixerStream *stream; + +#if 0 + g_debug ("Removing source: index=%u", index); +#endif + + stream = g_hash_table_lookup (control->priv->sources, + GUINT_TO_POINTER (index)); + if (stream == NULL) { + return; + } + g_hash_table_remove (control->priv->sources, + GUINT_TO_POINTER (index)); + + remove_stream (control, stream); +} + +static void +remove_sink_input (GvcMixerControl *control, + guint index) +{ + GvcMixerStream *stream; + +#if 0 + g_debug ("Removing sink input: index=%u", index); +#endif + stream = g_hash_table_lookup (control->priv->sink_inputs, + GUINT_TO_POINTER (index)); + if (stream == NULL) { + return; + } + g_hash_table_remove (control->priv->sink_inputs, + GUINT_TO_POINTER (index)); + + remove_stream (control, stream); +} + +static void +remove_source_output (GvcMixerControl *control, + guint index) +{ + GvcMixerStream *stream; + +#if 0 + g_debug ("Removing source output: index=%u", index); +#endif + + stream = g_hash_table_lookup (control->priv->source_outputs, + GUINT_TO_POINTER (index)); + if (stream == NULL) { + return; + } + g_hash_table_remove (control->priv->source_outputs, + GUINT_TO_POINTER (index)); + + remove_stream (control, stream); +} + +static void +_pa_context_subscribe_cb (pa_context *context, + pa_subscription_event_type_t t, + uint32_t index, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { + case PA_SUBSCRIPTION_EVENT_SINK: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + remove_sink (control, index); + } else { + req_update_sink_info (control, index); + } + break; + + case PA_SUBSCRIPTION_EVENT_SOURCE: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + remove_source (control, index); + } else { + req_update_source_info (control, index); + } + break; + + case PA_SUBSCRIPTION_EVENT_SINK_INPUT: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + remove_sink_input (control, index); + } else { + req_update_sink_input_info (control, index); + } + break; + + case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + remove_source_output (control, index); + } else { + req_update_source_output_info (control, index); + } + break; + + case PA_SUBSCRIPTION_EVENT_CLIENT: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + remove_client (control, index); + } else { + req_update_client_info (control, index); + } + break; + + case PA_SUBSCRIPTION_EVENT_SERVER: + req_update_server_info (control, index); + break; + + case PA_SUBSCRIPTION_EVENT_CARD: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + remove_card (control, index); + } else { + req_update_card (control, index); + } + break; + } +} + +static void +gvc_mixer_control_ready (GvcMixerControl *control) +{ + pa_operation *o; + + pa_context_set_subscribe_callback (control->priv->pa_context, + _pa_context_subscribe_cb, + control); + o = pa_context_subscribe (control->priv->pa_context, + (pa_subscription_mask_t) + (PA_SUBSCRIPTION_MASK_SINK| + PA_SUBSCRIPTION_MASK_SOURCE| + PA_SUBSCRIPTION_MASK_SINK_INPUT| + PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT| + PA_SUBSCRIPTION_MASK_CLIENT| + PA_SUBSCRIPTION_MASK_SERVER| + PA_SUBSCRIPTION_MASK_CARD), + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_subscribe() failed"); + return; + } + pa_operation_unref (o); + + req_update_server_info (control, -1); + req_update_client_info (control, -1); + req_update_sink_info (control, -1); + req_update_source_info (control, -1); + req_update_sink_input_info (control, -1); + req_update_source_output_info (control, -1); + req_update_card (control, -1); + + control->priv->n_outstanding = 6; + + /* This call is not always supported */ + o = pa_ext_stream_restore_read (control->priv->pa_context, + _pa_ext_stream_restore_read_cb, + control); + if (o != NULL) { + pa_operation_unref (o); + control->priv->n_outstanding++; + + pa_ext_stream_restore_set_subscribe_cb (control->priv->pa_context, + _pa_ext_stream_restore_subscribe_cb, + control); + + o = pa_ext_stream_restore_subscribe (control->priv->pa_context, + 1, + NULL, + NULL); + if (o != NULL) { + pa_operation_unref (o); + } + + } else { + g_debug ("Failed to initialized stream_restore extension: %s", + pa_strerror (pa_context_errno (control->priv->pa_context))); + } +} + +static void +gvc_mixer_new_pa_context (GvcMixerControl *self) +{ + pa_proplist *proplist; + + g_return_if_fail (self); + g_return_if_fail (!self->priv->pa_context); + + proplist = pa_proplist_new (); + pa_proplist_sets (proplist, + PA_PROP_APPLICATION_NAME, + self->priv->name); + pa_proplist_sets (proplist, + PA_PROP_APPLICATION_ID, + "org.gnome.VolumeControl"); + pa_proplist_sets (proplist, + PA_PROP_APPLICATION_ICON_NAME, + "multimedia-volume-control"); + pa_proplist_sets (proplist, + PA_PROP_APPLICATION_VERSION, + PACKAGE_VERSION); + + self->priv->pa_context = pa_context_new_with_proplist (self->priv->pa_api, NULL, proplist); + + pa_proplist_free (proplist); + g_assert (self->priv->pa_context); +} + +static void +remove_all_streams (GvcMixerControl *control, GHashTable *hash_table) +{ + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, hash_table); + while (g_hash_table_iter_next (&iter, &key, &value)) { + remove_stream (control, value); + g_hash_table_iter_remove (&iter); + } +} + +static gboolean +idle_reconnect (gpointer data) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (data); + GHashTableIter iter; + gpointer key, value; + + g_return_val_if_fail (control, FALSE); + + if (control->priv->pa_context) { + pa_context_unref (control->priv->pa_context); + control->priv->pa_context = NULL; + gvc_mixer_new_pa_context (control); + } + + remove_all_streams (control, control->priv->sinks); + remove_all_streams (control, control->priv->sources); + remove_all_streams (control, control->priv->sink_inputs); + remove_all_streams (control, control->priv->source_outputs); + + g_hash_table_iter_init (&iter, control->priv->clients); + while (g_hash_table_iter_next (&iter, &key, &value)) + g_hash_table_iter_remove (&iter); + + gvc_mixer_control_open (control); /* cannot fail */ + + control->priv->reconnect_id = 0; + return FALSE; +} + +static void +_pa_context_state_cb (pa_context *context, + void *userdata) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (userdata); + + switch (pa_context_get_state (context)) { + case PA_CONTEXT_UNCONNECTED: + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + + case PA_CONTEXT_READY: + gvc_mixer_control_ready (control); + break; + + case PA_CONTEXT_FAILED: + g_warning ("Connection failed, reconnecting..."); + if (control->priv->reconnect_id == 0) + control->priv->reconnect_id = g_timeout_add_seconds (RECONNECT_DELAY, idle_reconnect, control); + break; + + case PA_CONTEXT_TERMINATED: + default: + /* FIXME: */ + break; + } +} + +gboolean +gvc_mixer_control_open (GvcMixerControl *control) +{ + int res; + + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE); + g_return_val_if_fail (control->priv->pa_context != NULL, FALSE); + g_return_val_if_fail (pa_context_get_state (control->priv->pa_context) == PA_CONTEXT_UNCONNECTED, FALSE); + + pa_context_set_state_callback (control->priv->pa_context, + _pa_context_state_cb, + control); + + g_signal_emit (G_OBJECT (control), signals[CONNECTING], 0); + res = pa_context_connect (control->priv->pa_context, NULL, (pa_context_flags_t) PA_CONTEXT_NOFAIL, NULL); + if (res < 0) { + g_warning ("Failed to connect context: %s", + pa_strerror (pa_context_errno (control->priv->pa_context))); + } + + return res; +} + +gboolean +gvc_mixer_control_close (GvcMixerControl *control) +{ + g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE); + g_return_val_if_fail (control->priv->pa_context != NULL, FALSE); + + pa_context_disconnect (control->priv->pa_context); + return TRUE; +} + +static void +gvc_mixer_control_dispose (GObject *object) +{ + GvcMixerControl *control = GVC_MIXER_CONTROL (object); + + if (control->priv->pa_context != NULL) { + pa_context_unref (control->priv->pa_context); + control->priv->pa_context = NULL; + } + + if (control->priv->default_source_name != NULL) { + g_free (control->priv->default_source_name); + control->priv->default_source_name = NULL; + } + if (control->priv->default_sink_name != NULL) { + g_free (control->priv->default_sink_name); + control->priv->default_sink_name = NULL; + } + + if (control->priv->pa_mainloop != NULL) { + pa_glib_mainloop_free (control->priv->pa_mainloop); + control->priv->pa_mainloop = NULL; + } + + if (control->priv->all_streams != NULL) { + g_hash_table_destroy (control->priv->all_streams); + control->priv->all_streams = NULL; + } + + if (control->priv->sinks != NULL) { + g_hash_table_destroy (control->priv->sinks); + control->priv->sinks = NULL; + } + if (control->priv->sources != NULL) { + g_hash_table_destroy (control->priv->sources); + control->priv->sources = NULL; + } + if (control->priv->sink_inputs != NULL) { + g_hash_table_destroy (control->priv->sink_inputs); + control->priv->sink_inputs = NULL; + } + if (control->priv->source_outputs != NULL) { + g_hash_table_destroy (control->priv->source_outputs); + control->priv->source_outputs = NULL; + } + if (control->priv->clients != NULL) { + g_hash_table_destroy (control->priv->clients); + control->priv->clients = NULL; + } + if (control->priv->cards != NULL) { + g_hash_table_destroy (control->priv->cards); + control->priv->cards = NULL; + } + + G_OBJECT_CLASS (gvc_mixer_control_parent_class)->dispose (object); +} + +static void +gvc_mixer_control_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcMixerControl *self = GVC_MIXER_CONTROL (object); + + switch (prop_id) { + case PROP_NAME: + g_free (self->priv->name); + self->priv->name = g_value_dup_string (value); + g_object_notify (G_OBJECT (self), "name"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_mixer_control_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcMixerControl *self = GVC_MIXER_CONTROL (object); + + switch (prop_id) { + case PROP_NAME: + g_value_set_string (value, self->priv->name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static GObject * +gvc_mixer_control_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerControl *self; + + object = G_OBJECT_CLASS (gvc_mixer_control_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_CONTROL (object); + + gvc_mixer_new_pa_context (self); + + return object; +} + +static void +gvc_mixer_control_class_init (GvcMixerControlClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_mixer_control_constructor; + object_class->dispose = gvc_mixer_control_dispose; + object_class->finalize = gvc_mixer_control_finalize; + object_class->set_property = gvc_mixer_control_set_property; + object_class->get_property = gvc_mixer_control_get_property; + + g_object_class_install_property (object_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "Name to display for this mixer control", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + + signals [CONNECTING] = + g_signal_new ("connecting", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, connecting), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals [READY] = + g_signal_new ("ready", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, ready), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals [STREAM_ADDED] = + g_signal_new ("stream-added", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, stream_added), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + signals [STREAM_REMOVED] = + g_signal_new ("stream-removed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, stream_removed), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + signals [CARD_ADDED] = + g_signal_new ("card-added", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, card_added), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + signals [CARD_REMOVED] = + g_signal_new ("card-removed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, card_removed), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + signals [DEFAULT_SINK_CHANGED] = + g_signal_new ("default-sink-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, default_sink_changed), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + signals [DEFAULT_SOURCE_CHANGED] = + g_signal_new ("default-source-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GvcMixerControlClass, default_source_changed), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + + g_type_class_add_private (klass, sizeof (GvcMixerControlPrivate)); +} + +static void +gvc_mixer_control_init (GvcMixerControl *control) +{ + control->priv = GVC_MIXER_CONTROL_GET_PRIVATE (control); + + control->priv->pa_mainloop = pa_glib_mainloop_new (g_main_context_default ()); + g_assert (control->priv->pa_mainloop); + + control->priv->pa_api = pa_glib_mainloop_get_api (control->priv->pa_mainloop); + g_assert (control->priv->pa_api); + + control->priv->all_streams = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref); + control->priv->sinks = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref); + control->priv->sources = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref); + control->priv->sink_inputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref); + control->priv->source_outputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref); + control->priv->cards = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref); + + control->priv->clients = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_free); +} + +static void +gvc_mixer_control_finalize (GObject *object) +{ + GvcMixerControl *mixer_control; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_CONTROL (object)); + + mixer_control = GVC_MIXER_CONTROL (object); + g_free (mixer_control->priv->name); + mixer_control->priv->name = NULL; + + g_return_if_fail (mixer_control->priv != NULL); + G_OBJECT_CLASS (gvc_mixer_control_parent_class)->finalize (object); +} + +GvcMixerControl * +gvc_mixer_control_new (const char *name) +{ + GObject *control; + control = g_object_new (GVC_TYPE_MIXER_CONTROL, + "name", name, + NULL); + return GVC_MIXER_CONTROL (control); +} diff --git a/panels/sound/gvc-mixer-control.h b/panels/sound/gvc-mixer-control.h new file mode 100644 index 000000000..d32b20493 --- /dev/null +++ b/panels/sound/gvc-mixer-control.h @@ -0,0 +1,96 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_CONTROL_H +#define __GVC_MIXER_CONTROL_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" +#include "gvc-mixer-card.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_CONTROL (gvc_mixer_control_get_type ()) +#define GVC_MIXER_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_CONTROL, GvcMixerControl)) +#define GVC_MIXER_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_CONTROL, GvcMixerControlClass)) +#define GVC_IS_MIXER_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_CONTROL)) +#define GVC_IS_MIXER_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_CONTROL)) +#define GVC_MIXER_CONTROL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_CONTROL, GvcMixerControlClass)) + +typedef struct GvcMixerControlPrivate GvcMixerControlPrivate; + +typedef struct +{ + GObject parent; + GvcMixerControlPrivate *priv; +} GvcMixerControl; + +typedef struct +{ + GObjectClass parent_class; + + void (*connecting) (GvcMixerControl *control); + void (*ready) (GvcMixerControl *control); + void (*stream_added) (GvcMixerControl *control, + guint id); + void (*stream_removed) (GvcMixerControl *control, + guint id); + void (*card_added) (GvcMixerControl *control, + guint id); + void (*card_removed) (GvcMixerControl *control, + guint id); + void (*default_sink_changed) (GvcMixerControl *control, + guint id); + void (*default_source_changed) (GvcMixerControl *control, + guint id); +} GvcMixerControlClass; + +GType gvc_mixer_control_get_type (void); + +GvcMixerControl * gvc_mixer_control_new (const char *name); + +gboolean gvc_mixer_control_open (GvcMixerControl *control); +gboolean gvc_mixer_control_close (GvcMixerControl *control); +gboolean gvc_mixer_control_is_ready (GvcMixerControl *control); + +GSList * gvc_mixer_control_get_cards (GvcMixerControl *control); +GSList * gvc_mixer_control_get_streams (GvcMixerControl *control); +GSList * gvc_mixer_control_get_sinks (GvcMixerControl *control); +GSList * gvc_mixer_control_get_sources (GvcMixerControl *control); +GSList * gvc_mixer_control_get_sink_inputs (GvcMixerControl *control); +GSList * gvc_mixer_control_get_source_outputs (GvcMixerControl *control); + +GvcMixerStream * gvc_mixer_control_lookup_stream_id (GvcMixerControl *control, + guint id); +GvcMixerCard * gvc_mixer_control_lookup_card_id (GvcMixerControl *control, + guint id); + +GvcMixerStream * gvc_mixer_control_get_default_sink (GvcMixerControl *control); +GvcMixerStream * gvc_mixer_control_get_default_source (GvcMixerControl *control); +GvcMixerStream * gvc_mixer_control_get_event_sink_input (GvcMixerControl *control); + +gboolean gvc_mixer_control_set_default_sink (GvcMixerControl *control, + GvcMixerStream *stream); +gboolean gvc_mixer_control_set_default_source (GvcMixerControl *control, + GvcMixerStream *stream); + +G_END_DECLS + +#endif /* __GVC_MIXER_CONTROL_H */ diff --git a/panels/sound/gvc-mixer-dialog.c b/panels/sound/gvc-mixer-dialog.c new file mode 100644 index 000000000..fa4ca3b5b --- /dev/null +++ b/panels/sound/gvc-mixer-dialog.c @@ -0,0 +1,2091 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gdk/gdkkeysyms.h> +#include <gtk/gtk.h> +#include <pulse/pulseaudio.h> + +#include "gvc-channel-bar.h" +#include "gvc-balance-bar.h" +#include "gvc-combo-box.h" +#include "gvc-mixer-control.h" +#include "gvc-mixer-card.h" +#include "gvc-mixer-sink.h" +#include "gvc-mixer-source.h" +#include "gvc-mixer-source-output.h" +#include "gvc-mixer-dialog.h" +#include "gvc-sound-theme-chooser.h" +#include "gvc-level-bar.h" +#include "gvc-speaker-test.h" +#include "gvc-mixer-control-private.h" + +#define SCALE_SIZE 128 + +#define GVC_MIXER_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_DIALOG, GvcMixerDialogPrivate)) + +struct GvcMixerDialogPrivate +{ + GvcMixerControl *mixer_control; + GHashTable *bars; + GtkWidget *notebook; + GtkWidget *output_bar; + GtkWidget *input_bar; + GtkWidget *input_level_bar; + GtkWidget *effects_bar; + GtkWidget *output_stream_box; + GtkWidget *sound_effects_box; + GtkWidget *hw_box; + GtkWidget *hw_treeview; + GtkWidget *hw_settings_box; + GtkWidget *hw_profile_combo; + GtkWidget *input_box; + GtkWidget *output_box; + GtkWidget *applications_box; + GtkWidget *no_apps_label; + GtkWidget *output_treeview; + GtkWidget *output_settings_box; + GtkWidget *output_balance_bar; + GtkWidget *output_fade_bar; + GtkWidget *output_lfe_bar; + GtkWidget *output_port_combo; + GtkWidget *input_treeview; + GtkWidget *input_port_combo; + GtkWidget *input_settings_box; + GtkWidget *sound_theme_chooser; + GtkWidget *click_feedback_button; + GtkWidget *audible_bell_button; + GtkSizeGroup *size_group; + + gdouble last_input_peak; + guint num_apps; +}; + +enum { + NAME_COLUMN, + DEVICE_COLUMN, + ACTIVE_COLUMN, + ID_COLUMN, + SPEAKERS_COLUMN, + NUM_COLUMNS +}; + +enum { + HW_ID_COLUMN, + HW_ICON_COLUMN, + HW_NAME_COLUMN, + HW_STATUS_COLUMN, + HW_PROFILE_COLUMN, + HW_PROFILE_HUMAN_COLUMN, + HW_SENSITIVE_COLUMN, + HW_NUM_COLUMNS +}; + +enum +{ + PROP_0, + PROP_MIXER_CONTROL +}; + +static void gvc_mixer_dialog_class_init (GvcMixerDialogClass *klass); +static void gvc_mixer_dialog_init (GvcMixerDialog *mixer_dialog); +static void gvc_mixer_dialog_finalize (GObject *object); + +static void bar_set_stream (GvcMixerDialog *dialog, + GtkWidget *bar, + GvcMixerStream *stream); + +static void on_adjustment_value_changed (GtkAdjustment *adjustment, + GvcMixerDialog *dialog); + +G_DEFINE_TYPE (GvcMixerDialog, gvc_mixer_dialog, GTK_TYPE_VBOX) + +static void +update_default_input (GvcMixerDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + gboolean ret; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview)); + ret = gtk_tree_model_get_iter_first (model, &iter); + if (ret == FALSE) { + g_debug ("No default input selected or available"); + return; + } + do { + gboolean toggled; + gboolean is_default; + guint id; + GvcMixerStream *stream; + + gtk_tree_model_get (model, &iter, + ID_COLUMN, &id, + ACTIVE_COLUMN, &toggled, + -1); + + stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id); + if (stream == NULL) { + g_warning ("Unable to find stream for id: %u", id); + continue; + } + + is_default = FALSE; + if (stream == gvc_mixer_control_get_default_source (dialog->priv->mixer_control)) { + is_default = TRUE; + } + + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + ACTIVE_COLUMN, is_default, + -1); + } while (gtk_tree_model_iter_next (model, &iter)); +} + +static void +update_description (GvcMixerDialog *dialog, + guint column, + const char *value, + GvcMixerStream *stream) +{ + GtkTreeModel *model; + GtkTreeIter iter; + guint id; + + if (GVC_IS_MIXER_SOURCE (stream)) + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview)); + else if (GVC_IS_MIXER_SINK (stream)) + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview)); + else + g_assert_not_reached (); + gtk_tree_model_get_iter_first (model, &iter); + + id = gvc_mixer_stream_get_id (stream); + do { + guint current_id; + + gtk_tree_model_get (model, &iter, + ID_COLUMN, ¤t_id, + -1); + if (id != current_id) + continue; + + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + column, value, + -1); + break; + } while (gtk_tree_model_iter_next (model, &iter)); +} + +static void +port_selection_changed (GvcComboBox *combo_box, + const char *port, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + + stream = g_object_get_data (G_OBJECT (combo_box), "stream"); + if (stream == NULL) { + g_warning ("Could not find stream for port combo box"); + return; + } + if (gvc_mixer_stream_change_port (stream, port) == FALSE) { + g_warning ("Could not change port for stream"); + } +} + +static void +update_output_settings (GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + const GvcChannelMap *map; + const GList *ports; + + g_debug ("Updating output settings"); + if (dialog->priv->output_balance_bar != NULL) { + gtk_container_remove (GTK_CONTAINER (dialog->priv->output_settings_box), + dialog->priv->output_balance_bar); + dialog->priv->output_balance_bar = NULL; + } + if (dialog->priv->output_fade_bar != NULL) { + gtk_container_remove (GTK_CONTAINER (dialog->priv->output_settings_box), + dialog->priv->output_fade_bar); + dialog->priv->output_fade_bar = NULL; + } + if (dialog->priv->output_lfe_bar != NULL) { + gtk_container_remove (GTK_CONTAINER (dialog->priv->output_settings_box), + dialog->priv->output_lfe_bar); + dialog->priv->output_lfe_bar = NULL; + } + if (dialog->priv->output_port_combo != NULL) { + gtk_container_remove (GTK_CONTAINER (dialog->priv->output_settings_box), + dialog->priv->output_port_combo); + dialog->priv->output_port_combo = NULL; + } + + stream = gvc_mixer_control_get_default_sink (dialog->priv->mixer_control); + if (stream == NULL) { + g_warning ("Default sink stream not found"); + return; + } + + gvc_channel_bar_set_base_volume (GVC_CHANNEL_BAR (dialog->priv->output_bar), + gvc_mixer_stream_get_base_volume (stream)); + gvc_channel_bar_set_is_amplified (GVC_CHANNEL_BAR (dialog->priv->output_bar), + gvc_mixer_stream_get_can_decibel (stream)); + + map = gvc_mixer_stream_get_channel_map (stream); + if (map == NULL) { + g_warning ("Default sink stream has no channel map"); + return; + } + + dialog->priv->output_balance_bar = gvc_balance_bar_new (map, BALANCE_TYPE_RL); + if (dialog->priv->size_group != NULL) { + gvc_balance_bar_set_size_group (GVC_BALANCE_BAR (dialog->priv->output_balance_bar), + dialog->priv->size_group, + TRUE); + } + gtk_box_pack_start (GTK_BOX (dialog->priv->output_settings_box), + dialog->priv->output_balance_bar, + FALSE, FALSE, 6); + gtk_widget_show (dialog->priv->output_balance_bar); + + if (gvc_channel_map_can_fade (map)) { + dialog->priv->output_fade_bar = gvc_balance_bar_new (map, BALANCE_TYPE_FR); + if (dialog->priv->size_group != NULL) { + gvc_balance_bar_set_size_group (GVC_BALANCE_BAR (dialog->priv->output_fade_bar), + dialog->priv->size_group, + TRUE); + } + gtk_box_pack_start (GTK_BOX (dialog->priv->output_settings_box), + dialog->priv->output_fade_bar, + FALSE, FALSE, 6); + gtk_widget_show (dialog->priv->output_fade_bar); + } + + if (gvc_channel_map_has_lfe (map)) { + dialog->priv->output_lfe_bar = gvc_balance_bar_new (map, BALANCE_TYPE_LFE); + if (dialog->priv->size_group != NULL) { + gvc_balance_bar_set_size_group (GVC_BALANCE_BAR (dialog->priv->output_lfe_bar), + dialog->priv->size_group, + TRUE); + } + gtk_box_pack_start (GTK_BOX (dialog->priv->output_settings_box), + dialog->priv->output_lfe_bar, + FALSE, FALSE, 6); + gtk_widget_show (dialog->priv->output_lfe_bar); + } + + ports = gvc_mixer_stream_get_ports (stream); + if (ports != NULL) { + const GvcMixerStreamPort *port; + port = gvc_mixer_stream_get_port (stream); + + dialog->priv->output_port_combo = gvc_combo_box_new (_("Co_nnector:")); + gvc_combo_box_set_ports (GVC_COMBO_BOX (dialog->priv->output_port_combo), + ports); + gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->output_port_combo), port->port); + g_object_set_data (G_OBJECT (dialog->priv->output_port_combo), "stream", stream); + g_signal_connect (G_OBJECT (dialog->priv->output_port_combo), "changed", + G_CALLBACK (port_selection_changed), dialog); + + gtk_box_pack_start (GTK_BOX (dialog->priv->output_settings_box), + dialog->priv->output_port_combo, + TRUE, FALSE, 6); + + gvc_combo_box_set_size_group (GVC_COMBO_BOX (dialog->priv->output_port_combo), dialog->priv->size_group, FALSE); + + gtk_widget_show (dialog->priv->output_port_combo); + } + + /* FIXME: We could make this into a "No settings" label instead */ + gtk_widget_set_sensitive (dialog->priv->output_balance_bar, gvc_channel_map_can_balance (map)); +} + +static void +update_default_output (GvcMixerDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview)); + gtk_tree_model_get_iter_first (model, &iter); + do { + gboolean toggled; + gboolean is_default; + guint id; + GvcMixerStream *stream; + + gtk_tree_model_get (model, &iter, + ID_COLUMN, &id, + ACTIVE_COLUMN, &toggled, + -1); + + stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id); + if (stream == NULL) { + g_warning ("Unable to find stream for id: %u", id); + continue; + } + + is_default = FALSE; + if (stream == gvc_mixer_control_get_default_sink (dialog->priv->mixer_control)) { + is_default = TRUE; + } + + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + ACTIVE_COLUMN, is_default, + -1); + } while (gtk_tree_model_iter_next (model, &iter)); +} + +static void +on_mixer_control_default_sink_changed (GvcMixerControl *control, + guint id, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + + g_debug ("GvcMixerDialog: default sink changed: %u", id); + + if (id == PA_INVALID_INDEX) + stream = NULL; + else + stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, + id); + bar_set_stream (dialog, dialog->priv->output_bar, stream); + + update_output_settings (dialog); + + update_default_output (dialog); +} + + +#define DECAY_STEP .15 + +static void +update_input_peak (GvcMixerDialog *dialog, + gdouble v) +{ + GtkAdjustment *adj; + + if (dialog->priv->last_input_peak >= DECAY_STEP) { + if (v < dialog->priv->last_input_peak - DECAY_STEP) { + v = dialog->priv->last_input_peak - DECAY_STEP; + } + } + + dialog->priv->last_input_peak = v; + + adj = gvc_level_bar_get_peak_adjustment (GVC_LEVEL_BAR (dialog->priv->input_level_bar)); + if (v >= 0) { + gtk_adjustment_set_value (adj, v); + } else { + gtk_adjustment_set_value (adj, 0.0); + } +} + +static void +update_input_meter (GvcMixerDialog *dialog, + uint32_t source_index, + uint32_t sink_input_idx, + double v) +{ + update_input_peak (dialog, v); +} + +static void +on_monitor_suspended_callback (pa_stream *s, + void *userdata) +{ + GvcMixerDialog *dialog; + + dialog = userdata; + + if (pa_stream_is_suspended (s)) { + g_debug ("Stream suspended"); + update_input_meter (dialog, + pa_stream_get_device_index (s), + PA_INVALID_INDEX, + -1); + } +} + +static void +on_monitor_read_callback (pa_stream *s, + size_t length, + void *userdata) +{ + GvcMixerDialog *dialog; + const void *data; + double v; + + dialog = userdata; + + if (pa_stream_peek (s, &data, &length) < 0) { + g_warning ("Failed to read data from stream"); + return; + } + + assert (length > 0); + assert (length % sizeof (float) == 0); + + v = ((const float *) data)[length / sizeof (float) -1]; + + pa_stream_drop (s); + + if (v < 0) { + v = 0; + } + if (v > 1) { + v = 1; + } + + update_input_meter (dialog, + pa_stream_get_device_index (s), + pa_stream_get_monitor_stream (s), + v); +} + +static void +create_monitor_stream_for_source (GvcMixerDialog *dialog, + GvcMixerStream *stream) +{ + pa_stream *s; + char t[16]; + pa_buffer_attr attr; + pa_sample_spec ss; + pa_context *context; + int res; + pa_proplist *proplist; + gboolean has_monitor; + + if (stream == NULL) { + return; + } + has_monitor = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (stream), "has-monitor")); + if (has_monitor != FALSE) { + return; + } + + g_debug ("Create monitor for %u", + gvc_mixer_stream_get_index (stream)); + + context = gvc_mixer_control_get_pa_context (dialog->priv->mixer_control); + + if (pa_context_get_server_protocol_version (context) < 13) { + return; + } + + ss.channels = 1; + ss.format = PA_SAMPLE_FLOAT32; + ss.rate = 25; + + memset (&attr, 0, sizeof (attr)); + attr.fragsize = sizeof (float); + attr.maxlength = (uint32_t) -1; + + snprintf (t, sizeof (t), "%u", gvc_mixer_stream_get_index (stream)); + + proplist = pa_proplist_new (); + pa_proplist_sets (proplist, PA_PROP_APPLICATION_ID, "org.gnome.VolumeControl"); + s = pa_stream_new_with_proplist (context, _("Peak detect"), &ss, NULL, proplist); + pa_proplist_free (proplist); + if (s == NULL) { + g_warning ("Failed to create monitoring stream"); + return; + } + + pa_stream_set_read_callback (s, on_monitor_read_callback, dialog); + pa_stream_set_suspended_callback (s, on_monitor_suspended_callback, dialog); + + res = pa_stream_connect_record (s, + t, + &attr, + (pa_stream_flags_t) (PA_STREAM_DONT_MOVE + |PA_STREAM_PEAK_DETECT + |PA_STREAM_ADJUST_LATENCY)); + if (res < 0) { + g_warning ("Failed to connect monitoring stream"); + pa_stream_unref (s); + } else { + g_object_set_data (G_OBJECT (stream), "has-monitor", GINT_TO_POINTER (TRUE)); + g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream", s); + g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "stream", stream); + } +} + +static void +stop_monitor_stream_for_source (GvcMixerDialog *dialog) +{ + pa_stream *s; + pa_context *context; + int res; + GvcMixerStream *stream; + + s = g_object_get_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream"); + if (s == NULL) + return; + stream = g_object_get_data (G_OBJECT (dialog->priv->input_level_bar), "stream"); + g_assert (stream != NULL); + + g_debug ("Stopping monitor for %u", pa_stream_get_index (s)); + + context = gvc_mixer_control_get_pa_context (dialog->priv->mixer_control); + + if (pa_context_get_server_protocol_version (context) < 13) { + return; + } + + res = pa_stream_disconnect (s); + if (res == 0) + g_object_set_data (G_OBJECT (stream), "has-monitor", GINT_TO_POINTER (FALSE)); + g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream", NULL); + g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "stream", NULL); +} + +static void +update_input_settings (GvcMixerDialog *dialog) +{ + const GList *ports; + GvcMixerStream *stream; + + g_debug ("Updating input settings"); + + stop_monitor_stream_for_source (dialog); + + if (dialog->priv->input_port_combo != NULL) { + gtk_container_remove (GTK_CONTAINER (dialog->priv->input_settings_box), + dialog->priv->input_port_combo); + dialog->priv->input_port_combo = NULL; + } + + stream = gvc_mixer_control_get_default_source (dialog->priv->mixer_control); + if (stream == NULL) { + g_debug ("Default source stream not found"); + return; + } + + gvc_channel_bar_set_base_volume (GVC_CHANNEL_BAR (dialog->priv->input_bar), + gvc_mixer_stream_get_base_volume (stream)); + gvc_channel_bar_set_is_amplified (GVC_CHANNEL_BAR (dialog->priv->input_bar), + gvc_mixer_stream_get_can_decibel (stream)); + + ports = gvc_mixer_stream_get_ports (stream); + if (ports != NULL) { + const GvcMixerStreamPort *port; + port = gvc_mixer_stream_get_port (stream); + + dialog->priv->input_port_combo = gvc_combo_box_new (_("Co_nnector:")); + gvc_combo_box_set_ports (GVC_COMBO_BOX (dialog->priv->input_port_combo), + ports); + gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->input_port_combo), port->port); + g_object_set_data (G_OBJECT (dialog->priv->input_port_combo), "stream", stream); + g_signal_connect (G_OBJECT (dialog->priv->input_port_combo), "changed", + G_CALLBACK (port_selection_changed), dialog); + + gvc_combo_box_set_size_group (GVC_COMBO_BOX (dialog->priv->input_port_combo), dialog->priv->size_group, FALSE); + gtk_box_pack_start (GTK_BOX (dialog->priv->input_settings_box), + dialog->priv->input_port_combo, + TRUE, TRUE, 0); + gtk_widget_show (dialog->priv->input_port_combo); + } + + create_monitor_stream_for_source (dialog, stream); +} + +static void +on_mixer_control_default_source_changed (GvcMixerControl *control, + guint id, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + GtkAdjustment *adj; + + g_debug ("GvcMixerDialog: default source changed: %u", id); + + if (id == PA_INVALID_INDEX) + stream = NULL; + else + stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id); + + /* Disconnect the adj, otherwise it might change if is_amplified changes */ + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (dialog->priv->input_bar))); + g_signal_handlers_disconnect_by_func(adj, on_adjustment_value_changed, dialog); + + bar_set_stream (dialog, dialog->priv->input_bar, stream); + update_input_settings (dialog); + + g_signal_connect (adj, + "value-changed", + G_CALLBACK (on_adjustment_value_changed), + dialog); + + update_default_input (dialog); +} + +static void +gvc_mixer_dialog_set_mixer_control (GvcMixerDialog *dialog, + GvcMixerControl *control) +{ + g_return_if_fail (GVC_MIXER_DIALOG (dialog)); + g_return_if_fail (GVC_IS_MIXER_CONTROL (control)); + + g_object_ref (control); + + if (dialog->priv->mixer_control != NULL) { + g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control, + G_CALLBACK (on_mixer_control_default_sink_changed), + dialog); + g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control, + G_CALLBACK (on_mixer_control_default_source_changed), + dialog); + g_object_unref (dialog->priv->mixer_control); + } + + dialog->priv->mixer_control = control; + + g_signal_connect (dialog->priv->mixer_control, + "default-sink-changed", + G_CALLBACK (on_mixer_control_default_sink_changed), + dialog); + g_signal_connect (dialog->priv->mixer_control, + "default-source-changed", + G_CALLBACK (on_mixer_control_default_source_changed), + dialog); + + g_object_notify (G_OBJECT (dialog), "mixer-control"); +} + +static GvcMixerControl * +gvc_mixer_dialog_get_mixer_control (GvcMixerDialog *dialog) +{ + g_return_val_if_fail (GVC_IS_MIXER_DIALOG (dialog), NULL); + + return dialog->priv->mixer_control; +} + +static void +gvc_mixer_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcMixerDialog *self = GVC_MIXER_DIALOG (object); + + switch (prop_id) { + case PROP_MIXER_CONTROL: + gvc_mixer_dialog_set_mixer_control (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_mixer_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcMixerDialog *self = GVC_MIXER_DIALOG (object); + + switch (prop_id) { + case PROP_MIXER_CONTROL: + g_value_set_object (value, gvc_mixer_dialog_get_mixer_control (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +on_adjustment_value_changed (GtkAdjustment *adjustment, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + + stream = g_object_get_data (G_OBJECT (adjustment), "gvc-mixer-dialog-stream"); + if (stream != NULL) { + GObject *bar; + gdouble volume, rounded; + char *name; + + volume = gtk_adjustment_get_value (adjustment); + rounded = round (volume); + + bar = g_object_get_data (G_OBJECT (adjustment), "gvc-mixer-dialog-bar"); + g_object_get (bar, "name", &name, NULL); + g_debug ("Setting stream volume %lf (rounded: %lf) for bar '%s'", volume, rounded, name); + g_free (name); + + /* FIXME would need to do that in the balance bar really... */ + /* Make sure we do not unmute muted streams, there's a button for that */ + if (volume == 0.0) + gvc_mixer_stream_set_is_muted (stream, TRUE); + /* Only push the volume if it's actually changed */ + if (gvc_mixer_stream_set_volume(stream, (pa_volume_t) rounded) != FALSE) + gvc_mixer_stream_push_volume (stream); + } +} + +static void +on_bar_is_muted_notify (GObject *object, + GParamSpec *pspec, + GvcMixerDialog *dialog) +{ + gboolean is_muted; + GvcMixerStream *stream; + + is_muted = gvc_channel_bar_get_is_muted (GVC_CHANNEL_BAR (object)); + + stream = g_object_get_data (object, "gvc-mixer-dialog-stream"); + if (stream != NULL) { + gvc_mixer_stream_change_is_muted (stream, is_muted); + } else { + char *name; + g_object_get (object, "name", &name, NULL); + g_warning ("Unable to find stream for bar '%s'", name); + g_free (name); + } +} + +static GtkWidget * +lookup_bar_for_stream (GvcMixerDialog *dialog, + GvcMixerStream *stream) +{ + GtkWidget *bar; + + bar = g_hash_table_lookup (dialog->priv->bars, GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream))); + + return bar; +} + +static GtkWidget * +lookup_combo_box_for_stream (GvcMixerDialog *dialog, + GvcMixerStream *stream) +{ + GvcMixerStream *combo_stream; + guint id; + + id = gvc_mixer_stream_get_id (stream); + + if (dialog->priv->output_port_combo != NULL) { + combo_stream = g_object_get_data (G_OBJECT (dialog->priv->output_port_combo), + "stream"); + if (combo_stream != NULL) { + if (id == gvc_mixer_stream_get_id (combo_stream)) + return dialog->priv->output_port_combo; + } + } + + if (dialog->priv->input_port_combo != NULL) { + combo_stream = g_object_get_data (G_OBJECT (dialog->priv->input_port_combo), + "stream"); + if (combo_stream != NULL) { + if (id == gvc_mixer_stream_get_id (combo_stream)) + return dialog->priv->input_port_combo; + } + } + + return NULL; +} + +static void +on_stream_description_notify (GvcMixerStream *stream, + GParamSpec *pspec, + GvcMixerDialog *dialog) +{ + update_description (dialog, NAME_COLUMN, + gvc_mixer_stream_get_description (stream), + stream); +} + +static void +on_stream_port_notify (GObject *object, + GParamSpec *pspec, + GvcMixerDialog *dialog) +{ + GvcComboBox *combo_box; + char *port; + + combo_box = GVC_COMBO_BOX (lookup_combo_box_for_stream (dialog, GVC_MIXER_STREAM (object))); + if (combo_box == NULL) + return; + + g_signal_handlers_block_by_func (G_OBJECT (combo_box), + port_selection_changed, + dialog); + + g_object_get (object, "port", &port, NULL); + gvc_combo_box_set_active (GVC_COMBO_BOX (combo_box), port); + + g_signal_handlers_unblock_by_func (G_OBJECT (combo_box), + port_selection_changed, + dialog); +} + +static void +on_stream_volume_notify (GObject *object, + GParamSpec *pspec, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + GtkWidget *bar; + GtkAdjustment *adj; + + stream = GVC_MIXER_STREAM (object); + + bar = lookup_bar_for_stream (dialog, stream); + + if (bar == NULL) { + g_warning ("Unable to find bar for stream %s in on_stream_volume_notify()", + gvc_mixer_stream_get_name (stream)); + return; + } + + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar))); + + g_signal_handlers_block_by_func (adj, + on_adjustment_value_changed, + dialog); + + gtk_adjustment_set_value (adj, + gvc_mixer_stream_get_volume (stream)); + + g_signal_handlers_unblock_by_func (adj, + on_adjustment_value_changed, + dialog); +} + +static void +on_stream_is_muted_notify (GObject *object, + GParamSpec *pspec, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + GtkWidget *bar; + gboolean is_muted; + + stream = GVC_MIXER_STREAM (object); + bar = lookup_bar_for_stream (dialog, stream); + + if (bar == NULL) { + g_warning ("Unable to find bar for stream %s in on_stream_is_muted_notify()", + gvc_mixer_stream_get_name (stream)); + return; + } + + is_muted = gvc_mixer_stream_get_is_muted (stream); + gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (bar), + is_muted); + + if (stream == gvc_mixer_control_get_default_sink (dialog->priv->mixer_control)) { + gtk_widget_set_sensitive (dialog->priv->applications_box, + !is_muted); + } + +} + +static void +save_bar_for_stream (GvcMixerDialog *dialog, + GvcMixerStream *stream, + GtkWidget *bar) +{ + g_hash_table_insert (dialog->priv->bars, + GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)), + bar); +} + +static GtkWidget * +create_bar (GvcMixerDialog *dialog, + gboolean symmetric) +{ + GtkWidget *bar; + + bar = gvc_channel_bar_new (); + gtk_widget_set_sensitive (bar, FALSE); + gvc_channel_bar_set_size_group (GVC_CHANNEL_BAR (bar), + dialog->priv->size_group, + symmetric); + gvc_channel_bar_set_orientation (GVC_CHANNEL_BAR (bar), + GTK_ORIENTATION_HORIZONTAL); + gvc_channel_bar_set_show_mute (GVC_CHANNEL_BAR (bar), + TRUE); + g_signal_connect (bar, + "notify::is-muted", + G_CALLBACK (on_bar_is_muted_notify), + dialog); + return bar; +} + +static GtkWidget * +create_app_bar (GvcMixerDialog *dialog, + const char *name, + const char *icon_name) +{ + GtkWidget *bar; + + bar = create_bar (dialog, FALSE); + gvc_channel_bar_set_ellipsize (GVC_CHANNEL_BAR (bar), TRUE); + gvc_channel_bar_set_icon_name (GVC_CHANNEL_BAR (bar), icon_name); + if (name == NULL || strchr (name, '_') == NULL) { + gvc_channel_bar_set_name (GVC_CHANNEL_BAR (bar), name); + } else { + char **tokens, *escaped; + + tokens = g_strsplit (name, "_", -1); + escaped = g_strjoinv ("__", tokens); + g_strfreev (tokens); + gvc_channel_bar_set_name (GVC_CHANNEL_BAR (bar), escaped); + g_free (escaped); + } + + return bar; +} + +static void +bar_set_stream (GvcMixerDialog *dialog, + GtkWidget *bar, + GvcMixerStream *stream) +{ + GtkAdjustment *adj; + GvcMixerStream *old_stream; + + g_assert (bar != NULL); + + old_stream = g_object_get_data (G_OBJECT (bar), "gvc-mixer-dialog-stream"); + if (old_stream != NULL) { + char *name; + + g_object_get (bar, "name", &name, NULL); + g_debug ("Disconnecting old stream '%s' from bar '%s'", + gvc_mixer_stream_get_name (old_stream), name); + g_free (name); + + g_signal_handlers_disconnect_by_func (old_stream, on_stream_is_muted_notify, dialog); + g_signal_handlers_disconnect_by_func (old_stream, on_stream_volume_notify, dialog); + g_signal_handlers_disconnect_by_func (old_stream, on_stream_port_notify, dialog); + g_hash_table_remove (dialog->priv->bars, GUINT_TO_POINTER (gvc_mixer_stream_get_id (old_stream))); + } + + gtk_widget_set_sensitive (bar, (stream != NULL)); + + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar))); + + g_signal_handlers_disconnect_by_func (adj, on_adjustment_value_changed, dialog); + + g_object_set_data (G_OBJECT (bar), "gvc-mixer-dialog-stream", stream); + g_object_set_data (G_OBJECT (adj), "gvc-mixer-dialog-stream", stream); + g_object_set_data (G_OBJECT (adj), "gvc-mixer-dialog-bar", bar); + + if (stream != NULL) { + gboolean is_muted; + + is_muted = gvc_mixer_stream_get_is_muted (stream); + gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (bar), is_muted); + + save_bar_for_stream (dialog, stream, bar); + + gtk_adjustment_set_value (adj, + gvc_mixer_stream_get_volume (stream)); + + g_signal_connect (stream, + "notify::is-muted", + G_CALLBACK (on_stream_is_muted_notify), + dialog); + g_signal_connect (stream, + "notify::volume", + G_CALLBACK (on_stream_volume_notify), + dialog); + g_signal_connect (stream, + "notify::port", + G_CALLBACK (on_stream_port_notify), + dialog); + g_signal_connect (adj, + "value-changed", + G_CALLBACK (on_adjustment_value_changed), + dialog); + } +} + +static void +add_stream (GvcMixerDialog *dialog, + GvcMixerStream *stream) +{ + GtkWidget *bar; + gboolean is_muted; + gboolean is_default; + GtkAdjustment *adj; + const char *id; + + g_assert (stream != NULL); + + if (gvc_mixer_stream_is_event_stream (stream) != FALSE) + return; + + bar = NULL; + is_default = FALSE; + id = gvc_mixer_stream_get_application_id (stream); + + if (stream == gvc_mixer_control_get_default_sink (dialog->priv->mixer_control)) { + bar = dialog->priv->output_bar; + is_muted = gvc_mixer_stream_get_is_muted (stream); + is_default = TRUE; + gtk_widget_set_sensitive (dialog->priv->applications_box, + !is_muted); + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar))); + g_signal_handlers_disconnect_by_func(adj, on_adjustment_value_changed, dialog); + update_output_settings (dialog); + } else if (stream == gvc_mixer_control_get_default_source (dialog->priv->mixer_control)) { + bar = dialog->priv->input_bar; + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar))); + g_signal_handlers_disconnect_by_func(adj, on_adjustment_value_changed, dialog); + update_input_settings (dialog); + is_default = TRUE; + } else if (stream == gvc_mixer_control_get_event_sink_input (dialog->priv->mixer_control)) { + bar = dialog->priv->effects_bar; + g_debug ("Adding effects stream"); + } else if (! GVC_IS_MIXER_SOURCE (stream) + && !GVC_IS_MIXER_SINK (stream) + && !gvc_mixer_stream_is_virtual (stream) + && g_strcmp0 (id, "org.gnome.VolumeControl") != 0 + && g_strcmp0 (id, "org.PulseAudio.pavucontrol") != 0) { + const char *name; + + name = gvc_mixer_stream_get_name (stream); + bar = create_app_bar (dialog, name, + gvc_mixer_stream_get_icon_name (stream)); + + gtk_box_pack_start (GTK_BOX (dialog->priv->applications_box), bar, FALSE, FALSE, 12); + dialog->priv->num_apps++; + gtk_widget_hide (dialog->priv->no_apps_label); + } + + if (GVC_IS_MIXER_SOURCE (stream)) { + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview)); + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + NAME_COLUMN, gvc_mixer_stream_get_description (stream), + DEVICE_COLUMN, "", + ACTIVE_COLUMN, is_default, + ID_COLUMN, gvc_mixer_stream_get_id (stream), + -1); + g_signal_connect (stream, + "notify::description", + G_CALLBACK (on_stream_description_notify), + dialog); + } else if (GVC_IS_MIXER_SINK (stream)) { + GtkTreeModel *model; + GtkTreeIter iter; + const GvcChannelMap *map; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview)); + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + map = gvc_mixer_stream_get_channel_map (stream); + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + NAME_COLUMN, gvc_mixer_stream_get_description (stream), + DEVICE_COLUMN, "", + ACTIVE_COLUMN, is_default, + ID_COLUMN, gvc_mixer_stream_get_id (stream), + SPEAKERS_COLUMN, gvc_channel_map_get_mapping (map), + -1); + g_signal_connect (stream, + "notify::description", + G_CALLBACK (on_stream_description_notify), + dialog); + } + + if (bar != NULL) { + bar_set_stream (dialog, bar, stream); + gtk_widget_show (bar); + } +} + +static void +on_control_stream_added (GvcMixerControl *control, + guint id, + GvcMixerDialog *dialog) +{ + GvcMixerStream *stream; + GtkWidget *bar; + + bar = g_hash_table_lookup (dialog->priv->bars, GUINT_TO_POINTER (id)); + if (bar != NULL) { + g_debug ("GvcMixerDialog: Stream %u already added", id); + return; + } + + stream = gvc_mixer_control_lookup_stream_id (control, id); + if (stream != NULL) { + add_stream (dialog, stream); + } +} + +static gboolean +find_item_by_id (GtkTreeModel *model, + guint id, + guint column, + GtkTreeIter *iter) +{ + gboolean found_item; + + found_item = FALSE; + + if (!gtk_tree_model_get_iter_first (model, iter)) { + return FALSE; + } + + do { + guint t_id; + + gtk_tree_model_get (model, iter, + column, &t_id, -1); + + if (id == t_id) { + found_item = TRUE; + } + } while (!found_item && gtk_tree_model_iter_next (model, iter)); + + return found_item; +} + +static void +remove_stream (GvcMixerDialog *dialog, + guint id) +{ + GtkWidget *bar; + gboolean found; + GtkTreeIter iter; + GtkTreeModel *model; + + /* remove bars for applications and reset fixed bars */ + bar = g_hash_table_lookup (dialog->priv->bars, GUINT_TO_POINTER (id)); + if (bar == dialog->priv->output_bar + || bar == dialog->priv->input_bar + || bar == dialog->priv->effects_bar) { + char *name; + g_object_get (bar, "name", &name, NULL); + g_debug ("Removing stream for bar '%s'", name); + g_free (name); + bar_set_stream (dialog, bar, NULL); + } else if (bar != NULL) { + g_hash_table_remove (dialog->priv->bars, GUINT_TO_POINTER (id)); + gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (bar)), + bar); + dialog->priv->num_apps--; + if (dialog->priv->num_apps == 0) { + gtk_widget_show (dialog->priv->no_apps_label); + } + } + + /* remove from any models */ + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview)); + found = find_item_by_id (GTK_TREE_MODEL (model), id, ID_COLUMN, &iter); + if (found) { + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + } + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview)); + found = find_item_by_id (GTK_TREE_MODEL (model), id, ID_COLUMN, &iter); + if (found) { + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + } +} + +static void +on_control_stream_removed (GvcMixerControl *control, + guint id, + GvcMixerDialog *dialog) +{ + remove_stream (dialog, id); +} + +static void +add_card (GvcMixerDialog *dialog, + GvcMixerCard *card) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection *selection; + GvcMixerCardProfile *profile; + GIcon *icon; + guint index; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->hw_treeview)); + index = gvc_mixer_card_get_index (card); + if (find_item_by_id (GTK_TREE_MODEL (model), index, HW_ID_COLUMN, &iter) == FALSE) + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + profile = gvc_mixer_card_get_profile (card); + g_assert (profile != NULL); + icon = g_themed_icon_new_with_default_fallbacks (gvc_mixer_card_get_icon_name (card)); + //FIXME we need the status (default for a profile?) here + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + HW_NAME_COLUMN, gvc_mixer_card_get_name (card), + HW_ID_COLUMN, index, + HW_ICON_COLUMN, icon, + HW_PROFILE_COLUMN, profile->profile, + HW_PROFILE_HUMAN_COLUMN, profile->human_profile, + HW_STATUS_COLUMN, profile->status, + HW_SENSITIVE_COLUMN, g_strcmp0 (profile->profile, "off") != 0, + -1); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->hw_treeview)); + if (gtk_tree_selection_get_selected (selection, NULL, NULL) == FALSE) { + gtk_tree_selection_select_iter (selection, &iter); + } else if (dialog->priv->hw_profile_combo != NULL) { + GvcMixerCard *selected; + + /* Set the current profile if it changed for the selected card */ + selected = g_object_get_data (G_OBJECT (dialog->priv->hw_profile_combo), "card"); + if (gvc_mixer_card_get_index (selected) == gvc_mixer_card_get_index (card)) { + gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->hw_profile_combo), + profile->profile); + g_object_set (G_OBJECT (dialog->priv->hw_profile_combo), + "show-button", profile->n_sinks == 1, + NULL); + } + } +} + +static void +on_control_card_added (GvcMixerControl *control, + guint id, + GvcMixerDialog *dialog) +{ + GvcMixerCard *card; + + card = gvc_mixer_control_lookup_card_id (control, id); + if (card != NULL) { + add_card (dialog, card); + } +} + +static void +remove_card (GvcMixerDialog *dialog, + guint id) +{ + gboolean found; + GtkTreeIter iter; + GtkTreeModel *model; + + /* remove from any models */ + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->hw_treeview)); + found = find_item_by_id (GTK_TREE_MODEL (model), id, HW_ID_COLUMN, &iter); + if (found) { + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + } +} +static void +on_control_card_removed (GvcMixerControl *control, + guint id, + GvcMixerDialog *dialog) +{ + remove_card (dialog, id); +} + +static void +_gtk_label_make_bold (GtkLabel *label) +{ + PangoFontDescription *font_desc; + + font_desc = pango_font_description_new (); + + pango_font_description_set_weight (font_desc, + PANGO_WEIGHT_BOLD); + + /* This will only affect the weight of the font, the rest is + * from the current state of the widget, which comes from the + * theme or user prefs, since the font desc only has the + * weight flag turned on. + */ + gtk_widget_modify_font (GTK_WIDGET (label), font_desc); + + pango_font_description_free (font_desc); +} + +static void +on_input_radio_toggled (GtkCellRendererToggle *renderer, + char *path_str, + GvcMixerDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *path; + gboolean toggled; + guint id; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview)); + + path = gtk_tree_path_new_from_string (path_str); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_path_free (path); + + gtk_tree_model_get (model, &iter, + ID_COLUMN, &id, + ACTIVE_COLUMN, &toggled, + -1); + + toggled ^= 1; + if (toggled) { + GvcMixerStream *stream; + + g_debug ("Default input selected: %u", id); + stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id); + if (stream == NULL) { + g_warning ("Unable to find stream for id: %u", id); + return; + } + + gvc_mixer_control_set_default_source (dialog->priv->mixer_control, stream); + } +} + +static void +on_output_radio_toggled (GtkCellRendererToggle *renderer, + char *path_str, + GvcMixerDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *path; + gboolean toggled; + guint id; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview)); + + path = gtk_tree_path_new_from_string (path_str); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_path_free (path); + + gtk_tree_model_get (model, &iter, + ID_COLUMN, &id, + ACTIVE_COLUMN, &toggled, + -1); + + toggled ^= 1; + if (toggled) { + GvcMixerStream *stream; + + g_debug ("Default output selected: %u", id); + stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id); + if (stream == NULL) { + g_warning ("Unable to find stream for id: %u", id); + return; + } + + gvc_mixer_control_set_default_sink (dialog->priv->mixer_control, stream); + } +} + +static void +name_to_text (GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ + char *name, *mapping; + + gtk_tree_model_get(model, iter, + NAME_COLUMN, &name, + SPEAKERS_COLUMN, &mapping, + -1); + + if (mapping == NULL) { + g_object_set (cell, "text", name, NULL); + } else { + char *str; + + str = g_strdup_printf ("%s\n<i>%s</i>", + name, mapping); + g_object_set (cell, "markup", str, NULL); + g_free (str); + } + + g_free (name); + g_free (mapping); +} + +static GtkWidget * +create_stream_treeview (GvcMixerDialog *dialog, + GCallback on_toggled) +{ + GtkWidget *treeview; + GtkListStore *store; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + treeview = gtk_tree_view_new (); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); + + store = gtk_list_store_new (NUM_COLUMNS, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_BOOLEAN, + G_TYPE_UINT, + G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), + GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_toggle_new (); + gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE (renderer), + TRUE); + column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "active", ACTIVE_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + g_signal_connect (renderer, + "toggled", + G_CALLBACK (on_toggled), + dialog); + + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview), -1, + _("Name"), gtk_cell_renderer_text_new (), + name_to_text, NULL, NULL); + +#if 0 + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Device"), + renderer, + "text", DEVICE_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); +#endif + return treeview; +} + +static void +on_profile_changed (GvcComboBox *widget, + const char *profile, + gpointer user_data) +{ + GvcMixerCard *card; + + card = g_object_get_data (G_OBJECT (widget), "card"); + if (card == NULL) { + g_warning ("Could not find card for combobox"); + return; + } + + g_debug ("Profile changed to %s for card %s", profile, + gvc_mixer_card_get_name (card)); + + gvc_mixer_card_change_profile (card, profile); +} + +static void +on_test_speakers_clicked (GvcComboBox *widget, + gpointer user_data) +{ + GvcMixerDialog *dialog = GVC_MIXER_DIALOG (user_data); + GvcMixerCard *card; + GvcMixerCardProfile *profile; + GtkWidget *d, *speaker_test, *container; + char *title; + + card = g_object_get_data (G_OBJECT (widget), "card"); + if (card == NULL) { + g_warning ("Could not find card for combobox"); + return; + } + profile = gvc_mixer_card_get_profile (card); + + g_debug ("XXX Start speaker testing for profile '%s', card %s XXX", + profile->profile, gvc_mixer_card_get_name (card)); + + title = g_strdup_printf (_("Speaker Testing for %s"), gvc_mixer_card_get_name (card)); + // FIXME + // set parent dialogue + // https://bugzilla.gnome.org/show_bug.cgi?id=621940 + d = gtk_dialog_new_with_buttons (title, + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + NULL); + g_free (title); + speaker_test = gvc_speaker_test_new (dialog->priv->mixer_control, + card); + gtk_widget_show (speaker_test); + container = gtk_dialog_get_content_area (GTK_DIALOG (d)); + gtk_container_add (GTK_CONTAINER (container), speaker_test); + + gtk_dialog_run (GTK_DIALOG (d)); + gtk_widget_destroy (d); +} + +static void +on_card_selection_changed (GtkTreeSelection *selection, + gpointer user_data) +{ + GvcMixerDialog *dialog = GVC_MIXER_DIALOG (user_data); + GtkTreeModel *model; + GtkTreeIter iter; + const GList *profiles; + guint id; + GvcMixerCard *card; + GvcMixerCardProfile *current_profile; + + g_debug ("Card selection changed"); + + if (dialog->priv->hw_profile_combo != NULL) { + gtk_container_remove (GTK_CONTAINER (dialog->priv->hw_settings_box), + dialog->priv->hw_profile_combo); + dialog->priv->hw_profile_combo = NULL; + } + + if (gtk_tree_selection_get_selected (selection, + NULL, + &iter) == FALSE) { + return; + } + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->hw_treeview)); + gtk_tree_model_get (model, &iter, + HW_ID_COLUMN, &id, + -1); + card = gvc_mixer_control_lookup_card_id (dialog->priv->mixer_control, id); + if (card == NULL) { + g_warning ("Unable to find card for id: %u", id); + return; + } + + current_profile = gvc_mixer_card_get_profile (card); + profiles = gvc_mixer_card_get_profiles (card); + dialog->priv->hw_profile_combo = gvc_combo_box_new (_("_Profile:")); + g_object_set (G_OBJECT (dialog->priv->hw_profile_combo), "button-label", _("Test Speakers"), NULL); + gvc_combo_box_set_profiles (GVC_COMBO_BOX (dialog->priv->hw_profile_combo), profiles); + gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->hw_profile_combo), current_profile->profile); + + gtk_box_pack_start (GTK_BOX (dialog->priv->hw_settings_box), + dialog->priv->hw_profile_combo, + TRUE, TRUE, 6); + g_object_set (G_OBJECT (dialog->priv->hw_profile_combo), + "show-button", current_profile->n_sinks == 1, + NULL); + gtk_widget_show (dialog->priv->hw_profile_combo); + + g_object_set_data (G_OBJECT (dialog->priv->hw_profile_combo), "card", card); + g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo), "changed", + G_CALLBACK (on_profile_changed), dialog); + g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo), "button-clicked", + G_CALLBACK (on_test_speakers_clicked), dialog); +} + +static void +card_to_text (GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ + char *name, *status, *profile, *str; + gboolean sensitive; + + gtk_tree_model_get(model, iter, + HW_NAME_COLUMN, &name, + HW_STATUS_COLUMN, &status, + HW_PROFILE_HUMAN_COLUMN, &profile, + HW_SENSITIVE_COLUMN, &sensitive, + -1); + + str = g_strdup_printf ("%s\n<i>%s</i>\n<i>%s</i>", + name, status, profile); + g_object_set (cell, + "markup", str, + "sensitive", sensitive, + NULL); + g_free (str); + + g_free (name); + g_free (status); + g_free (profile); +} + +static GtkWidget * +create_cards_treeview (GvcMixerDialog *dialog, + GCallback on_changed) +{ + GtkWidget *treeview; + GtkListStore *store; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeSelection *selection; + + treeview = gtk_tree_view_new (); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + on_changed, dialog); + + store = gtk_list_store_new (HW_NUM_COLUMNS, + G_TYPE_UINT, + G_TYPE_ICON, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_BOOLEAN); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), + GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_pixbuf_new (); + g_object_set (G_OBJECT (renderer), "stock-size", GTK_ICON_SIZE_DIALOG, NULL); + column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "gicon", HW_ICON_COLUMN, + "sensitive", HW_SENSITIVE_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview), -1, + _("Name"), gtk_cell_renderer_text_new (), + card_to_text, NULL, NULL); + + return treeview; +} + +static GObject * +gvc_mixer_dialog_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerDialog *self; + GtkWidget *main_vbox; + GtkWidget *label; + GtkWidget *alignment; + GtkWidget *box; + GtkWidget *sbox; + GtkWidget *ebox; + GSList *streams; + GSList *cards; + GSList *l; + GvcMixerStream *stream; + GvcMixerCard *card; + GtkTreeSelection *selection; + + object = G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_DIALOG (object); + + main_vbox = GTK_WIDGET (self); + gtk_box_set_spacing (GTK_BOX (main_vbox), 2); + + gtk_container_set_border_width (GTK_CONTAINER (self), 6); + + self->priv->output_stream_box = gtk_hbox_new (FALSE, 12); + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 12, 0, 0, 0); + gtk_container_add (GTK_CONTAINER (alignment), self->priv->output_stream_box); + gtk_box_pack_start (GTK_BOX (main_vbox), + alignment, + FALSE, FALSE, 0); + self->priv->output_bar = create_bar (self, TRUE); + gvc_channel_bar_set_name (GVC_CHANNEL_BAR (self->priv->output_bar), + _("_Output volume: ")); + gtk_widget_set_sensitive (self->priv->output_bar, FALSE); + gtk_box_pack_start (GTK_BOX (self->priv->output_stream_box), + self->priv->output_bar, TRUE, TRUE, 12); + + self->priv->notebook = gtk_notebook_new (); + gtk_box_pack_start (GTK_BOX (main_vbox), + self->priv->notebook, + TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (self->priv->notebook), 5); + + /* Effects page */ + self->priv->sound_effects_box = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (self->priv->sound_effects_box), 12); + label = gtk_label_new (_("Sound Effects")); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + self->priv->sound_effects_box, + label); + + self->priv->effects_bar = create_bar (self, TRUE); + gvc_channel_bar_set_name (GVC_CHANNEL_BAR (self->priv->effects_bar), + _("_Alert volume: ")); + gtk_widget_set_sensitive (self->priv->effects_bar, FALSE); + gtk_box_pack_start (GTK_BOX (self->priv->sound_effects_box), + self->priv->effects_bar, FALSE, FALSE, 0); + + self->priv->sound_theme_chooser = gvc_sound_theme_chooser_new (); + gtk_box_pack_start (GTK_BOX (self->priv->sound_effects_box), + self->priv->sound_theme_chooser, + TRUE, TRUE, 6); + + /* Hardware page */ + self->priv->hw_box = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (self->priv->hw_box), 12); + label = gtk_label_new (_("Hardware")); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + self->priv->hw_box, + label); + + box = gtk_frame_new (_("C_hoose a device to configure:")); + label = gtk_frame_get_label_widget (GTK_FRAME (box)); + _gtk_label_make_bold (GTK_LABEL (label)); + gtk_label_set_use_underline (GTK_LABEL (label), TRUE); + gtk_frame_set_shadow_type (GTK_FRAME (box), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (self->priv->hw_box), box, TRUE, TRUE, 0); + + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_container_add (GTK_CONTAINER (box), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 0, 0); + + self->priv->hw_treeview = create_cards_treeview (self, + G_CALLBACK (on_card_selection_changed)); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), self->priv->hw_treeview); + + box = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (box), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (box), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (box), self->priv->hw_treeview); + gtk_container_add (GTK_CONTAINER (alignment), box); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->hw_treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + + box = gtk_frame_new (_("Settings for the selected device:")); + label = gtk_frame_get_label_widget (GTK_FRAME (box)); + _gtk_label_make_bold (GTK_LABEL (label)); + gtk_frame_set_shadow_type (GTK_FRAME (box), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (self->priv->hw_box), box, FALSE, TRUE, 12); + self->priv->hw_settings_box = gtk_vbox_new (FALSE, 12); + gtk_container_add (GTK_CONTAINER (box), self->priv->hw_settings_box); + + /* Input page */ + self->priv->input_box = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (self->priv->input_box), 12); + label = gtk_label_new (_("Input")); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + self->priv->input_box, + label); + + self->priv->input_bar = create_bar (self, TRUE); + gvc_channel_bar_set_name (GVC_CHANNEL_BAR (self->priv->input_bar), + _("_Input volume: ")); + gvc_channel_bar_set_low_icon_name (GVC_CHANNEL_BAR (self->priv->input_bar), + "audio-input-microphone-low"); + gvc_channel_bar_set_high_icon_name (GVC_CHANNEL_BAR (self->priv->input_bar), + "audio-input-microphone-high"); + gtk_widget_set_sensitive (self->priv->input_bar, FALSE); + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 0, 0); + gtk_container_add (GTK_CONTAINER (alignment), self->priv->input_bar); + gtk_box_pack_start (GTK_BOX (self->priv->input_box), + alignment, + FALSE, FALSE, 0); + + box = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (self->priv->input_box), + box, + FALSE, FALSE, 6); + + sbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), + sbox, + FALSE, FALSE, 0); + + label = gtk_label_new (_("Input level:")); + gtk_box_pack_start (GTK_BOX (sbox), + label, + FALSE, FALSE, 0); + gtk_size_group_add_widget (self->priv->size_group, sbox); + + self->priv->input_level_bar = gvc_level_bar_new (); + gvc_level_bar_set_orientation (GVC_LEVEL_BAR (self->priv->input_level_bar), + GTK_ORIENTATION_HORIZONTAL); + gvc_level_bar_set_scale (GVC_LEVEL_BAR (self->priv->input_level_bar), + GVC_LEVEL_SCALE_LINEAR); + gtk_box_pack_start (GTK_BOX (box), + self->priv->input_level_bar, + TRUE, TRUE, 6); + + ebox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), + ebox, + FALSE, FALSE, 0); + gtk_size_group_add_widget (self->priv->size_group, ebox); + + self->priv->input_settings_box = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (self->priv->input_box), + self->priv->input_settings_box, + FALSE, FALSE, 0); + + box = gtk_frame_new (_("C_hoose a device for sound input:")); + label = gtk_frame_get_label_widget (GTK_FRAME (box)); + _gtk_label_make_bold (GTK_LABEL (label)); + gtk_label_set_use_underline (GTK_LABEL (label), TRUE); + gtk_frame_set_shadow_type (GTK_FRAME (box), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (self->priv->input_box), box, TRUE, TRUE, 0); + + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_container_add (GTK_CONTAINER (box), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 0, 0); + + self->priv->input_treeview = create_stream_treeview (self, + G_CALLBACK (on_input_radio_toggled)); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), self->priv->input_treeview); + + box = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (box), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (box), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (box), self->priv->input_treeview); + gtk_container_add (GTK_CONTAINER (alignment), box); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->input_treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + + /* Output page */ + self->priv->output_box = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (self->priv->output_box), 12); + label = gtk_label_new (_("Output")); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + self->priv->output_box, + label); + + box = gtk_frame_new (_("C_hoose a device for sound output:")); + label = gtk_frame_get_label_widget (GTK_FRAME (box)); + _gtk_label_make_bold (GTK_LABEL (label)); + gtk_label_set_use_underline (GTK_LABEL (label), TRUE); + gtk_frame_set_shadow_type (GTK_FRAME (box), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (self->priv->output_box), box, TRUE, TRUE, 0); + + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_container_add (GTK_CONTAINER (box), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 0, 0); + + self->priv->output_treeview = create_stream_treeview (self, + G_CALLBACK (on_output_radio_toggled)); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), self->priv->output_treeview); + + box = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (box), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (box), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (box), self->priv->output_treeview); + gtk_container_add (GTK_CONTAINER (alignment), box); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->output_treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + + box = gtk_frame_new (_("Settings for the selected device:")); + label = gtk_frame_get_label_widget (GTK_FRAME (box)); + _gtk_label_make_bold (GTK_LABEL (label)); + gtk_frame_set_shadow_type (GTK_FRAME (box), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (self->priv->output_box), box, FALSE, FALSE, 12); + self->priv->output_settings_box = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (box), self->priv->output_settings_box); + + /* Applications */ + self->priv->applications_box = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (self->priv->applications_box), 12); + label = gtk_label_new (_("Applications")); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + self->priv->applications_box, + label); + self->priv->no_apps_label = gtk_label_new (_("No application is currently playing or recording audio.")); + gtk_box_pack_start (GTK_BOX (self->priv->applications_box), + self->priv->no_apps_label, + TRUE, TRUE, 0); + + g_signal_connect (self->priv->mixer_control, + "stream-added", + G_CALLBACK (on_control_stream_added), + self); + g_signal_connect (self->priv->mixer_control, + "stream-removed", + G_CALLBACK (on_control_stream_removed), + self); + g_signal_connect (self->priv->mixer_control, + "card-added", + G_CALLBACK (on_control_card_added), + self); + g_signal_connect (self->priv->mixer_control, + "card-removed", + G_CALLBACK (on_control_card_removed), + self); + + gtk_widget_show_all (main_vbox); + + streams = gvc_mixer_control_get_streams (self->priv->mixer_control); + for (l = streams; l != NULL; l = l->next) { + stream = l->data; + add_stream (self, stream); + } + g_slist_free (streams); + + cards = gvc_mixer_control_get_cards (self->priv->mixer_control); + for (l = cards; l != NULL; l = l->next) { + card = l->data; + add_card (self, card); + } + g_slist_free (cards); + + return object; +} + +static void +gvc_mixer_dialog_dispose (GObject *object) +{ + GvcMixerDialog *dialog = GVC_MIXER_DIALOG (object); + + if (dialog->priv->mixer_control != NULL) { + g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control, + on_control_stream_added, + dialog); + g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control, + on_control_stream_removed, + dialog); + g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control, + on_control_card_added, + dialog); + g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control, + on_control_card_removed, + dialog); + + g_object_unref (dialog->priv->mixer_control); + dialog->priv->mixer_control = NULL; + } + + if (dialog->priv->bars != NULL) { + g_hash_table_destroy (dialog->priv->bars); + dialog->priv->bars = NULL; + } + + G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->dispose (object); +} + +static void +gvc_mixer_dialog_class_init (GvcMixerDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_mixer_dialog_constructor; + object_class->dispose = gvc_mixer_dialog_dispose; + object_class->finalize = gvc_mixer_dialog_finalize; + object_class->set_property = gvc_mixer_dialog_set_property; + object_class->get_property = gvc_mixer_dialog_get_property; + + g_object_class_install_property (object_class, + PROP_MIXER_CONTROL, + g_param_spec_object ("mixer-control", + "mixer control", + "mixer control", + GVC_TYPE_MIXER_CONTROL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_type_class_add_private (klass, sizeof (GvcMixerDialogPrivate)); +} + + +static void +gvc_mixer_dialog_init (GvcMixerDialog *dialog) +{ + dialog->priv = GVC_MIXER_DIALOG_GET_PRIVATE (dialog); + dialog->priv->bars = g_hash_table_new (NULL, NULL); + dialog->priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); +} + +static void +gvc_mixer_dialog_finalize (GObject *object) +{ + GvcMixerDialog *mixer_dialog; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_DIALOG (object)); + + mixer_dialog = GVC_MIXER_DIALOG (object); + + g_return_if_fail (mixer_dialog->priv != NULL); + G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->finalize (object); +} + +GvcMixerDialog * +gvc_mixer_dialog_new (GvcMixerControl *control) +{ + GObject *dialog; + dialog = g_object_new (GVC_TYPE_MIXER_DIALOG, + "mixer-control", control, + NULL); + return GVC_MIXER_DIALOG (dialog); +} + +enum { + PAGE_EVENTS, + PAGE_HARDWARE, + PAGE_INPUT, + PAGE_OUTPUT, + PAGE_APPLICATIONS +}; + +gboolean +gvc_mixer_dialog_set_page (GvcMixerDialog *self, + const char *page) +{ + guint num; + + g_return_val_if_fail (self != NULL, FALSE); + + if (page == NULL) + num = 0; + else if (g_str_equal (page, "effects")) + num = PAGE_EVENTS; + else if (g_str_equal (page, "hardware")) + num = PAGE_HARDWARE; + else if (g_str_equal (page, "input")) + num = PAGE_INPUT; + else if (g_str_equal (page, "output")) + num = PAGE_OUTPUT; + else if (g_str_equal (page, "applications")) + num = PAGE_APPLICATIONS; + else + num = 0; + + gtk_notebook_set_current_page (GTK_NOTEBOOK (self->priv->notebook), num); + + return TRUE; +} diff --git a/panels/sound/gvc-mixer-dialog.h b/panels/sound/gvc-mixer-dialog.h new file mode 100644 index 000000000..e95a7c7b7 --- /dev/null +++ b/panels/sound/gvc-mixer-dialog.h @@ -0,0 +1,56 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_DIALOG_H +#define __GVC_MIXER_DIALOG_H + +#include <glib-object.h> +#include "gvc-mixer-control.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_DIALOG (gvc_mixer_dialog_get_type ()) +#define GVC_MIXER_DIALOG(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_DIALOG, GvcMixerDialog)) +#define GVC_MIXER_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_DIALOG, GvcMixerDialogClass)) +#define GVC_IS_MIXER_DIALOG(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_DIALOG)) +#define GVC_IS_MIXER_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_DIALOG)) +#define GVC_MIXER_DIALOG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_DIALOG, GvcMixerDialogClass)) + +typedef struct GvcMixerDialogPrivate GvcMixerDialogPrivate; + +typedef struct +{ + GtkVBox parent; + GvcMixerDialogPrivate *priv; +} GvcMixerDialog; + +typedef struct +{ + GtkVBoxClass parent_class; +} GvcMixerDialogClass; + +GType gvc_mixer_dialog_get_type (void); + +GvcMixerDialog * gvc_mixer_dialog_new (GvcMixerControl *control); +gboolean gvc_mixer_dialog_set_page (GvcMixerDialog *dialog, const gchar* page); + +G_END_DECLS + +#endif /* __GVC_MIXER_DIALOG_H */ diff --git a/panels/sound/gvc-mixer-event-role.c b/panels/sound/gvc-mixer-event-role.c new file mode 100644 index 000000000..7eb3d00d7 --- /dev/null +++ b/panels/sound/gvc-mixer-event-role.c @@ -0,0 +1,250 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> +#include <pulse/ext-stream-restore.h> + +#include "gvc-mixer-event-role.h" +#include "gvc-mixer-stream-private.h" +#include "gvc-channel-map-private.h" + +#define GVC_MIXER_EVENT_ROLE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_EVENT_ROLE, GvcMixerEventRolePrivate)) + +struct GvcMixerEventRolePrivate +{ + char *device; +}; + +enum +{ + PROP_0, + PROP_DEVICE +}; + +static void gvc_mixer_event_role_class_init (GvcMixerEventRoleClass *klass); +static void gvc_mixer_event_role_init (GvcMixerEventRole *mixer_event_role); +static void gvc_mixer_event_role_finalize (GObject *object); + +G_DEFINE_TYPE (GvcMixerEventRole, gvc_mixer_event_role, GVC_TYPE_MIXER_STREAM) + +static gboolean +update_settings (GvcMixerEventRole *role, + gboolean is_muted, + gpointer *op) +{ + pa_operation *o; + guint index; + const GvcChannelMap *map; + pa_context *context; + pa_ext_stream_restore_info info; + + index = gvc_mixer_stream_get_index (GVC_MIXER_STREAM (role)); + + map = gvc_mixer_stream_get_channel_map (GVC_MIXER_STREAM(role)); + + info.volume = *gvc_channel_map_get_cvolume(map); + info.name = "sink-input-by-media-role:event"; + info.channel_map = *gvc_channel_map_get_pa_channel_map(map); + info.device = role->priv->device; + info.mute = is_muted; + + context = gvc_mixer_stream_get_pa_context (GVC_MIXER_STREAM (role)); + + o = pa_ext_stream_restore_write (context, + PA_UPDATE_REPLACE, + &info, + 1, + TRUE, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_ext_stream_restore_write() failed"); + return FALSE; + } + + if (op != NULL) + *op = o; + + return TRUE; +} + +static gboolean +gvc_mixer_event_role_push_volume (GvcMixerStream *stream, gpointer *op) +{ + return update_settings (GVC_MIXER_EVENT_ROLE (stream), + gvc_mixer_stream_get_is_muted (stream), op); +} + +static gboolean +gvc_mixer_event_role_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + return update_settings (GVC_MIXER_EVENT_ROLE (stream), + is_muted, NULL); +} + +static gboolean +gvc_mixer_event_role_set_device (GvcMixerEventRole *role, + const char *device) +{ + g_return_val_if_fail (GVC_IS_MIXER_EVENT_ROLE (role), FALSE); + + g_free (role->priv->device); + role->priv->device = g_strdup (device); + g_object_notify (G_OBJECT (role), "device"); + + return TRUE; +} + +static void +gvc_mixer_event_role_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcMixerEventRole *self = GVC_MIXER_EVENT_ROLE (object); + + switch (prop_id) { + case PROP_DEVICE: + gvc_mixer_event_role_set_device (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_mixer_event_role_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcMixerEventRole *self = GVC_MIXER_EVENT_ROLE (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, self->priv->device); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GObject * +gvc_mixer_event_role_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerEventRole *self; + + object = G_OBJECT_CLASS (gvc_mixer_event_role_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_EVENT_ROLE (object); + + return object; +} + +static void +gvc_mixer_event_role_class_init (GvcMixerEventRoleClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); + + object_class->constructor = gvc_mixer_event_role_constructor; + object_class->finalize = gvc_mixer_event_role_finalize; + object_class->set_property = gvc_mixer_event_role_set_property; + object_class->get_property = gvc_mixer_event_role_get_property; + + stream_class->push_volume = gvc_mixer_event_role_push_volume; + stream_class->change_is_muted = gvc_mixer_event_role_change_is_muted; + + g_object_class_install_property (object_class, + PROP_DEVICE, + g_param_spec_string ("device", + "Device", + "Device", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_type_class_add_private (klass, sizeof (GvcMixerEventRolePrivate)); +} + +static void +gvc_mixer_event_role_init (GvcMixerEventRole *event_role) +{ + event_role->priv = GVC_MIXER_EVENT_ROLE_GET_PRIVATE (event_role); + +} + +static void +gvc_mixer_event_role_finalize (GObject *object) +{ + GvcMixerEventRole *mixer_event_role; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_EVENT_ROLE (object)); + + mixer_event_role = GVC_MIXER_EVENT_ROLE (object); + + g_return_if_fail (mixer_event_role->priv != NULL); + + g_free (mixer_event_role->priv->device); + + G_OBJECT_CLASS (gvc_mixer_event_role_parent_class)->finalize (object); +} + +/** + * gvc_mixer_event_role_new: (skip) + * + * @context: + * @index: + * @channel_map: + * + * Returns: + */ +GvcMixerStream * +gvc_mixer_event_role_new (pa_context *context, + const char *device, + GvcChannelMap *channel_map) +{ + GObject *object; + + object = g_object_new (GVC_TYPE_MIXER_EVENT_ROLE, + "pa-context", context, + "index", 0, + "device", device, + "channel-map", channel_map, + NULL); + + return GVC_MIXER_STREAM (object); +} diff --git a/panels/sound/gvc-mixer-event-role.h b/panels/sound/gvc-mixer-event-role.h new file mode 100644 index 000000000..ab4c509e5 --- /dev/null +++ b/panels/sound/gvc-mixer-event-role.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_EVENT_ROLE_H +#define __GVC_MIXER_EVENT_ROLE_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_EVENT_ROLE (gvc_mixer_event_role_get_type ()) +#define GVC_MIXER_EVENT_ROLE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_EVENT_ROLE, GvcMixerEventRole)) +#define GVC_MIXER_EVENT_ROLE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_EVENT_ROLE, GvcMixerEventRoleClass)) +#define GVC_IS_MIXER_EVENT_ROLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_EVENT_ROLE)) +#define GVC_IS_MIXER_EVENT_ROLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_EVENT_ROLE)) +#define GVC_MIXER_EVENT_ROLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_EVENT_ROLE, GvcMixerEventRoleClass)) + +typedef struct GvcMixerEventRolePrivate GvcMixerEventRolePrivate; + +typedef struct +{ + GvcMixerStream parent; + GvcMixerEventRolePrivate *priv; +} GvcMixerEventRole; + +typedef struct +{ + GvcMixerStreamClass parent_class; +} GvcMixerEventRoleClass; + +GType gvc_mixer_event_role_get_type (void); + +GvcMixerStream * gvc_mixer_event_role_new (pa_context *context, + const char *device, + GvcChannelMap *channel_map); + +G_END_DECLS + +#endif /* __GVC_MIXER_EVENT_ROLE_H */ diff --git a/panels/sound/gvc-mixer-sink-input.c b/panels/sound/gvc-mixer-sink-input.c new file mode 100644 index 000000000..9429eca0a --- /dev/null +++ b/panels/sound/gvc-mixer-sink-input.c @@ -0,0 +1,199 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-sink-input.h" +#include "gvc-mixer-stream-private.h" +#include "gvc-channel-map-private.h" + +#define GVC_MIXER_SINK_INPUT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SINK_INPUT, GvcMixerSinkInputPrivate)) + +struct GvcMixerSinkInputPrivate +{ + gpointer dummy; +}; + +static void gvc_mixer_sink_input_class_init (GvcMixerSinkInputClass *klass); +static void gvc_mixer_sink_input_init (GvcMixerSinkInput *mixer_sink_input); +static void gvc_mixer_sink_input_finalize (GObject *object); +static void gvc_mixer_sink_input_dispose (GObject *object); + +G_DEFINE_TYPE (GvcMixerSinkInput, gvc_mixer_sink_input, GVC_TYPE_MIXER_STREAM) + +static gboolean +gvc_mixer_sink_input_push_volume (GvcMixerStream *stream, gpointer *op) +{ + pa_operation *o; + guint index; + const GvcChannelMap *map; + pa_context *context; + const pa_cvolume *cv; + guint num_channels; + + index = gvc_mixer_stream_get_index (stream); + + map = gvc_mixer_stream_get_channel_map (stream); + num_channels = gvc_channel_map_get_num_channels (map); + + cv = gvc_channel_map_get_cvolume(map); + + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_sink_input_volume (context, + index, + cv, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_sink_input_volume() failed"); + return FALSE; + } + + *op = o; + + return TRUE; +} + +static gboolean +gvc_mixer_sink_input_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + pa_operation *o; + guint index; + pa_context *context; + + index = gvc_mixer_stream_get_index (stream); + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_sink_input_mute (context, + index, + is_muted, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_sink_input_mute_by_index() failed"); + return FALSE; + } + + pa_operation_unref(o); + + return TRUE; +} + +static GObject * +gvc_mixer_sink_input_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerSinkInput *self; + + object = G_OBJECT_CLASS (gvc_mixer_sink_input_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_SINK_INPUT (object); + + return object; +} + +static void +gvc_mixer_sink_input_class_init (GvcMixerSinkInputClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); + + object_class->constructor = gvc_mixer_sink_input_constructor; + object_class->dispose = gvc_mixer_sink_input_dispose; + object_class->finalize = gvc_mixer_sink_input_finalize; + + stream_class->push_volume = gvc_mixer_sink_input_push_volume; + stream_class->change_is_muted = gvc_mixer_sink_input_change_is_muted; + + g_type_class_add_private (klass, sizeof (GvcMixerSinkInputPrivate)); +} + +static void +gvc_mixer_sink_input_init (GvcMixerSinkInput *sink_input) +{ + sink_input->priv = GVC_MIXER_SINK_INPUT_GET_PRIVATE (sink_input); +} + +static void +gvc_mixer_sink_input_dispose (GObject *object) +{ + GvcMixerSinkInput *mixer_sink_input; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SINK_INPUT (object)); + + mixer_sink_input = GVC_MIXER_SINK_INPUT (object); + + G_OBJECT_CLASS (gvc_mixer_sink_input_parent_class)->dispose (object); +} + +static void +gvc_mixer_sink_input_finalize (GObject *object) +{ + GvcMixerSinkInput *mixer_sink_input; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SINK_INPUT (object)); + + mixer_sink_input = GVC_MIXER_SINK_INPUT (object); + + g_return_if_fail (mixer_sink_input->priv != NULL); + G_OBJECT_CLASS (gvc_mixer_sink_input_parent_class)->finalize (object); +} + +/** + * gvc_mixer_sink_input_new: (skip) + * + * @context: + * @index: + * @channel_map: + * + * Returns: + */ +GvcMixerStream * +gvc_mixer_sink_input_new (pa_context *context, + guint index, + GvcChannelMap *channel_map) +{ + GObject *object; + + object = g_object_new (GVC_TYPE_MIXER_SINK_INPUT, + "pa-context", context, + "index", index, + "channel-map", channel_map, + NULL); + + return GVC_MIXER_STREAM (object); +} diff --git a/panels/sound/gvc-mixer-sink-input.h b/panels/sound/gvc-mixer-sink-input.h new file mode 100644 index 000000000..8a4b71454 --- /dev/null +++ b/panels/sound/gvc-mixer-sink-input.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_SINK_INPUT_H +#define __GVC_MIXER_SINK_INPUT_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_SINK_INPUT (gvc_mixer_sink_input_get_type ()) +#define GVC_MIXER_SINK_INPUT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_SINK_INPUT, GvcMixerSinkInput)) +#define GVC_MIXER_SINK_INPUT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_SINK_INPUT, GvcMixerSinkInputClass)) +#define GVC_IS_MIXER_SINK_INPUT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_SINK_INPUT)) +#define GVC_IS_MIXER_SINK_INPUT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_SINK_INPUT)) +#define GVC_MIXER_SINK_INPUT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_SINK_INPUT, GvcMixerSinkInputClass)) + +typedef struct GvcMixerSinkInputPrivate GvcMixerSinkInputPrivate; + +typedef struct +{ + GvcMixerStream parent; + GvcMixerSinkInputPrivate *priv; +} GvcMixerSinkInput; + +typedef struct +{ + GvcMixerStreamClass parent_class; +} GvcMixerSinkInputClass; + +GType gvc_mixer_sink_input_get_type (void); + +GvcMixerStream * gvc_mixer_sink_input_new (pa_context *context, + guint index, + GvcChannelMap *map); + +G_END_DECLS + +#endif /* __GVC_MIXER_SINK_INPUT_H */ diff --git a/panels/sound/gvc-mixer-sink.c b/panels/sound/gvc-mixer-sink.c new file mode 100644 index 000000000..30fceac4d --- /dev/null +++ b/panels/sound/gvc-mixer-sink.c @@ -0,0 +1,231 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-sink.h" +#include "gvc-mixer-stream-private.h" +#include "gvc-channel-map-private.h" + +#define GVC_MIXER_SINK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SINK, GvcMixerSinkPrivate)) + +struct GvcMixerSinkPrivate +{ + gpointer dummy; +}; + +static void gvc_mixer_sink_class_init (GvcMixerSinkClass *klass); +static void gvc_mixer_sink_init (GvcMixerSink *mixer_sink); +static void gvc_mixer_sink_finalize (GObject *object); +static void gvc_mixer_sink_dispose (GObject *object); + +G_DEFINE_TYPE (GvcMixerSink, gvc_mixer_sink, GVC_TYPE_MIXER_STREAM) + +static gboolean +gvc_mixer_sink_push_volume (GvcMixerStream *stream, gpointer *op) +{ + pa_operation *o; + guint index; + const GvcChannelMap *map; + pa_context *context; + const pa_cvolume *cv; + + index = gvc_mixer_stream_get_index (stream); + + map = gvc_mixer_stream_get_channel_map (stream); + + /* set the volume */ + cv = gvc_channel_map_get_cvolume(map); + + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_sink_volume_by_index (context, + index, + cv, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_sink_volume_by_index() failed: %s", pa_strerror(pa_context_errno(context))); + return FALSE; + } + + *op = o; + + return TRUE; +} + +static gboolean +gvc_mixer_sink_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + pa_operation *o; + guint index; + pa_context *context; + + index = gvc_mixer_stream_get_index (stream); + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_sink_mute_by_index (context, + index, + is_muted, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_sink_mute_by_index() failed: %s", pa_strerror(pa_context_errno(context))); + return FALSE; + } + + pa_operation_unref(o); + + return TRUE; +} + +static gboolean +gvc_mixer_sink_change_port (GvcMixerStream *stream, + const char *port) +{ +#if PA_MICRO > 15 + pa_operation *o; + guint index; + pa_context *context; + + index = gvc_mixer_stream_get_index (stream); + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_sink_port_by_index (context, + index, + port, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_sink_port_by_index() failed: %s", pa_strerror(pa_context_errno(context))); + return FALSE; + } + + pa_operation_unref(o); + + return TRUE; +#else + return FALSE; +#endif /* PA_MICRO > 15 */ +} + +static GObject * +gvc_mixer_sink_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerSink *self; + + object = G_OBJECT_CLASS (gvc_mixer_sink_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_SINK (object); + + return object; +} + +static void +gvc_mixer_sink_class_init (GvcMixerSinkClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); + + object_class->constructor = gvc_mixer_sink_constructor; + object_class->dispose = gvc_mixer_sink_dispose; + object_class->finalize = gvc_mixer_sink_finalize; + + stream_class->push_volume = gvc_mixer_sink_push_volume; + stream_class->change_port = gvc_mixer_sink_change_port; + stream_class->change_is_muted = gvc_mixer_sink_change_is_muted; + + g_type_class_add_private (klass, sizeof (GvcMixerSinkPrivate)); +} + +static void +gvc_mixer_sink_init (GvcMixerSink *sink) +{ + sink->priv = GVC_MIXER_SINK_GET_PRIVATE (sink); +} + +static void +gvc_mixer_sink_dispose (GObject *object) +{ + GvcMixerSink *mixer_sink; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SINK (object)); + + mixer_sink = GVC_MIXER_SINK (object); + + G_OBJECT_CLASS (gvc_mixer_sink_parent_class)->dispose (object); +} + +static void +gvc_mixer_sink_finalize (GObject *object) +{ + GvcMixerSink *mixer_sink; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SINK (object)); + + mixer_sink = GVC_MIXER_SINK (object); + + g_return_if_fail (mixer_sink->priv != NULL); + G_OBJECT_CLASS (gvc_mixer_sink_parent_class)->finalize (object); +} + +/** + * gvc_mixer_sink_new: (skip) + * + * @context: + * @index: + * @channel_map: + * + * Returns: + */ +GvcMixerStream * +gvc_mixer_sink_new (pa_context *context, + guint index, + GvcChannelMap *channel_map) + +{ + GObject *object; + + object = g_object_new (GVC_TYPE_MIXER_SINK, + "pa-context", context, + "index", index, + "channel-map", channel_map, + NULL); + + return GVC_MIXER_STREAM (object); +} diff --git a/panels/sound/gvc-mixer-sink.h b/panels/sound/gvc-mixer-sink.h new file mode 100644 index 000000000..2a4a4badb --- /dev/null +++ b/panels/sound/gvc-mixer-sink.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_SINK_H +#define __GVC_MIXER_SINK_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_SINK (gvc_mixer_sink_get_type ()) +#define GVC_MIXER_SINK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_SINK, GvcMixerSink)) +#define GVC_MIXER_SINK_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_SINK, GvcMixerSinkClass)) +#define GVC_IS_MIXER_SINK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_SINK)) +#define GVC_IS_MIXER_SINK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_SINK)) +#define GVC_MIXER_SINK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_SINK, GvcMixerSinkClass)) + +typedef struct GvcMixerSinkPrivate GvcMixerSinkPrivate; + +typedef struct +{ + GvcMixerStream parent; + GvcMixerSinkPrivate *priv; +} GvcMixerSink; + +typedef struct +{ + GvcMixerStreamClass parent_class; +} GvcMixerSinkClass; + +GType gvc_mixer_sink_get_type (void); + +GvcMixerStream * gvc_mixer_sink_new (pa_context *context, + guint index, + GvcChannelMap *map); + +G_END_DECLS + +#endif /* __GVC_MIXER_SINK_H */ diff --git a/panels/sound/gvc-mixer-source-output.c b/panels/sound/gvc-mixer-source-output.c new file mode 100644 index 000000000..636fc2ea7 --- /dev/null +++ b/panels/sound/gvc-mixer-source-output.c @@ -0,0 +1,137 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-source-output.h" + +#define GVC_MIXER_SOURCE_OUTPUT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SOURCE_OUTPUT, GvcMixerSourceOutputPrivate)) + +struct GvcMixerSourceOutputPrivate +{ + gpointer dummy; +}; + +static void gvc_mixer_source_output_class_init (GvcMixerSourceOutputClass *klass); +static void gvc_mixer_source_output_init (GvcMixerSourceOutput *mixer_source_output); +static void gvc_mixer_source_output_finalize (GObject *object); + +G_DEFINE_TYPE (GvcMixerSourceOutput, gvc_mixer_source_output, GVC_TYPE_MIXER_STREAM) + +static gboolean +gvc_mixer_source_output_push_volume (GvcMixerStream *stream, gpointer *op) +{ + /* FIXME: */ + *op = NULL; + return TRUE; +} + +static gboolean +gvc_mixer_source_output_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + /* FIXME: */ + return TRUE; +} + +static GObject * +gvc_mixer_source_output_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerSourceOutput *self; + + object = G_OBJECT_CLASS (gvc_mixer_source_output_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_SOURCE_OUTPUT (object); + + return object; +} + +static void +gvc_mixer_source_output_class_init (GvcMixerSourceOutputClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); + + object_class->constructor = gvc_mixer_source_output_constructor; + object_class->finalize = gvc_mixer_source_output_finalize; + + stream_class->push_volume = gvc_mixer_source_output_push_volume; + stream_class->change_is_muted = gvc_mixer_source_output_change_is_muted; + + g_type_class_add_private (klass, sizeof (GvcMixerSourceOutputPrivate)); +} + +static void +gvc_mixer_source_output_init (GvcMixerSourceOutput *source_output) +{ + source_output->priv = GVC_MIXER_SOURCE_OUTPUT_GET_PRIVATE (source_output); + +} + +static void +gvc_mixer_source_output_finalize (GObject *object) +{ + GvcMixerSourceOutput *mixer_source_output; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SOURCE_OUTPUT (object)); + + mixer_source_output = GVC_MIXER_SOURCE_OUTPUT (object); + + g_return_if_fail (mixer_source_output->priv != NULL); + G_OBJECT_CLASS (gvc_mixer_source_output_parent_class)->finalize (object); +} + +/** + * gvc_mixer_source_output_new: (skip) + * + * @context: + * @index: + * @channel_map: + * + * Returns: + */ +GvcMixerStream * +gvc_mixer_source_output_new (pa_context *context, + guint index, + GvcChannelMap *channel_map) +{ + GObject *object; + + object = g_object_new (GVC_TYPE_MIXER_SOURCE_OUTPUT, + "pa-context", context, + "index", index, + "channel-map", channel_map, + NULL); + + return GVC_MIXER_STREAM (object); +} diff --git a/panels/sound/gvc-mixer-source-output.h b/panels/sound/gvc-mixer-source-output.h new file mode 100644 index 000000000..2283e3b67 --- /dev/null +++ b/panels/sound/gvc-mixer-source-output.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_SOURCE_OUTPUT_H +#define __GVC_MIXER_SOURCE_OUTPUT_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_SOURCE_OUTPUT (gvc_mixer_source_output_get_type ()) +#define GVC_MIXER_SOURCE_OUTPUT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_SOURCE_OUTPUT, GvcMixerSourceOutput)) +#define GVC_MIXER_SOURCE_OUTPUT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_SOURCE_OUTPUT, GvcMixerSourceOutputClass)) +#define GVC_IS_MIXER_SOURCE_OUTPUT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_SOURCE_OUTPUT)) +#define GVC_IS_MIXER_SOURCE_OUTPUT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_SOURCE_OUTPUT)) +#define GVC_MIXER_SOURCE_OUTPUT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_SOURCE_OUTPUT, GvcMixerSourceOutputClass)) + +typedef struct GvcMixerSourceOutputPrivate GvcMixerSourceOutputPrivate; + +typedef struct +{ + GvcMixerStream parent; + GvcMixerSourceOutputPrivate *priv; +} GvcMixerSourceOutput; + +typedef struct +{ + GvcMixerStreamClass parent_class; +} GvcMixerSourceOutputClass; + +GType gvc_mixer_source_output_get_type (void); + +GvcMixerStream * gvc_mixer_source_output_new (pa_context *context, + guint index, + GvcChannelMap *map); + +G_END_DECLS + +#endif /* __GVC_MIXER_SOURCE_OUTPUT_H */ diff --git a/panels/sound/gvc-mixer-source.c b/panels/sound/gvc-mixer-source.c new file mode 100644 index 000000000..46d640380 --- /dev/null +++ b/panels/sound/gvc-mixer-source.c @@ -0,0 +1,231 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-source.h" +#include "gvc-mixer-stream-private.h" +#include "gvc-channel-map-private.h" + +#define GVC_MIXER_SOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SOURCE, GvcMixerSourcePrivate)) + +struct GvcMixerSourcePrivate +{ + gpointer dummy; +}; + +static void gvc_mixer_source_class_init (GvcMixerSourceClass *klass); +static void gvc_mixer_source_init (GvcMixerSource *mixer_source); +static void gvc_mixer_source_finalize (GObject *object); +static void gvc_mixer_source_dispose (GObject *object); + +G_DEFINE_TYPE (GvcMixerSource, gvc_mixer_source, GVC_TYPE_MIXER_STREAM) + +static gboolean +gvc_mixer_source_push_volume (GvcMixerStream *stream, gpointer *op) +{ + pa_operation *o; + guint index; + const GvcChannelMap *map; + pa_context *context; + const pa_cvolume *cv; + + index = gvc_mixer_stream_get_index (stream); + + map = gvc_mixer_stream_get_channel_map (stream); + + /* set the volume */ + cv = gvc_channel_map_get_cvolume (map); + + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_source_volume_by_index (context, + index, + cv, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_source_volume_by_index() failed: %s", pa_strerror(pa_context_errno(context))); + return FALSE; + } + + *op = o; + + return TRUE; +} + +static gboolean +gvc_mixer_source_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + pa_operation *o; + guint index; + pa_context *context; + + index = gvc_mixer_stream_get_index (stream); + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_source_mute_by_index (context, + index, + is_muted, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_source_mute_by_index() failed: %s", pa_strerror(pa_context_errno(context))); + return FALSE; + } + + pa_operation_unref(o); + + return TRUE; +} + +static gboolean +gvc_mixer_source_change_port (GvcMixerStream *stream, + const char *port) +{ +#if PA_MICRO > 15 + pa_operation *o; + guint index; + pa_context *context; + + index = gvc_mixer_stream_get_index (stream); + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_source_port_by_index (context, + index, + port, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_source_port_by_index() failed: %s", pa_strerror(pa_context_errno(context))); + return FALSE; + } + + pa_operation_unref(o); + + return TRUE; +#else + return FALSE; +#endif /* PA_MICRO > 15 */ +} + +static GObject * +gvc_mixer_source_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerSource *self; + + object = G_OBJECT_CLASS (gvc_mixer_source_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_SOURCE (object); + + return object; +} + +static void +gvc_mixer_source_class_init (GvcMixerSourceClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); + + object_class->constructor = gvc_mixer_source_constructor; + object_class->dispose = gvc_mixer_source_dispose; + object_class->finalize = gvc_mixer_source_finalize; + + stream_class->push_volume = gvc_mixer_source_push_volume; + stream_class->change_is_muted = gvc_mixer_source_change_is_muted; + stream_class->change_port = gvc_mixer_source_change_port; + + g_type_class_add_private (klass, sizeof (GvcMixerSourcePrivate)); +} + +static void +gvc_mixer_source_init (GvcMixerSource *source) +{ + source->priv = GVC_MIXER_SOURCE_GET_PRIVATE (source); +} + +static void +gvc_mixer_source_dispose (GObject *object) +{ + GvcMixerSource *mixer_source; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SOURCE (object)); + + mixer_source = GVC_MIXER_SOURCE (object); + + G_OBJECT_CLASS (gvc_mixer_source_parent_class)->dispose (object); +} + +static void +gvc_mixer_source_finalize (GObject *object) +{ + GvcMixerSource *mixer_source; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_SOURCE (object)); + + mixer_source = GVC_MIXER_SOURCE (object); + + g_return_if_fail (mixer_source->priv != NULL); + G_OBJECT_CLASS (gvc_mixer_source_parent_class)->finalize (object); +} + +/** + * gvc_mixer_source_new: (skip) + * + * @context: + * @index: + * @channel_map: + * + * Returns: + */ +GvcMixerStream * +gvc_mixer_source_new (pa_context *context, + guint index, + GvcChannelMap *channel_map) + +{ + GObject *object; + + object = g_object_new (GVC_TYPE_MIXER_SOURCE, + "pa-context", context, + "index", index, + "channel-map", channel_map, + NULL); + + return GVC_MIXER_STREAM (object); +} diff --git a/panels/sound/gvc-mixer-source.h b/panels/sound/gvc-mixer-source.h new file mode 100644 index 000000000..503f1b54d --- /dev/null +++ b/panels/sound/gvc-mixer-source.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_SOURCE_H +#define __GVC_MIXER_SOURCE_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_SOURCE (gvc_mixer_source_get_type ()) +#define GVC_MIXER_SOURCE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_SOURCE, GvcMixerSource)) +#define GVC_MIXER_SOURCE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_SOURCE, GvcMixerSourceClass)) +#define GVC_IS_MIXER_SOURCE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_SOURCE)) +#define GVC_IS_MIXER_SOURCE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_SOURCE)) +#define GVC_MIXER_SOURCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_SOURCE, GvcMixerSourceClass)) + +typedef struct GvcMixerSourcePrivate GvcMixerSourcePrivate; + +typedef struct +{ + GvcMixerStream parent; + GvcMixerSourcePrivate *priv; +} GvcMixerSource; + +typedef struct +{ + GvcMixerStreamClass parent_class; +} GvcMixerSourceClass; + +GType gvc_mixer_source_get_type (void); + +GvcMixerStream * gvc_mixer_source_new (pa_context *context, + guint index, + GvcChannelMap *map); + +G_END_DECLS + +#endif /* __GVC_MIXER_SOURCE_H */ diff --git a/panels/sound/gvc-mixer-stream-private.h b/panels/sound/gvc-mixer-stream-private.h new file mode 100644 index 000000000..b97ecf5e1 --- /dev/null +++ b/panels/sound/gvc-mixer-stream-private.h @@ -0,0 +1,34 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_STREAM_PRIVATE_H +#define __GVC_MIXER_STREAM_PRIVATE_H + +#include <glib-object.h> + +#include "gvc-channel-map.h" + +G_BEGIN_DECLS + +pa_context * gvc_mixer_stream_get_pa_context (GvcMixerStream *stream); + +G_END_DECLS + +#endif /* __GVC_MIXER_STREAM_PRIVATE_H */ diff --git a/panels/sound/gvc-mixer-stream.c b/panels/sound/gvc-mixer-stream.c new file mode 100644 index 000000000..3b4953aa0 --- /dev/null +++ b/panels/sound/gvc-mixer-stream.c @@ -0,0 +1,944 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> + +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-stream.h" +#include "gvc-mixer-stream-private.h" +#include "gvc-channel-map-private.h" + +#define GVC_MIXER_STREAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_STREAM, GvcMixerStreamPrivate)) + +static guint32 stream_serial = 1; + +struct GvcMixerStreamPrivate +{ + pa_context *pa_context; + guint id; + guint index; + gint card_index; + GvcChannelMap *channel_map; + char *name; + char *description; + char *application_id; + char *icon_name; + gboolean is_muted; + gboolean can_decibel; + gboolean is_event_stream; + gboolean is_virtual; + pa_volume_t base_volume; + pa_operation *change_volume_op; + char *port; + char *human_port; + GList *ports; +}; + +enum +{ + PROP_0, + PROP_ID, + PROP_PA_CONTEXT, + PROP_CHANNEL_MAP, + PROP_INDEX, + PROP_NAME, + PROP_DESCRIPTION, + PROP_APPLICATION_ID, + PROP_ICON_NAME, + PROP_VOLUME, + PROP_DECIBEL, + PROP_IS_MUTED, + PROP_CAN_DECIBEL, + PROP_IS_EVENT_STREAM, + PROP_IS_VIRTUAL, + PROP_CARD_INDEX, + PROP_PORT, +}; + +static void gvc_mixer_stream_class_init (GvcMixerStreamClass *klass); +static void gvc_mixer_stream_init (GvcMixerStream *mixer_stream); +static void gvc_mixer_stream_finalize (GObject *object); + +G_DEFINE_ABSTRACT_TYPE (GvcMixerStream, gvc_mixer_stream, G_TYPE_OBJECT) + +static guint32 +get_next_stream_serial (void) +{ + guint32 serial; + + serial = stream_serial++; + + if ((gint32)stream_serial < 0) { + stream_serial = 1; + } + + return serial; +} + +pa_context * +gvc_mixer_stream_get_pa_context (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0); + return stream->priv->pa_context; +} + +guint +gvc_mixer_stream_get_index (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0); + return stream->priv->index; +} + +guint +gvc_mixer_stream_get_id (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0); + return stream->priv->id; +} + +const GvcChannelMap * +gvc_mixer_stream_get_channel_map (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + return stream->priv->channel_map; +} + +/** + * gvc_mixer_stream_get_volume: + * + * @stream: + * + * Returns: (type guint32) (transfer none): + */ +pa_volume_t +gvc_mixer_stream_get_volume (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0); + + return (pa_volume_t) gvc_channel_map_get_volume(stream->priv->channel_map)[VOLUME]; +} + +gdouble +gvc_mixer_stream_get_decibel (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0); + + return pa_sw_volume_to_dB( + (pa_volume_t) gvc_channel_map_get_volume(stream->priv->channel_map)[VOLUME]); +} + +/** + * gvc_mixer_stream_set_volume: + * + * @stream: + * @volume: (type guint32): + * + * Returns: + */ +gboolean +gvc_mixer_stream_set_volume (GvcMixerStream *stream, + pa_volume_t volume) +{ + pa_cvolume cv; + + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + cv = *gvc_channel_map_get_cvolume(stream->priv->channel_map); + pa_cvolume_scale(&cv, volume); + + if (!pa_cvolume_equal(gvc_channel_map_get_cvolume(stream->priv->channel_map), &cv)) { + gvc_channel_map_volume_changed(stream->priv->channel_map, &cv, FALSE); + g_object_notify (G_OBJECT (stream), "volume"); + return TRUE; + } + + return FALSE; +} + +gboolean +gvc_mixer_stream_set_decibel (GvcMixerStream *stream, + gdouble db) +{ + pa_cvolume cv; + + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + cv = *gvc_channel_map_get_cvolume(stream->priv->channel_map); + pa_cvolume_scale(&cv, pa_sw_volume_from_dB(db)); + + if (!pa_cvolume_equal(gvc_channel_map_get_cvolume(stream->priv->channel_map), &cv)) { + gvc_channel_map_volume_changed(stream->priv->channel_map, &cv, FALSE); + g_object_notify (G_OBJECT (stream), "volume"); + } + + return TRUE; +} + +gboolean +gvc_mixer_stream_get_is_muted (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + return stream->priv->is_muted; +} + +gboolean +gvc_mixer_stream_get_can_decibel (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + return stream->priv->can_decibel; +} + +gboolean +gvc_mixer_stream_set_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + if (is_muted != stream->priv->is_muted) { + stream->priv->is_muted = is_muted; + g_object_notify (G_OBJECT (stream), "is-muted"); + } + + return TRUE; +} + +gboolean +gvc_mixer_stream_set_can_decibel (GvcMixerStream *stream, + gboolean can_decibel) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + if (can_decibel != stream->priv->can_decibel) { + stream->priv->can_decibel = can_decibel; + g_object_notify (G_OBJECT (stream), "can-decibel"); + } + + return TRUE; +} + +const char * +gvc_mixer_stream_get_name (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + return stream->priv->name; +} + +const char * +gvc_mixer_stream_get_description (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + return stream->priv->description; +} + +gboolean +gvc_mixer_stream_set_name (GvcMixerStream *stream, + const char *name) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + g_free (stream->priv->name); + stream->priv->name = g_strdup (name); + g_object_notify (G_OBJECT (stream), "name"); + + return TRUE; +} + +gboolean +gvc_mixer_stream_set_description (GvcMixerStream *stream, + const char *description) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + g_free (stream->priv->description); + stream->priv->description = g_strdup (description); + g_object_notify (G_OBJECT (stream), "description"); + + return TRUE; +} + +gboolean +gvc_mixer_stream_is_event_stream (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + return stream->priv->is_event_stream; +} + +gboolean +gvc_mixer_stream_set_is_event_stream (GvcMixerStream *stream, + gboolean is_event_stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + stream->priv->is_event_stream = is_event_stream; + g_object_notify (G_OBJECT (stream), "is-event-stream"); + + return TRUE; +} + +gboolean +gvc_mixer_stream_is_virtual (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + return stream->priv->is_virtual; +} + +gboolean +gvc_mixer_stream_set_is_virtual (GvcMixerStream *stream, + gboolean is_virtual) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + stream->priv->is_virtual = is_virtual; + g_object_notify (G_OBJECT (stream), "is-virtual"); + + return TRUE; +} + +const char * +gvc_mixer_stream_get_application_id (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + return stream->priv->application_id; +} + +gboolean +gvc_mixer_stream_set_application_id (GvcMixerStream *stream, + const char *application_id) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + g_free (stream->priv->application_id); + stream->priv->application_id = g_strdup (application_id); + g_object_notify (G_OBJECT (stream), "application-id"); + + return TRUE; +} + +static void +on_channel_map_volume_changed (GvcChannelMap *channel_map, + gboolean set, + GvcMixerStream *stream) +{ + if (set == TRUE) + gvc_mixer_stream_push_volume (stream); + + g_object_notify (G_OBJECT (stream), "volume"); +} + +static gboolean +gvc_mixer_stream_set_channel_map (GvcMixerStream *stream, + GvcChannelMap *channel_map) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + if (channel_map != NULL) { + g_object_ref (channel_map); + } + + if (stream->priv->channel_map != NULL) { + g_signal_handlers_disconnect_by_func (stream->priv->channel_map, + on_channel_map_volume_changed, + stream); + g_object_unref (stream->priv->channel_map); + } + + stream->priv->channel_map = channel_map; + + if (stream->priv->channel_map != NULL) { + g_signal_connect (stream->priv->channel_map, + "volume-changed", + G_CALLBACK (on_channel_map_volume_changed), + stream); + + g_object_notify (G_OBJECT (stream), "channel-map"); + } + + return TRUE; +} + +const char * +gvc_mixer_stream_get_icon_name (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + return stream->priv->icon_name; +} + +gboolean +gvc_mixer_stream_set_icon_name (GvcMixerStream *stream, + const char *icon_name) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + g_free (stream->priv->icon_name); + stream->priv->icon_name = g_strdup (icon_name); + g_object_notify (G_OBJECT (stream), "icon-name"); + + return TRUE; +} + +/** + * gvc_mixer_stream_get_base_volume: + * + * @stream: + * + * Returns: (type guint32) (transfer none): + */ +pa_volume_t +gvc_mixer_stream_get_base_volume (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0); + + return stream->priv->base_volume; +} + +/** + * gvc_mixer_stream_set_base_volume: + * + * @stream: + * @base_volume: (type guint32): + * + * Returns: + */ +gboolean +gvc_mixer_stream_set_base_volume (GvcMixerStream *stream, + pa_volume_t base_volume) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + stream->priv->base_volume = base_volume; + + return TRUE; +} + +const GvcMixerStreamPort * +gvc_mixer_stream_get_port (GvcMixerStream *stream) +{ + GList *l; + + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + g_return_val_if_fail (stream->priv->ports != NULL, NULL); + + for (l = stream->priv->ports; l != NULL; l = l->next) { + GvcMixerStreamPort *p = l->data; + if (g_strcmp0 (stream->priv->port, p->port) == 0) { + return p; + } + } + + g_assert_not_reached (); + + return NULL; +} + +gboolean +gvc_mixer_stream_set_port (GvcMixerStream *stream, + const char *port) +{ + GList *l; + + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + g_return_val_if_fail (stream->priv->ports != NULL, FALSE); + + g_free (stream->priv->port); + stream->priv->port = g_strdup (port); + + g_free (stream->priv->human_port); + stream->priv->human_port = NULL; + + for (l = stream->priv->ports; l != NULL; l = l->next) { + GvcMixerStreamPort *p = l->data; + if (g_str_equal (stream->priv->port, p->port)) { + stream->priv->human_port = g_strdup (p->human_port); + break; + } + } + + g_object_notify (G_OBJECT (stream), "port"); + + return TRUE; +} + +gboolean +gvc_mixer_stream_change_port (GvcMixerStream *stream, + const char *port) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + return GVC_MIXER_STREAM_GET_CLASS (stream)->change_port (stream, port); +} + +const GList * +gvc_mixer_stream_get_ports (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + return stream->priv->ports; +} + +static int +sort_ports (GvcMixerStreamPort *a, + GvcMixerStreamPort *b) +{ + if (a->priority == b->priority) + return 0; + if (a->priority > b->priority) + return 1; + return -1; +} + +gboolean +gvc_mixer_stream_set_ports (GvcMixerStream *stream, + GList *ports) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + g_return_val_if_fail (stream->priv->ports == NULL, FALSE); + + stream->priv->ports = g_list_sort (ports, (GCompareFunc) sort_ports); + + return TRUE; +} + +gint +gvc_mixer_stream_get_card_index (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), PA_INVALID_INDEX); + return stream->priv->card_index; +} + +gboolean +gvc_mixer_stream_set_card_index (GvcMixerStream *stream, + gint card_index) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + stream->priv->card_index = card_index; + g_object_notify (G_OBJECT (stream), "card-index"); + + return TRUE; +} + +static void +gvc_mixer_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcMixerStream *self = GVC_MIXER_STREAM (object); + + switch (prop_id) { + case PROP_PA_CONTEXT: + self->priv->pa_context = g_value_get_pointer (value); + break; + case PROP_INDEX: + self->priv->index = g_value_get_ulong (value); + break; + case PROP_ID: + self->priv->id = g_value_get_ulong (value); + break; + case PROP_CHANNEL_MAP: + gvc_mixer_stream_set_channel_map (self, g_value_get_object (value)); + break; + case PROP_NAME: + gvc_mixer_stream_set_name (self, g_value_get_string (value)); + break; + case PROP_DESCRIPTION: + gvc_mixer_stream_set_description (self, g_value_get_string (value)); + break; + case PROP_APPLICATION_ID: + gvc_mixer_stream_set_application_id (self, g_value_get_string (value)); + break; + case PROP_ICON_NAME: + gvc_mixer_stream_set_icon_name (self, g_value_get_string (value)); + break; + case PROP_VOLUME: + gvc_mixer_stream_set_volume (self, g_value_get_ulong (value)); + break; + case PROP_DECIBEL: + gvc_mixer_stream_set_decibel (self, g_value_get_double (value)); + break; + case PROP_IS_MUTED: + gvc_mixer_stream_set_is_muted (self, g_value_get_boolean (value)); + break; + case PROP_IS_EVENT_STREAM: + gvc_mixer_stream_set_is_event_stream (self, g_value_get_boolean (value)); + break; + case PROP_IS_VIRTUAL: + gvc_mixer_stream_set_is_virtual (self, g_value_get_boolean (value)); + break; + case PROP_CAN_DECIBEL: + gvc_mixer_stream_set_can_decibel (self, g_value_get_boolean (value)); + break; + case PROP_PORT: + gvc_mixer_stream_set_port (self, g_value_get_string (value)); + break; + case PROP_CARD_INDEX: + self->priv->card_index = g_value_get_long (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_mixer_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcMixerStream *self = GVC_MIXER_STREAM (object); + + switch (prop_id) { + case PROP_PA_CONTEXT: + g_value_set_pointer (value, self->priv->pa_context); + break; + case PROP_INDEX: + g_value_set_ulong (value, self->priv->index); + break; + case PROP_ID: + g_value_set_ulong (value, self->priv->id); + break; + case PROP_CHANNEL_MAP: + g_value_set_object (value, self->priv->channel_map); + break; + case PROP_NAME: + g_value_set_string (value, self->priv->name); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, self->priv->description); + break; + case PROP_APPLICATION_ID: + g_value_set_string (value, self->priv->application_id); + break; + case PROP_ICON_NAME: + g_value_set_string (value, self->priv->icon_name); + break; + case PROP_VOLUME: + g_value_set_ulong (value, + pa_cvolume_max(gvc_channel_map_get_cvolume(self->priv->channel_map))); + break; + case PROP_DECIBEL: + g_value_set_double (value, + pa_sw_volume_to_dB(pa_cvolume_max(gvc_channel_map_get_cvolume(self->priv->channel_map)))); + break; + case PROP_IS_MUTED: + g_value_set_boolean (value, self->priv->is_muted); + break; + case PROP_IS_EVENT_STREAM: + g_value_set_boolean (value, self->priv->is_event_stream); + break; + case PROP_IS_VIRTUAL: + g_value_set_boolean (value, self->priv->is_virtual); + break; + case PROP_CAN_DECIBEL: + g_value_set_boolean (value, self->priv->can_decibel); + break; + case PROP_PORT: + g_value_set_string (value, self->priv->port); + break; + case PROP_CARD_INDEX: + g_value_set_long (value, self->priv->card_index); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GObject * +gvc_mixer_stream_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcMixerStream *self; + + object = G_OBJECT_CLASS (gvc_mixer_stream_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_MIXER_STREAM (object); + + self->priv->id = get_next_stream_serial (); + + return object; +} + +static gboolean +gvc_mixer_stream_real_change_port (GvcMixerStream *stream, + const char *port) +{ + return FALSE; +} + +static gboolean +gvc_mixer_stream_real_push_volume (GvcMixerStream *stream, gpointer *op) +{ + return FALSE; +} + +static gboolean +gvc_mixer_stream_real_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + return FALSE; +} + +gboolean +gvc_mixer_stream_push_volume (GvcMixerStream *stream) +{ + pa_operation *op; + gboolean ret; + + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + + if (stream->priv->is_event_stream != FALSE) + return TRUE; + + g_debug ("Pushing new volume to stream '%s' (%s)", + stream->priv->description, stream->priv->name); + + ret = GVC_MIXER_STREAM_GET_CLASS (stream)->push_volume (stream, (gpointer *) &op); + if (ret) { + if (stream->priv->change_volume_op != NULL) + pa_operation_unref (stream->priv->change_volume_op); + stream->priv->change_volume_op = op; + } + return ret; +} + +gboolean +gvc_mixer_stream_change_is_muted (GvcMixerStream *stream, + gboolean is_muted) +{ + gboolean ret; + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + ret = GVC_MIXER_STREAM_GET_CLASS (stream)->change_is_muted (stream, is_muted); + return ret; +} + +gboolean +gvc_mixer_stream_is_running (GvcMixerStream *stream) +{ + if (stream->priv->change_volume_op == NULL) + return FALSE; + + if ((pa_operation_get_state(stream->priv->change_volume_op) == PA_OPERATION_RUNNING)) + return TRUE; + + pa_operation_unref(stream->priv->change_volume_op); + stream->priv->change_volume_op = NULL; + + return FALSE; +} + +static void +gvc_mixer_stream_class_init (GvcMixerStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructor = gvc_mixer_stream_constructor; + gobject_class->finalize = gvc_mixer_stream_finalize; + gobject_class->set_property = gvc_mixer_stream_set_property; + gobject_class->get_property = gvc_mixer_stream_get_property; + + klass->push_volume = gvc_mixer_stream_real_push_volume; + klass->change_port = gvc_mixer_stream_real_change_port; + klass->change_is_muted = gvc_mixer_stream_real_change_is_muted; + + g_object_class_install_property (gobject_class, + PROP_INDEX, + g_param_spec_ulong ("index", + "Index", + "The index for this stream", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_ID, + g_param_spec_ulong ("id", + "id", + "The id for this stream", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_CHANNEL_MAP, + g_param_spec_object ("channel-map", + "channel map", + "The channel map for this stream", + GVC_TYPE_CHANNEL_MAP, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_PA_CONTEXT, + g_param_spec_pointer ("pa-context", + "PulseAudio context", + "The PulseAudio context for this stream", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_VOLUME, + g_param_spec_ulong ("volume", + "Volume", + "The volume for this stream", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_DECIBEL, + g_param_spec_double ("decibel", + "Decibel", + "The decibel level for this stream", + -G_MAXDOUBLE, G_MAXDOUBLE, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "Name to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_DESCRIPTION, + g_param_spec_string ("description", + "Description", + "Description to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_APPLICATION_ID, + g_param_spec_string ("application-id", + "Application identifier", + "Application identifier for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_ICON_NAME, + g_param_spec_string ("icon-name", + "Icon Name", + "Name of icon to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_IS_MUTED, + g_param_spec_boolean ("is-muted", + "is muted", + "Whether stream is muted", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_CAN_DECIBEL, + g_param_spec_boolean ("can-decibel", + "can decibel", + "Whether stream volume can be converted to decibel units", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_IS_EVENT_STREAM, + g_param_spec_boolean ("is-event-stream", + "is event stream", + "Whether stream's role is to play an event", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_IS_VIRTUAL, + g_param_spec_boolean ("is-virtual", + "is virtual stream", + "Whether the stream is virtual", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_PORT, + g_param_spec_string ("port", + "Port", + "The name of the current port for this stream", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_CARD_INDEX, + g_param_spec_long ("card-index", + "Card index", + "The index of the card for this stream", + PA_INVALID_INDEX, G_MAXLONG, PA_INVALID_INDEX, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_type_class_add_private (klass, sizeof (GvcMixerStreamPrivate)); +} + +static void +gvc_mixer_stream_init (GvcMixerStream *stream) +{ + stream->priv = GVC_MIXER_STREAM_GET_PRIVATE (stream); +} + +static void +free_port (GvcMixerStreamPort *p) +{ + g_free (p->port); + g_free (p->human_port); + g_free (p); +} + +static void +gvc_mixer_stream_finalize (GObject *object) +{ + GvcMixerStream *mixer_stream; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_MIXER_STREAM (object)); + + mixer_stream = GVC_MIXER_STREAM (object); + + g_return_if_fail (mixer_stream->priv != NULL); + + g_object_unref (mixer_stream->priv->channel_map); + mixer_stream->priv->channel_map = NULL; + + g_free (mixer_stream->priv->name); + mixer_stream->priv->name = NULL; + + g_free (mixer_stream->priv->description); + mixer_stream->priv->description = NULL; + + g_free (mixer_stream->priv->application_id); + mixer_stream->priv->application_id = NULL; + + g_free (mixer_stream->priv->icon_name); + mixer_stream->priv->icon_name = NULL; + + g_free (mixer_stream->priv->port); + mixer_stream->priv->port = NULL; + + g_free (mixer_stream->priv->human_port); + mixer_stream->priv->human_port = NULL; + + g_list_foreach (mixer_stream->priv->ports, (GFunc) free_port, NULL); + g_list_free (mixer_stream->priv->ports); + mixer_stream->priv->ports = NULL; + + if (mixer_stream->priv->change_volume_op) { + pa_operation_unref(mixer_stream->priv->change_volume_op); + mixer_stream->priv->change_volume_op = NULL; + } + + G_OBJECT_CLASS (gvc_mixer_stream_parent_class)->finalize (object); +} diff --git a/panels/sound/gvc-mixer-stream.h b/panels/sound/gvc-mixer-stream.h new file mode 100644 index 000000000..53b7eb6d6 --- /dev/null +++ b/panels/sound/gvc-mixer-stream.h @@ -0,0 +1,125 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_MIXER_STREAM_H +#define __GVC_MIXER_STREAM_H + +#include <glib-object.h> +#include "gvc-pulseaudio-fake.h" +#include "gvc-channel-map.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_MIXER_STREAM (gvc_mixer_stream_get_type ()) +#define GVC_MIXER_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_STREAM, GvcMixerStream)) +#define GVC_MIXER_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_STREAM, GvcMixerStreamClass)) +#define GVC_IS_MIXER_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_STREAM)) +#define GVC_IS_MIXER_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_STREAM)) +#define GVC_MIXER_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_STREAM, GvcMixerStreamClass)) + +typedef struct GvcMixerStreamPrivate GvcMixerStreamPrivate; + +typedef struct +{ + GObject parent; + GvcMixerStreamPrivate *priv; +} GvcMixerStream; + +typedef struct +{ + GObjectClass parent_class; + + /* vtable */ + gboolean (*push_volume) (GvcMixerStream *stream, + gpointer *operation); + gboolean (*change_is_muted) (GvcMixerStream *stream, + gboolean is_muted); + gboolean (*change_port) (GvcMixerStream *stream, + const char *port); +} GvcMixerStreamClass; + +typedef struct +{ + char *port; + char *human_port; + guint priority; +} GvcMixerStreamPort; + +GType gvc_mixer_stream_get_type (void); + +guint gvc_mixer_stream_get_index (GvcMixerStream *stream); +guint gvc_mixer_stream_get_id (GvcMixerStream *stream); +const GvcChannelMap *gvc_mixer_stream_get_channel_map(GvcMixerStream *stream); +const GvcMixerStreamPort *gvc_mixer_stream_get_port (GvcMixerStream *stream); +const GList * gvc_mixer_stream_get_ports (GvcMixerStream *stream); +gboolean gvc_mixer_stream_change_port (GvcMixerStream *stream, + const char *port); + +pa_volume_t gvc_mixer_stream_get_volume (GvcMixerStream *stream); +gdouble gvc_mixer_stream_get_decibel (GvcMixerStream *stream); +gboolean gvc_mixer_stream_push_volume (GvcMixerStream *stream); +pa_volume_t gvc_mixer_stream_get_base_volume (GvcMixerStream *stream); + +gboolean gvc_mixer_stream_get_is_muted (GvcMixerStream *stream); +gboolean gvc_mixer_stream_get_can_decibel (GvcMixerStream *stream); +gboolean gvc_mixer_stream_change_is_muted (GvcMixerStream *stream, + gboolean is_muted); +gboolean gvc_mixer_stream_is_running (GvcMixerStream *stream); +const char * gvc_mixer_stream_get_name (GvcMixerStream *stream); +const char * gvc_mixer_stream_get_icon_name (GvcMixerStream *stream); +const char * gvc_mixer_stream_get_description (GvcMixerStream *stream); +const char * gvc_mixer_stream_get_application_id (GvcMixerStream *stream); +gboolean gvc_mixer_stream_is_event_stream (GvcMixerStream *stream); +gboolean gvc_mixer_stream_is_virtual (GvcMixerStream *stream); +gint gvc_mixer_stream_get_card_index (GvcMixerStream *stream); + +/* private */ +gboolean gvc_mixer_stream_set_volume (GvcMixerStream *stream, + pa_volume_t volume); +gboolean gvc_mixer_stream_set_decibel (GvcMixerStream *stream, + gdouble db); +gboolean gvc_mixer_stream_set_is_muted (GvcMixerStream *stream, + gboolean is_muted); +gboolean gvc_mixer_stream_set_can_decibel (GvcMixerStream *stream, + gboolean can_decibel); +gboolean gvc_mixer_stream_set_name (GvcMixerStream *stream, + const char *name); +gboolean gvc_mixer_stream_set_description (GvcMixerStream *stream, + const char *description); +gboolean gvc_mixer_stream_set_icon_name (GvcMixerStream *stream, + const char *name); +gboolean gvc_mixer_stream_set_is_event_stream (GvcMixerStream *stream, + gboolean is_event_stream); +gboolean gvc_mixer_stream_set_is_virtual (GvcMixerStream *stream, + gboolean is_event_stream); +gboolean gvc_mixer_stream_set_application_id (GvcMixerStream *stream, + const char *application_id); +gboolean gvc_mixer_stream_set_base_volume (GvcMixerStream *stream, + pa_volume_t base_volume); +gboolean gvc_mixer_stream_set_port (GvcMixerStream *stream, + const char *port); +gboolean gvc_mixer_stream_set_ports (GvcMixerStream *stream, + GList *ports); +gboolean gvc_mixer_stream_set_card_index (GvcMixerStream *stream, + gint card_index); + +G_END_DECLS + +#endif /* __GVC_MIXER_STREAM_H */ diff --git a/panels/sound/gvc-pulseaudio-fake.h b/panels/sound/gvc-pulseaudio-fake.h new file mode 100644 index 000000000..65293cdef --- /dev/null +++ b/panels/sound/gvc-pulseaudio-fake.h @@ -0,0 +1,34 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_PULSEAUDIO_FAKE_H +#define __GVC_PULSEAUDIO_FAKE_H + +#ifdef WITH_INTROSPECTION + +#ifndef PA_API_VERSION +typedef int pa_channel_position_t; +typedef guint32 pa_volume_t; +typedef gpointer pa_context; +#endif /* PA_API_VERSION */ + +#endif /* WITH_INTROSPECTION */ + +#endif /* __GVC_PULSEAUDIO_FAKE_H */ diff --git a/panels/sound/gvc-sound-theme-chooser.c b/panels/sound/gvc-sound-theme-chooser.c new file mode 100644 index 000000000..676c5107f --- /dev/null +++ b/panels/sound/gvc-sound-theme-chooser.c @@ -0,0 +1,1145 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net> + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <utime.h> +#include <errno.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <canberra-gtk.h> +#include <libxml/tree.h> + +#include <gconf/gconf-client.h> + +#include "gvc-sound-theme-chooser.h" +#include "sound-theme-file-utils.h" + +#define GVC_SOUND_THEME_CHOOSER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_SOUND_THEME_CHOOSER, GvcSoundThemeChooserPrivate)) + +struct GvcSoundThemeChooserPrivate +{ + GtkWidget *combo_box; + GtkWidget *treeview; + GtkWidget *theme_box; + GtkWidget *selection_box; + GtkWidget *click_feedback_button; + GConfClient *client; + guint sounds_dir_id; + guint metacity_dir_id; +}; + +static void gvc_sound_theme_chooser_class_init (GvcSoundThemeChooserClass *klass); +static void gvc_sound_theme_chooser_init (GvcSoundThemeChooser *sound_theme_chooser); +static void gvc_sound_theme_chooser_finalize (GObject *object); + +G_DEFINE_TYPE (GvcSoundThemeChooser, gvc_sound_theme_chooser, GTK_TYPE_VBOX) + +#define KEY_SOUNDS_DIR "/desktop/gnome/sound" +#define EVENT_SOUNDS_KEY KEY_SOUNDS_DIR "/event_sounds" +#define INPUT_SOUNDS_KEY KEY_SOUNDS_DIR "/input_feedback_sounds" +#define SOUND_THEME_KEY KEY_SOUNDS_DIR "/theme_name" +#define KEY_METACITY_DIR "/apps/metacity/general" +#define AUDIO_BELL_KEY KEY_METACITY_DIR "/audible_bell" + +#define DEFAULT_ALERT_ID "__default" +#define CUSTOM_THEME_NAME "__custom" +#define NO_SOUNDS_THEME_NAME "__no_sounds" + +enum { + THEME_DISPLAY_COL, + THEME_IDENTIFIER_COL, + THEME_PARENT_ID_COL, + THEME_NUM_COLS +}; + +enum { + ALERT_DISPLAY_COL, + ALERT_IDENTIFIER_COL, + ALERT_SOUND_TYPE_COL, + ALERT_NUM_COLS +}; + +enum { + SOUND_TYPE_UNSET, + SOUND_TYPE_OFF, + SOUND_TYPE_DEFAULT_FROM_THEME, + SOUND_TYPE_BUILTIN, + SOUND_TYPE_CUSTOM +}; + +static void +on_combobox_changed (GtkComboBox *widget, + GvcSoundThemeChooser *chooser) +{ + GtkTreeIter iter; + GtkTreeModel *model; + char *theme_name; + + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &iter) == FALSE) { + return; + } + + model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box)); + gtk_tree_model_get (model, &iter, THEME_IDENTIFIER_COL, &theme_name, -1); + + g_assert (theme_name != NULL); + + /* special case for no sounds */ + if (strcmp (theme_name, NO_SOUNDS_THEME_NAME) == 0) { + gconf_client_set_bool (chooser->priv->client, EVENT_SOUNDS_KEY, FALSE, NULL); + return; + } else { + gconf_client_set_bool (chooser->priv->client, EVENT_SOUNDS_KEY, TRUE, NULL); + } + + gconf_client_set_string (chooser->priv->client, SOUND_THEME_KEY, theme_name, NULL); + + g_free (theme_name); + + /* FIXME: reset alert model */ +} + +static char * +load_index_theme_name (const char *index, + char **parent) +{ + GKeyFile *file; + char *indexname = NULL; + gboolean hidden; + + file = g_key_file_new (); + if (g_key_file_load_from_file (file, index, G_KEY_FILE_KEEP_TRANSLATIONS, NULL) == FALSE) { + g_key_file_free (file); + return NULL; + } + /* Don't add hidden themes to the list */ + hidden = g_key_file_get_boolean (file, "Sound Theme", "Hidden", NULL); + if (!hidden) { + indexname = g_key_file_get_locale_string (file, + "Sound Theme", + "Name", + NULL, + NULL); + + /* Save the parent theme, if there's one */ + if (parent != NULL) { + *parent = g_key_file_get_string (file, + "Sound Theme", + "Inherits", + NULL); + } + } + + g_key_file_free (file); + return indexname; +} + +static void +sound_theme_in_dir (GHashTable *hash, + const char *dir) +{ + GDir *d; + const char *name; + + d = g_dir_open (dir, 0, NULL); + if (d == NULL) { + return; + } + + while ((name = g_dir_read_name (d)) != NULL) { + char *dirname, *index, *indexname; + + /* Look for directories */ + dirname = g_build_filename (dir, name, NULL); + if (g_file_test (dirname, G_FILE_TEST_IS_DIR) == FALSE) { + g_free (dirname); + continue; + } + + /* Look for index files */ + index = g_build_filename (dirname, "index.theme", NULL); + g_free (dirname); + + /* Check the name of the theme in the index.theme file */ + indexname = load_index_theme_name (index, NULL); + g_free (index); + if (indexname == NULL) { + continue; + } + + g_hash_table_insert (hash, g_strdup (name), indexname); + } + + g_dir_close (d); +} + +static void +add_theme_to_store (const char *key, + const char *value, + GtkListStore *store) +{ + char *parent; + + parent = NULL; + + /* Get the parent, if we're checking the custom theme */ + if (strcmp (key, CUSTOM_THEME_NAME) == 0) { + char *name, *path; + + path = custom_theme_dir_path ("index.theme"); + name = load_index_theme_name (path, &parent); + g_free (name); + g_free (path); + } + gtk_list_store_insert_with_values (store, NULL, G_MAXINT, + THEME_DISPLAY_COL, value, + THEME_IDENTIFIER_COL, key, + THEME_PARENT_ID_COL, parent, + -1); + g_free (parent); +} + +static void +set_combox_for_theme_name (GvcSoundThemeChooser *chooser, + const char *name) +{ + GtkTreeIter iter; + GtkTreeModel *model; + gboolean found; + + /* If the name is empty, use "freedesktop" */ + if (name == NULL || *name == '\0') { + name = "freedesktop"; + } + + model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box)); + + if (gtk_tree_model_get_iter_first (model, &iter) == FALSE) { + return; + } + + do { + char *value; + + gtk_tree_model_get (model, &iter, THEME_IDENTIFIER_COL, &value, -1); + found = (value != NULL && strcmp (value, name) == 0); + g_free (value); + + } while (!found && gtk_tree_model_iter_next (model, &iter)); + + /* When we can't find the theme we need to set, try to set the default + * one "freedesktop" */ + if (found) { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &iter); + } else if (strcmp (name, "freedesktop") != 0) { + g_debug ("not found, falling back to fdo"); + set_combox_for_theme_name (chooser, "freedesktop"); + } +} + +static void +set_input_feedback_enabled (GvcSoundThemeChooser *chooser, + gboolean enabled) +{ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chooser->priv->click_feedback_button), + enabled); +} + +static void +setup_theme_selector (GvcSoundThemeChooser *chooser) +{ + GHashTable *hash; + GtkListStore *store; + GtkCellRenderer *renderer; + const char * const *data_dirs; + const char *data_dir; + char *dir; + guint i; + + /* Add the theme names and their display name to a hash table, + * makes it easy to avoid duplicate themes */ + hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + data_dirs = g_get_system_data_dirs (); + for (i = 0; data_dirs[i] != NULL; i++) { + dir = g_build_filename (data_dirs[i], "sounds", NULL); + sound_theme_in_dir (hash, dir); + g_free (dir); + } + + data_dir = g_get_user_data_dir (); + dir = g_build_filename (data_dir, "sounds", NULL); + sound_theme_in_dir (hash, dir); + g_free (dir); + + /* If there isn't at least one theme, make everything + * insensitive, LAME! */ + if (g_hash_table_size (hash) == 0) { + gtk_widget_set_sensitive (GTK_WIDGET (chooser), FALSE); + g_warning ("Bad setup, install the freedesktop sound theme"); + g_hash_table_destroy (hash); + return; + } + + /* Setup the tree model, 3 columns: + * - internal theme name/directory + * - display theme name + * - the internal id for the parent theme, used for the custom theme */ + store = gtk_list_store_new (THEME_NUM_COLS, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING); + + /* Add the themes to a combobox */ + gtk_list_store_insert_with_values (store, + NULL, + G_MAXINT, + THEME_DISPLAY_COL, _("No sounds"), + THEME_IDENTIFIER_COL, "__no_sounds", + THEME_PARENT_ID_COL, NULL, + -1); + g_hash_table_foreach (hash, (GHFunc) add_theme_to_store, store); + g_hash_table_destroy (hash); + + /* Set the display */ + gtk_combo_box_set_model (GTK_COMBO_BOX (chooser->priv->combo_box), + GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (chooser->priv->combo_box), + renderer, + TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (chooser->priv->combo_box), + renderer, + "text", THEME_DISPLAY_COL, + NULL); + + g_signal_connect (chooser->priv->combo_box, + "changed", + G_CALLBACK (on_combobox_changed), + chooser); +} + +#define GVC_SOUND_SOUND (xmlChar *) "sound" +#define GVC_SOUND_NAME (xmlChar *) "name" +#define GVC_SOUND_FILENAME (xmlChar *) "filename" + +/* Adapted from yelp-toc-pager.c */ +static xmlChar * +xml_get_and_trim_names (xmlNodePtr node) +{ + xmlNodePtr cur, keep = NULL; + xmlChar *keep_lang = NULL; + xmlChar *value; + int j, keep_pri = INT_MAX; + + const gchar * const * langs = g_get_language_names (); + + value = NULL; + + for (cur = node->children; cur; cur = cur->next) { + if (! xmlStrcmp (cur->name, GVC_SOUND_NAME)) { + xmlChar *cur_lang = NULL; + int cur_pri = INT_MAX; + + cur_lang = xmlNodeGetLang (cur); + + if (cur_lang) { + for (j = 0; langs[j]; j++) { + if (g_str_equal (cur_lang, langs[j])) { + cur_pri = j; + break; + } + } + } else { + cur_pri = INT_MAX - 1; + } + + if (cur_pri <= keep_pri) { + if (keep_lang) + xmlFree (keep_lang); + if (value) + xmlFree (value); + + value = xmlNodeGetContent (cur); + + keep_lang = cur_lang; + keep_pri = cur_pri; + keep = cur; + } else { + if (cur_lang) + xmlFree (cur_lang); + } + } + } + + /* Delete all GVC_SOUND_NAME nodes */ + cur = node->children; + while (cur) { + xmlNodePtr this = cur; + cur = cur->next; + if (! xmlStrcmp (this->name, GVC_SOUND_NAME)) { + xmlUnlinkNode (this); + xmlFreeNode (this); + } + } + + return value; +} + +static void +populate_model_from_node (GvcSoundThemeChooser *chooser, + GtkTreeModel *model, + xmlNodePtr node) +{ + xmlNodePtr child; + xmlChar *filename; + xmlChar *name; + + filename = NULL; + name = xml_get_and_trim_names (node); + for (child = node->children; child; child = child->next) { + if (xmlNodeIsText (child)) { + continue; + } + + if (xmlStrcmp (child->name, GVC_SOUND_FILENAME) == 0) { + filename = xmlNodeGetContent (child); + } else if (xmlStrcmp (child->name, GVC_SOUND_NAME) == 0) { + /* EH? should have been trimmed */ + } + } + + if (filename != NULL && name != NULL) { + gtk_list_store_insert_with_values (GTK_LIST_STORE (model), + NULL, + G_MAXINT, + ALERT_IDENTIFIER_COL, filename, + ALERT_DISPLAY_COL, name, + ALERT_SOUND_TYPE_COL, _("Built-in"), + -1); + } + + xmlFree (filename); + xmlFree (name); +} + +static void +populate_model_from_file (GvcSoundThemeChooser *chooser, + GtkTreeModel *model, + const char *filename) +{ + xmlDocPtr doc; + xmlNodePtr root; + xmlNodePtr child; + gboolean exists; + + exists = g_file_test (filename, G_FILE_TEST_EXISTS); + if (! exists) { + return; + } + + doc = xmlParseFile (filename); + if (doc == NULL) { + return; + } + + root = xmlDocGetRootElement (doc); + + for (child = root->children; child; child = child->next) { + if (xmlNodeIsText (child)) { + continue; + } + if (xmlStrcmp (child->name, GVC_SOUND_SOUND) != 0) { + continue; + } + + populate_model_from_node (chooser, model, child); + } + + xmlFreeDoc (doc); +} + +static void +populate_model_from_dir (GvcSoundThemeChooser *chooser, + GtkTreeModel *model, + const char *dirname) +{ + GDir *d; + const char *name; + + d = g_dir_open (dirname, 0, NULL); + if (d == NULL) { + return; + } + + while ((name = g_dir_read_name (d)) != NULL) { + char *path; + + if (! g_str_has_suffix (name, ".xml")) { + continue; + } + + path = g_build_filename (dirname, name, NULL); + populate_model_from_file (chooser, model, path); + g_free (path); + } +} + +static gboolean +save_alert_sounds (GvcSoundThemeChooser *chooser, + const char *id) +{ + const char *sounds[3] = { "bell-terminal", "bell-window-system", NULL }; + char *path; + + if (strcmp (id, DEFAULT_ALERT_ID) == 0) { + delete_old_files (sounds); + delete_disabled_files (sounds); + } else { + delete_old_files (sounds); + delete_disabled_files (sounds); + add_custom_file (sounds, id); + } + + /* And poke the directory so the theme gets updated */ + path = custom_theme_dir_path (NULL); + if (utime (path, NULL) != 0) { + g_warning ("Failed to update mtime for directory '%s': %s", + path, g_strerror (errno)); + } + g_free (path); + + return FALSE; +} + + +static void +update_alert_model (GvcSoundThemeChooser *chooser, + const char *id) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (chooser->priv->treeview)); + gtk_tree_model_get_iter_first (model, &iter); + do { + char *this_id; + + gtk_tree_model_get (model, &iter, + ALERT_IDENTIFIER_COL, &this_id, + -1); + + if (strcmp (this_id, id) == 0) { + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (chooser->priv->treeview)); + gtk_tree_selection_select_iter (selection, &iter); + } + + g_free (this_id); + } while (gtk_tree_model_iter_next (model, &iter)); +} + +static void +update_alert (GvcSoundThemeChooser *chooser, + const char *alert_id) +{ + GtkTreeModel *theme_model; + GtkTreeIter iter; + char *theme; + char *parent; + gboolean is_custom; + gboolean is_default; + gboolean add_custom; + gboolean remove_custom; + + theme_model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box)); + /* Get the current theme's name, and set the parent */ + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &iter) == FALSE) { + return; + } + + gtk_tree_model_get (theme_model, &iter, + THEME_IDENTIFIER_COL, &theme, + THEME_IDENTIFIER_COL, &parent, + -1); + is_custom = strcmp (theme, CUSTOM_THEME_NAME) == 0; + is_default = strcmp (alert_id, DEFAULT_ALERT_ID) == 0; + + /* So a few possibilities: + * 1. Named theme, default alert selected: noop + * 2. Named theme, alternate alert selected: create new custom with sound + * 3. Custom theme, default alert selected: remove sound and possibly custom + * 4. Custom theme, alternate alert selected: update custom sound + */ + add_custom = FALSE; + remove_custom = FALSE; + if (! is_custom && is_default) { + /* remove custom just in case */ + remove_custom = TRUE; + } else if (! is_custom && ! is_default) { + create_custom_theme (parent); + save_alert_sounds (chooser, alert_id); + add_custom = TRUE; + } else if (is_custom && is_default) { + save_alert_sounds (chooser, alert_id); + /* after removing files check if it is empty */ + if (custom_theme_dir_is_empty ()) { + remove_custom = TRUE; + } + } else if (is_custom && ! is_default) { + save_alert_sounds (chooser, alert_id); + } + + if (add_custom) { + gtk_list_store_insert_with_values (GTK_LIST_STORE (theme_model), + NULL, + G_MAXINT, + THEME_DISPLAY_COL, _("Custom"), + THEME_IDENTIFIER_COL, CUSTOM_THEME_NAME, + THEME_PARENT_ID_COL, theme, + -1); + set_combox_for_theme_name (chooser, CUSTOM_THEME_NAME); + } else if (remove_custom) { + gtk_tree_model_get_iter_first (theme_model, &iter); + do { + char *this_parent; + + gtk_tree_model_get (theme_model, &iter, + THEME_PARENT_ID_COL, &this_parent, + -1); + if (this_parent != NULL && strcmp (this_parent, CUSTOM_THEME_NAME) != 0) { + g_free (this_parent); + gtk_list_store_remove (GTK_LIST_STORE (theme_model), &iter); + break; + } + g_free (this_parent); + } while (gtk_tree_model_iter_next (theme_model, &iter)); + + delete_custom_theme_dir (); + + set_combox_for_theme_name (chooser, parent); + } + + update_alert_model (chooser, alert_id); + + g_free (theme); + g_free (parent); +} + +static void +play_preview_for_id (GvcSoundThemeChooser *chooser, + const char *id) +{ + GtkTreeIter theme_iter; + char *parent_theme; + + g_return_if_fail (id != NULL); + + parent_theme = NULL; + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &theme_iter)) { + GtkTreeModel *theme_model; + char *theme_id; + char *parent_id; + + theme_model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box)); + theme_id = NULL; + parent_id = NULL; + gtk_tree_model_get (theme_model, &theme_iter, + THEME_IDENTIFIER_COL, &theme_id, + THEME_PARENT_ID_COL, &parent_id, -1); + if (theme_id && strcmp (theme_id, CUSTOM_THEME_NAME) == 0) { + parent_theme = g_strdup (parent_id); + } + g_free (theme_id); + g_free (parent_id); + } + + /* special case: for the default item on custom themes + * play the alert for the parent theme */ + if (strcmp (id, DEFAULT_ALERT_ID) == 0) { + if (parent_theme != NULL) { + ca_gtk_play_for_widget (GTK_WIDGET (chooser), 0, + CA_PROP_APPLICATION_NAME, _("Sound Preferences"), + CA_PROP_EVENT_ID, "bell-window-system", + CA_PROP_CANBERRA_XDG_THEME_NAME, parent_theme, + CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"), + CA_PROP_CANBERRA_CACHE_CONTROL, "never", + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", +#ifdef CA_PROP_CANBERRA_ENABLE + CA_PROP_CANBERRA_ENABLE, "1", +#endif + NULL); + } else { + ca_gtk_play_for_widget (GTK_WIDGET (chooser), 0, + CA_PROP_APPLICATION_NAME, _("Sound Preferences"), + CA_PROP_EVENT_ID, "bell-window-system", + CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"), + CA_PROP_CANBERRA_CACHE_CONTROL, "never", + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", +#ifdef CA_PROP_CANBERRA_ENABLE + CA_PROP_CANBERRA_ENABLE, "1", +#endif + NULL); + } + } else { + ca_gtk_play_for_widget (GTK_WIDGET (chooser), 0, + CA_PROP_APPLICATION_NAME, _("Sound Preferences"), + CA_PROP_MEDIA_FILENAME, id, + CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"), + CA_PROP_CANBERRA_CACHE_CONTROL, "never", + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", +#ifdef CA_PROP_CANBERRA_ENABLE + CA_PROP_CANBERRA_ENABLE, "1", +#endif + NULL); + + } + g_free (parent_theme); +} + +static void +on_treeview_selection_changed (GtkTreeSelection *selection, + GvcSoundThemeChooser *chooser) +{ + GtkTreeModel *model; + GtkTreeIter iter; + char *id; + + if (chooser->priv->treeview == NULL) { + return; + } + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (chooser->priv->treeview)); + + if (gtk_tree_selection_get_selected (selection, &model, &iter) == FALSE) { + return; + } + + id = NULL; + gtk_tree_model_get (model, &iter, + ALERT_IDENTIFIER_COL, &id, + -1); + if (id == NULL) { + return; + } + + play_preview_for_id (chooser, id); + update_alert (chooser, id); + g_free (id); +} + +static gboolean +on_treeview_button_pressed (GtkTreeView *treeview, + GdkEventButton *event, + GvcSoundThemeChooser *chooser) +{ + GtkTreeSelection *selection; + GtkTreePath *path; + + selection = gtk_tree_view_get_selection (treeview); + if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview), + event->x, event->y, &path, NULL, NULL, NULL) == FALSE) { + return FALSE; + } + + if (gtk_tree_selection_path_is_selected (selection, path) == FALSE) { + gtk_tree_path_free (path); + return FALSE; + } + gtk_tree_path_free (path); + + on_treeview_selection_changed (selection, chooser); + + return FALSE; +} + +static GtkWidget * +create_alert_treeview (GvcSoundThemeChooser *chooser) +{ + GtkListStore *store; + GtkWidget *treeview; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeSelection *selection; + + treeview = gtk_tree_view_new (); + g_signal_connect (treeview, + "button-press-event", + G_CALLBACK (on_treeview_button_pressed), + chooser); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + g_signal_connect (selection, + "changed", + G_CALLBACK (on_treeview_selection_changed), + chooser); + + /* Setup the tree model, 3 columns: + * - display name + * - sound id + * - sound type + */ + store = gtk_list_store_new (ALERT_NUM_COLS, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING); + + gtk_list_store_insert_with_values (store, + NULL, + G_MAXINT, + ALERT_IDENTIFIER_COL, DEFAULT_ALERT_ID, + ALERT_DISPLAY_COL, _("Default"), + ALERT_SOUND_TYPE_COL, _("From theme"), + -1); + + populate_model_from_dir (chooser, GTK_TREE_MODEL (store), SOUND_SET_DIR); + + gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), + GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Name"), + renderer, + "text", ALERT_DISPLAY_COL, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Type"), + renderer, + "text", ALERT_SOUND_TYPE_COL, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + + return treeview; +} + +static int +get_file_type (const char *sound_name, + char **linked_name) +{ + char *name, *filename; + + *linked_name = NULL; + + name = g_strdup_printf ("%s.disabled", sound_name); + filename = custom_theme_dir_path (name); + g_free (name); + + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) != FALSE) { + g_free (filename); + return SOUND_TYPE_OFF; + } + g_free (filename); + + /* We only check for .ogg files because those are the + * only ones we create */ + name = g_strdup_printf ("%s.ogg", sound_name); + filename = custom_theme_dir_path (name); + g_free (name); + + if (g_file_test (filename, G_FILE_TEST_IS_SYMLINK) != FALSE) { + *linked_name = g_file_read_link (filename, NULL); + g_free (filename); + return SOUND_TYPE_CUSTOM; + } + g_free (filename); + + return SOUND_TYPE_BUILTIN; +} + +static void +update_alerts_from_theme_name (GvcSoundThemeChooser *chooser, + const char *name) +{ + if (strcmp (name, CUSTOM_THEME_NAME) != 0) { + /* reset alert to default */ + update_alert (chooser, DEFAULT_ALERT_ID); + } else { + int sound_type; + char *linkname; + + linkname = NULL; + sound_type = get_file_type ("bell-terminal", &linkname); + g_debug ("Found link: %s", linkname); + if (sound_type == SOUND_TYPE_CUSTOM) { + update_alert (chooser, linkname); + } + } +} + +static void +update_theme (GvcSoundThemeChooser *chooser) +{ + char *theme_name; + gboolean events_enabled; + gboolean bell_enabled; + gboolean feedback_enabled; + + bell_enabled = gconf_client_get_bool (chooser->priv->client, AUDIO_BELL_KEY, NULL); + //set_audible_bell_enabled (chooser, bell_enabled); + + feedback_enabled = gconf_client_get_bool (chooser->priv->client, INPUT_SOUNDS_KEY, NULL); + set_input_feedback_enabled (chooser, feedback_enabled); + + events_enabled = gconf_client_get_bool (chooser->priv->client, EVENT_SOUNDS_KEY, NULL); + if (events_enabled) { + theme_name = gconf_client_get_string (chooser->priv->client, SOUND_THEME_KEY, NULL); + } else { + theme_name = g_strdup (NO_SOUNDS_THEME_NAME); + } + + gtk_widget_set_sensitive (chooser->priv->selection_box, events_enabled); + gtk_widget_set_sensitive (chooser->priv->click_feedback_button, events_enabled); + + set_combox_for_theme_name (chooser, theme_name); + + update_alerts_from_theme_name (chooser, theme_name); + + g_free (theme_name); +} + +static GObject * +gvc_sound_theme_chooser_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcSoundThemeChooser *self; + + object = G_OBJECT_CLASS (gvc_sound_theme_chooser_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_SOUND_THEME_CHOOSER (object); + + setup_theme_selector (self); + + update_theme (self); + + return object; +} + +static void +gvc_sound_theme_chooser_class_init (GvcSoundThemeChooserClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_sound_theme_chooser_constructor; + object_class->finalize = gvc_sound_theme_chooser_finalize; + + g_type_class_add_private (klass, sizeof (GvcSoundThemeChooserPrivate)); +} + +static void +on_click_feedback_toggled (GtkToggleButton *button, + GvcSoundThemeChooser *chooser) +{ + gboolean enabled; + + enabled = gtk_toggle_button_get_active (button); + + gconf_client_set_bool (chooser->priv->client, INPUT_SOUNDS_KEY, enabled, NULL); +} + +static void +on_key_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + GvcSoundThemeChooser *chooser) +{ + const char *key; + GConfValue *value; + + key = gconf_entry_get_key (entry); + + if (! g_str_has_prefix (key, KEY_SOUNDS_DIR) + && ! g_str_has_prefix (key, KEY_METACITY_DIR)) { + return; + } + + value = gconf_entry_get_value (entry); + if (strcmp (key, EVENT_SOUNDS_KEY) == 0) { + update_theme (chooser); + } else if (strcmp (key, SOUND_THEME_KEY) == 0) { + update_theme (chooser); + } else if (strcmp (key, INPUT_SOUNDS_KEY) == 0) { + update_theme (chooser); + } else if (strcmp (key, AUDIO_BELL_KEY) == 0) { + update_theme (chooser); + } +} + +static void +constrain_list_size (GtkWidget *widget, + GtkRequisition *requisition, + GtkWidget *to_size) +{ + GtkRequisition req; + int max_height; + + /* constrain height to be the tree height up to a max */ + max_height = (gdk_screen_get_height (gtk_widget_get_screen (widget))) / 4; + + gtk_widget_get_preferred_size (to_size, NULL, &req); + + requisition->height = MIN (req.height, max_height); +} + +static void +setup_list_size_constraint (GtkWidget *widget, + GtkWidget *to_size) +{ + g_signal_connect (widget, + "size-request", + G_CALLBACK (constrain_list_size), + to_size); +} + +static void +gvc_sound_theme_chooser_init (GvcSoundThemeChooser *chooser) +{ + GtkWidget *box; + GtkWidget *label; + GtkWidget *scrolled_window; + GtkWidget *alignment; + char *str; + + chooser->priv = GVC_SOUND_THEME_CHOOSER_GET_PRIVATE (chooser); + + chooser->priv->theme_box = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (chooser), + chooser->priv->theme_box, FALSE, FALSE, 0); + + label = gtk_label_new_with_mnemonic (_("Sound _theme:")); + gtk_box_pack_start (GTK_BOX (chooser->priv->theme_box), label, FALSE, FALSE, 0); + chooser->priv->combo_box = gtk_combo_box_new (); + gtk_box_pack_start (GTK_BOX (chooser->priv->theme_box), chooser->priv->combo_box, FALSE, FALSE, 6); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), chooser->priv->combo_box); + + chooser->priv->client = gconf_client_get_default (); + + str = g_strdup_printf ("<b>%s</b>", _("C_hoose an alert sound:")); + chooser->priv->selection_box = box = gtk_frame_new (str); + g_free (str); + label = gtk_frame_get_label_widget (GTK_FRAME (box)); + gtk_label_set_use_underline (GTK_LABEL (label), TRUE); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + gtk_frame_set_shadow_type (GTK_FRAME (box), GTK_SHADOW_NONE); + + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 0, 0); + gtk_container_add (GTK_CONTAINER (alignment), box); + gtk_box_pack_start (GTK_BOX (chooser), alignment, TRUE, TRUE, 6); + + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 0, 0); + gtk_container_add (GTK_CONTAINER (box), alignment); + + chooser->priv->treeview = create_alert_treeview (chooser); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), chooser->priv->treeview); + + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + setup_list_size_constraint (scrolled_window, chooser->priv->treeview); + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (scrolled_window), chooser->priv->treeview); + gtk_container_add (GTK_CONTAINER (alignment), scrolled_window); + + chooser->priv->click_feedback_button = gtk_check_button_new_with_mnemonic (_("Enable _window and button sounds")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chooser->priv->click_feedback_button), + gconf_client_get_bool (chooser->priv->client, INPUT_SOUNDS_KEY, NULL)); + gtk_box_pack_start (GTK_BOX (chooser), + chooser->priv->click_feedback_button, + FALSE, FALSE, 0); + g_signal_connect (chooser->priv->click_feedback_button, + "toggled", + G_CALLBACK (on_click_feedback_toggled), + chooser); + + + gconf_client_add_dir (chooser->priv->client, KEY_SOUNDS_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + chooser->priv->sounds_dir_id = gconf_client_notify_add (chooser->priv->client, + KEY_SOUNDS_DIR, + (GConfClientNotifyFunc)on_key_changed, + chooser, NULL, NULL); + gconf_client_add_dir (chooser->priv->client, KEY_METACITY_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + chooser->priv->metacity_dir_id = gconf_client_notify_add (chooser->priv->client, + KEY_METACITY_DIR, + (GConfClientNotifyFunc)on_key_changed, + chooser, NULL, NULL); + + /* FIXME: should accept drag and drop themes. should also + add an "Add Theme..." item to the theme combobox */ +} + +static void +gvc_sound_theme_chooser_finalize (GObject *object) +{ + GvcSoundThemeChooser *sound_theme_chooser; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_SOUND_THEME_CHOOSER (object)); + + sound_theme_chooser = GVC_SOUND_THEME_CHOOSER (object); + + if (sound_theme_chooser->priv != NULL) { + if (sound_theme_chooser->priv->sounds_dir_id > 0) { + gconf_client_notify_remove (sound_theme_chooser->priv->client, + sound_theme_chooser->priv->sounds_dir_id); + sound_theme_chooser->priv->sounds_dir_id = 0; + } + if (sound_theme_chooser->priv->metacity_dir_id > 0) { + gconf_client_notify_remove (sound_theme_chooser->priv->client, + sound_theme_chooser->priv->metacity_dir_id); + sound_theme_chooser->priv->metacity_dir_id = 0; + } + g_object_unref (sound_theme_chooser->priv->client); + sound_theme_chooser->priv->client = NULL; + } + + G_OBJECT_CLASS (gvc_sound_theme_chooser_parent_class)->finalize (object); +} + +GtkWidget * +gvc_sound_theme_chooser_new (void) +{ + GObject *chooser; + chooser = g_object_new (GVC_TYPE_SOUND_THEME_CHOOSER, + "spacing", 6, + NULL); + return GTK_WIDGET (chooser); +} diff --git a/panels/sound/gvc-sound-theme-chooser.h b/panels/sound/gvc-sound-theme-chooser.h new file mode 100644 index 000000000..6701aad73 --- /dev/null +++ b/panels/sound/gvc-sound-theme-chooser.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_SOUND_THEME_CHOOSER_H +#define __GVC_SOUND_THEME_CHOOSER_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_SOUND_THEME_CHOOSER (gvc_sound_theme_chooser_get_type ()) +#define GVC_SOUND_THEME_CHOOSER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_SOUND_THEME_CHOOSER, GvcSoundThemeChooser)) +#define GVC_SOUND_THEME_CHOOSER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_SOUND_THEME_CHOOSER, GvcSoundThemeChooserClass)) +#define GVC_IS_SOUND_THEME_CHOOSER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_SOUND_THEME_CHOOSER)) +#define GVC_IS_SOUND_THEME_CHOOSER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_SOUND_THEME_CHOOSER)) +#define GVC_SOUND_THEME_CHOOSER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_SOUND_THEME_CHOOSER, GvcSoundThemeChooserClass)) + +typedef struct GvcSoundThemeChooserPrivate GvcSoundThemeChooserPrivate; + +typedef struct +{ + GtkVBox parent; + GvcSoundThemeChooserPrivate *priv; +} GvcSoundThemeChooser; + +typedef struct +{ + GtkVBoxClass parent_class; +} GvcSoundThemeChooserClass; + +GType gvc_sound_theme_chooser_get_type (void); + +GtkWidget * gvc_sound_theme_chooser_new (void); + +G_END_DECLS + +#endif /* __GVC_SOUND_THEME_CHOOSER_H */ diff --git a/panels/sound/gvc-sound-theme-editor.c b/panels/sound/gvc-sound-theme-editor.c new file mode 100644 index 000000000..cec408e84 --- /dev/null +++ b/panels/sound/gvc-sound-theme-editor.c @@ -0,0 +1,1397 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net> + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <canberra-gtk.h> + +#include <gconf/gconf-client.h> + +#include "gvc-sound-theme-editor.h" +#include "sound-theme-file-utils.h" + +#define GVC_SOUND_THEME_EDITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_SOUND_THEME_EDITOR, GvcSoundThemeEditorPrivate)) + +struct GvcSoundThemeEditorPrivate +{ + GtkWidget *treeview; + GtkWidget *theme_box; + GtkWidget *selection_box; + GtkWidget *click_feedback_button; + GConfClient *client; + guint sounds_dir_id; + guint metacity_dir_id; +}; + +static void gvc_sound_theme_editor_class_init (GvcSoundThemeEditorClass *klass); +static void gvc_sound_theme_editor_init (GvcSoundThemeEditor *sound_theme_editor); +static void gvc_sound_theme_editor_finalize (GObject *object); + +G_DEFINE_TYPE (GvcSoundThemeEditor, gvc_sound_theme_editor, GTK_TYPE_VBOX) + +typedef enum { + CATEGORY_INVALID, + CATEGORY_BELL, + CATEGORY_WINDOWS_BUTTONS, + CATEGORY_DESKTOP, + CATEGORY_ALERTS, + NUM_CATEGORIES +} CategoryType; + +typedef enum { + SOUND_TYPE_NORMAL, + SOUND_TYPE_AUDIO_BELL, + SOUND_TYPE_FEEDBACK +} SoundType; + +static struct { + CategoryType category; + SoundType type; + const char *display_name; + const char *names[6]; +} sounds[20] = { + /* Bell */ + { CATEGORY_BELL, SOUND_TYPE_AUDIO_BELL, NC_("Sound event", "Alert sound"), { "bell-terminal", "bell-window-system", NULL } }, + /* Windows and buttons */ + { CATEGORY_WINDOWS_BUTTONS, -1, NC_("Sound event", "Windows and Buttons"), { NULL } }, + { CATEGORY_WINDOWS_BUTTONS, SOUND_TYPE_FEEDBACK, NC_("Sound event", "Button clicked"), { "button-pressed", "menu-click", "menu-popup", "menu-popdown", "menu-replace", NULL } }, + { CATEGORY_WINDOWS_BUTTONS, SOUND_TYPE_FEEDBACK, NC_("Sound event", "Toggle button clicked"), { "button-toggle-off", "button-toggle-on", NULL } }, + { CATEGORY_WINDOWS_BUTTONS, SOUND_TYPE_FEEDBACK, NC_("Sound event", "Window maximized"), { "window-maximized", NULL } }, + { CATEGORY_WINDOWS_BUTTONS, SOUND_TYPE_FEEDBACK, NC_("Sound event", "Window unmaximized"), { "window-unmaximized", NULL } }, + { CATEGORY_WINDOWS_BUTTONS, SOUND_TYPE_FEEDBACK, NC_("Sound event", "Window minimised"), { "window-minimized", NULL } }, + /* Desktop */ + { CATEGORY_DESKTOP, -1, NC_("Sound event", "Desktop"), { NULL } }, + { CATEGORY_DESKTOP, SOUND_TYPE_NORMAL, NC_("Sound event", "Login"), { "desktop-login", NULL } }, + { CATEGORY_DESKTOP, SOUND_TYPE_NORMAL, NC_("Sound event", "Logout"), { "desktop-logout", NULL } }, + { CATEGORY_DESKTOP, SOUND_TYPE_NORMAL, NC_("Sound event", "New e-mail"), { "message-new-email", NULL } }, + { CATEGORY_DESKTOP, SOUND_TYPE_NORMAL, NC_("Sound event", "Empty trash"), { "trash-empty", NULL } }, + { CATEGORY_DESKTOP, SOUND_TYPE_NORMAL, NC_("Sound event", "Long action completed (download, CD burning, etc.)"), { "complete-copy", "complete-download", "complete-media-burn", "complete-media-rip", "complete-scan", NULL } }, + /* Alerts? */ + { CATEGORY_ALERTS, -1, NC_("Sound event", "Alerts"), { NULL } }, + { CATEGORY_ALERTS, SOUND_TYPE_NORMAL, NC_("Sound event", "Information or question"), { "dialog-information", "dialog-question", NULL } }, + { CATEGORY_ALERTS, SOUND_TYPE_NORMAL, NC_("Sound event", "Warning"), { "dialog-warning", NULL } }, + { CATEGORY_ALERTS, SOUND_TYPE_NORMAL, NC_("Sound event", "Error"), { "dialog-error", NULL } }, + { CATEGORY_ALERTS, SOUND_TYPE_NORMAL, NC_("Sound event", "Battery warning"), { "power-unplug-battery-low", "battery-low", "battery-caution", NULL } }, + /* Finish off */ + { -1, -1, NULL, { NULL } } +}; + +#define KEY_SOUNDS_DIR "/desktop/gnome/sound" +#define EVENT_SOUNDS_KEY KEY_SOUNDS_DIR "/event_sounds" +#define INPUT_SOUNDS_KEY KEY_SOUNDS_DIR "/input_feedback_sounds" +#define SOUND_THEME_KEY KEY_SOUNDS_DIR "/theme_name" +#define KEY_METACITY_DIR "/apps/metacity/general" +#define AUDIO_BELL_KEY KEY_METACITY_DIR "/audible_bell" + +#define CUSTOM_THEME_NAME "__custom" +#define NO_SOUNDS_THEME_NAME "__no_sounds" +#define PREVIEW_BUTTON_XPAD 5 + +enum { + THEME_DISPLAY_COL, + THEME_IDENTIFIER_COL, + THEME_PARENT_ID_COL, + THEME_NUM_COLS +}; + +enum { + SOUND_UNSET, + SOUND_OFF, + SOUND_BUILTIN, + SOUND_CUSTOM, + SOUND_CUSTOM_OLD +}; + +enum { + DISPLAY_COL, + SETTING_COL, + TYPE_COL, + SENSITIVE_COL, + HAS_PREVIEW_COL, + FILENAME_COL, + SOUND_NAMES_COL, + NUM_COLS +}; + +static gboolean +theme_changed_custom_reinit (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + int type; + gboolean sensitive; + + gtk_tree_model_get (model, + iter, + TYPE_COL, &type, + SENSITIVE_COL, &sensitive, -1); + if (type != -1) { + gtk_tree_store_set (GTK_TREE_STORE (model), iter, + SETTING_COL, SOUND_BUILTIN, + HAS_PREVIEW_COL, sensitive, + -1); + } + return FALSE; +} + +static void +on_theme_changed () +{ + /* Don't reinit a custom theme */ + if (strcmp (theme_name, CUSTOM_THEME_NAME) != 0) { + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + gtk_tree_model_foreach (model, theme_changed_custom_reinit, NULL); + + /* Delete the custom dir */ + delete_custom_theme_dir (); + + /* And the combo box entry */ + model = gtk_combo_box_get_model (GTK_COMBO_BOX (editor->priv->combo_box)); + gtk_tree_model_get_iter_first (model, &iter); + do { + char *parent; + gtk_tree_model_get (model, &iter, THEME_PARENT_ID_COL, &parent, -1); + if (parent != NULL && strcmp (parent, CUSTOM_THEME_NAME) != 0) { + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + g_free (parent); + break; + } + g_free (parent); + } while (gtk_tree_model_iter_next (model, &iter)); + } +} + +static char * +load_index_theme_name (const char *index, + char **parent) +{ + GKeyFile *file; + char *indexname = NULL; + gboolean hidden; + + file = g_key_file_new (); + if (g_key_file_load_from_file (file, index, G_KEY_FILE_KEEP_TRANSLATIONS, NULL) == FALSE) { + g_key_file_free (file); + return NULL; + } + /* Don't add hidden themes to the list */ + hidden = g_key_file_get_boolean (file, "Sound Theme", "Hidden", NULL); + if (!hidden) { + indexname = g_key_file_get_locale_string (file, + "Sound Theme", + "Name", + NULL, + NULL); + + /* Save the parent theme, if there's one */ + if (parent != NULL) { + *parent = g_key_file_get_string (file, + "Sound Theme", + "Inherits", + NULL); + } + } + + g_key_file_free (file); + return indexname; +} + +static void +sound_theme_in_dir (GHashTable *hash, + const char *dir) +{ + GDir *d; + const char *name; + + d = g_dir_open (dir, 0, NULL); + if (d == NULL) { + return; + } + + while ((name = g_dir_read_name (d)) != NULL) { + char *dirname, *index, *indexname; + + /* Look for directories */ + dirname = g_build_filename (dir, name, NULL); + if (g_file_test (dirname, G_FILE_TEST_IS_DIR) == FALSE) { + g_free (dirname); + continue; + } + + /* Look for index files */ + index = g_build_filename (dirname, "index.theme", NULL); + g_free (dirname); + + /* Check the name of the theme in the index.theme file */ + indexname = load_index_theme_name (index, NULL); + g_free (index); + if (indexname == NULL) { + continue; + } + + g_hash_table_insert (hash, g_strdup (name), indexname); + } + + g_dir_close (d); +} + +static void +add_theme_to_store (const char *key, + const char *value, + GtkListStore *store) +{ + char *parent; + + parent = NULL; + + /* Get the parent, if we're checking the custom theme */ + if (strcmp (key, CUSTOM_THEME_NAME) == 0) { + char *name, *path; + + path = custom_theme_dir_path ("index.theme"); + name = load_index_theme_name (path, &parent); + g_free (name); + g_free (path); + } + gtk_list_store_insert_with_values (store, NULL, G_MAXINT, + THEME_DISPLAY_COL, value, + THEME_IDENTIFIER_COL, key, + THEME_PARENT_ID_COL, parent, + -1); + g_free (parent); +} + +static void +set_theme_name (GvcSoundThemeEditor *editor, + const char *name) +{ + GConfClient *client; + + g_debug ("setting theme %s", name ? name : "(null)"); + + /* If the name is empty, use "freedesktop" */ + if (name == NULL || *name == '\0') { + name = "freedesktop"; + } + + gconf_client_set_string (editor->priv->client, SOUND_THEME_KEY, theme_name, NULL); +} + +/* Functions to toggle whether the audible bell sound is editable */ +static gboolean +audible_bell_foreach (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + int type; + int setting; + gboolean enabled = GPOINTER_TO_INT (data); + + setting = enabled ? SOUND_BUILTIN : SOUND_OFF; + + gtk_tree_model_get (model, iter, TYPE_COL, &type, -1); + if (type == SOUND_TYPE_AUDIO_BELL) { + gtk_tree_store_set (GTK_TREE_STORE (model), + iter, + SETTING_COL, setting, + HAS_PREVIEW_COL, enabled, + -1); + return TRUE; + } + return FALSE; +} + +static void +set_audible_bell_enabled (GvcSoundThemeEditor *editor, + gboolean enabled) +{ + GtkTreeModel *model; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + gtk_tree_model_foreach (model, audible_bell_foreach, GINT_TO_POINTER (enabled)); +} + +/* Functions to toggle whether the Input feedback sounds are editable */ +static gboolean +input_feedback_foreach (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + int type; + gboolean enabled = GPOINTER_TO_INT (data); + + gtk_tree_model_get (model, iter, TYPE_COL, &type, -1); + if (type == SOUND_TYPE_FEEDBACK) { + gtk_tree_store_set (GTK_TREE_STORE (model), iter, + SENSITIVE_COL, enabled, + HAS_PREVIEW_COL, enabled, + -1); + } + return FALSE; +} + +static void +set_input_feedback_enabled (GvcSoundThemeEditor *editor, + gboolean enabled) +{ + GtkTreeModel *model; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->click_feedback_button), + enabled); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + gtk_tree_model_foreach (model, input_feedback_foreach, GINT_TO_POINTER (enabled)); +} + +static int +get_file_type (const char *sound_name, + char **linked_name) +{ + char *name, *filename; + + *linked_name = NULL; + + name = g_strdup_printf ("%s.disabled", sound_name); + filename = custom_theme_dir_path (name); + g_free (name); + + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) != FALSE) { + g_free (filename); + return SOUND_OFF; + } + g_free (filename); + + /* We only check for .ogg files because those are the + * only ones we create */ + name = g_strdup_printf ("%s.ogg", sound_name); + filename = custom_theme_dir_path (name); + g_free (name); + + if (g_file_test (filename, G_FILE_TEST_IS_SYMLINK) != FALSE) { + *linked_name = g_file_read_link (filename, NULL); + g_free (filename); + return SOUND_CUSTOM; + } + g_free (filename); + + return SOUND_BUILTIN; +} + +static gboolean +theme_changed_custom_init (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + char **sound_names; + + gtk_tree_model_get (model, iter, SOUND_NAMES_COL, &sound_names, -1); + if (sound_names != NULL) { + char *filename; + int type; + + type = get_file_type (sound_names[0], &filename); + + gtk_tree_store_set (GTK_TREE_STORE (model), iter, + SETTING_COL, type, + HAS_PREVIEW_COL, type != SOUND_OFF, + FILENAME_COL, filename, + -1); + g_strfreev (sound_names); + g_free (filename); + } + return FALSE; +} + +static void +update_theme (GvcSoundThemeEditor *editor) +{ + char *theme_name; + gboolean events_enabled; + gboolean bell_enabled; + GConfClient *client; + gboolean feedback_enabled; + + client = editor->priv->client; + + bell_enabled = gconf_client_get_bool (client, AUDIO_BELL_KEY, NULL); + set_audible_bell_enabled (editor, bell_enabled); + + feedback_enabled = gconf_client_get_bool (client, INPUT_SOUNDS_KEY, NULL); + set_input_feedback_enabled (editor, feedback_enabled); + + events_enabled = gconf_client_get_bool (client, EVENT_SOUNDS_KEY, NULL); + if (events_enabled) { + theme_name = gconf_client_get_string (client, SOUND_THEME_KEY, NULL); + } else { + theme_name = g_strdup (NO_SOUNDS_THEME_NAME); + } + + gtk_widget_set_sensitive (editor->priv->selection_box, events_enabled); + + set_theme_name (editor, theme_name); + + /* Setup the default values if we're using the custom theme */ + if (theme_name != NULL && strcmp (theme_name, CUSTOM_THEME_NAME) == 0) { + GtkTreeModel *model; + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + gtk_tree_model_foreach (model, + theme_changed_custom_init, + NULL); + } + g_free (theme_name); +} + +static void +setup_theme_selector (GvcSoundThemeEditor *editor) +{ + GHashTable *hash; + GtkListStore *store; + GtkCellRenderer *renderer; + const char * const *data_dirs; + const char *data_dir; + char *dir; + guint i; + + /* Add the theme names and their display name to a hash table, + * makes it easy to avoid duplicate themes */ + hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + data_dirs = g_get_system_data_dirs (); + for (i = 0; data_dirs[i] != NULL; i++) { + dir = g_build_filename (data_dirs[i], "sounds", NULL); + sound_theme_in_dir (hash, dir); + g_free (dir); + } + + data_dir = g_get_user_data_dir (); + dir = g_build_filename (data_dir, "sounds", NULL); + sound_theme_in_dir (hash, dir); + g_free (dir); + + /* If there isn't at least one theme, make everything + * insensitive, LAME! */ + if (g_hash_table_size (hash) == 0) { + gtk_widget_set_sensitive (GTK_WIDGET (editor), FALSE); + g_warning ("Bad setup, install the freedesktop sound theme"); + g_hash_table_destroy (hash); + return; + } + + /* Setup the tree model, 3 columns: + * - internal theme name/directory + * - display theme name + * - the internal id for the parent theme, used for the custom theme */ + store = gtk_list_store_new (THEME_NUM_COLS, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING); + + /* Add the themes to a combobox */ + gtk_list_store_insert_with_values (store, + NULL, + G_MAXINT, + THEME_DISPLAY_COL, _("No sounds"), + THEME_IDENTIFIER_COL, "__no_sounds", + THEME_PARENT_ID_COL, NULL, + -1); + g_hash_table_foreach (hash, (GHFunc) add_theme_to_store, store); + g_hash_table_destroy (hash); + + /* Set the display */ + gtk_combo_box_set_model (GTK_COMBO_BOX (editor->priv->combo_box), + GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (editor->priv->combo_box), + renderer, + TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (editor->priv->combo_box), + renderer, + "text", THEME_DISPLAY_COL, + NULL); + + g_signal_connect (editor->priv->combo_box, + "changed", + G_CALLBACK (on_combobox_changed), + editor); +} + +static void +play_sound_preview (GtkFileEditor *editor, + gpointer user_data) +{ + char *filename; + + filename = gtk_file_editor_get_preview_filename (GTK_FILE_EDITOR (editor)); + if (filename == NULL) { + return; + } + + ca_gtk_play_for_widget (GTK_WIDGET (editor), 0, + CA_PROP_APPLICATION_NAME, _("Sound Preferences"), + CA_PROP_MEDIA_FILENAME, filename, + CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"), + CA_PROP_CANBERRA_CACHE_CONTROL, "never", + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", +#ifdef CA_PROP_CANBERRA_ENABLE + CA_PROP_CANBERRA_ENABLE, "1", +#endif + NULL); + g_free (filename); +} + +static char * +get_sound_filename (GvcSoundThemeEditor *editor) +{ + GtkWidget *file_editor; + GtkWidget *toplevel; + GtkWindow *parent; + int response; + char *filename; + char *path; + const char * const *data_dirs, *data_dir; + GtkFileFilter *filter; + guint i; + + /* Try to get the parent window of the widget */ + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (editor)); + if (gtk_widget_is_toplevel (toplevel) != FALSE) + parent = GTK_WINDOW (toplevel); + else + parent = NULL; + + file_editor = gtk_file_editor_dialog_new (_("Select Sound File"), + parent, + GTK_FILE_EDITOR_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_file_editor_set_local_only (GTK_FILE_EDITOR (file_editor), TRUE); + gtk_file_editor_set_select_multiple (GTK_FILE_EDITOR (file_editor), FALSE); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Sound files")); + gtk_file_filter_add_mime_type (filter, "audio/x-vorbis+ogg"); + gtk_file_filter_add_mime_type (filter, "audio/x-wav"); + gtk_file_editor_add_filter (GTK_FILE_EDITOR (file_editor), filter); + gtk_file_editor_set_filter (GTK_FILE_EDITOR (file_editor), filter); + + g_signal_connect (file_editor, "update-preview", + G_CALLBACK (play_sound_preview), NULL); + + data_dirs = g_get_system_data_dirs (); + for (i = 0; data_dirs[i] != NULL; i++) { + path = g_build_filename (data_dirs[i], "sounds", NULL); + gtk_file_editor_add_shortcut_folder (GTK_FILE_EDITOR (file_editor), path, NULL); + g_free (path); + } + data_dir = g_get_user_special_dir (G_USER_DIRECTORY_MUSIC); + if (data_dir != NULL) + gtk_file_editor_add_shortcut_folder (GTK_FILE_EDITOR (file_editor), data_dir, NULL); + + gtk_file_editor_set_current_folder (GTK_FILE_EDITOR (file_editor), SOUND_DATA_DIR); + + response = gtk_dialog_run (GTK_DIALOG (file_editor)); + filename = NULL; + if (response == GTK_RESPONSE_ACCEPT) + filename = gtk_file_editor_get_filename (GTK_FILE_EDITOR (file_editor)); + + gtk_widget_destroy (file_editor); + + return filename; +} + + +static gboolean +count_customised_sounds (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + int *num_custom) +{ + int type; + int setting; + + gtk_tree_model_get (model, iter, TYPE_COL, &type, SETTING_COL, &setting, -1); + if (setting == SOUND_OFF || setting == SOUND_CUSTOM || setting == SOUND_CUSTOM_OLD) { + (*num_custom)++; + } + + return FALSE; +} + +static gboolean +save_sounds (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + int type; + int setting; + char *filename; + char **sounds; + + gtk_tree_model_get (model, iter, + TYPE_COL, &type, + SETTING_COL, &setting, + FILENAME_COL, &filename, + SOUND_NAMES_COL, &sounds, + -1); + + if (setting == SOUND_BUILTIN) { + delete_old_files (sounds); + delete_disabled_files (sounds); + } else if (setting == SOUND_OFF) { + delete_old_files (sounds); + add_disabled_file (sounds); + } else if (setting == SOUND_CUSTOM || setting == SOUND_CUSTOM_OLD) { + delete_old_files (sounds); + delete_disabled_files (sounds); + add_custom_file (sounds, filename); + } + g_free (filename); + g_strfreev (sounds); + + return FALSE; +} + +static void +save_custom_theme (GtkTreeModel *model, + const char *parent) +{ + GKeyFile *keyfile; + char *data; + char *path; + + /* Create the custom directory */ + path = custom_theme_dir_path (NULL); + g_mkdir_with_parents (path, 0755); + g_free (path); + + /* Save the sounds themselves */ + gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) save_sounds, NULL); + + /* Set the data for index.theme */ + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "Sound Theme", "Name", _("Custom")); + g_key_file_set_string (keyfile, "Sound Theme", "Inherits", parent); + g_key_file_set_string (keyfile, "Sound Theme", "Directories", "."); + data = g_key_file_to_data (keyfile, NULL, NULL); + g_key_file_free (keyfile); + + /* Save the index.theme */ + path = custom_theme_dir_path ("index.theme"); + g_file_set_contents (path, data, -1, NULL); + g_free (path); + g_free (data); + + custom_theme_update_time (); +} + +static void +dump_theme (GvcSoundThemeEditor *editor) +{ + int num_custom; + GtkTreeModel *model; + GtkTreeIter iter; + char *parent; + + num_custom = 0; + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) count_customised_sounds, &num_custom); + + g_debug ("%d customised sounds", num_custom); + + model = gtk_combo_box_get_model (GTK_COMBO_BOX (editor->priv->combo_box)); + /* Get the current theme's name, and set the parent */ + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (editor->priv->combo_box), &iter) == FALSE) + return; + + if (num_custom == 0) { + gtk_tree_model_get (model, &iter, THEME_PARENT_ID_COL, &parent, -1); + if (parent != NULL) { + set_theme_name (editor, parent); + g_free (parent); + } + gtk_tree_model_get_iter_first (model, &iter); + do { + gtk_tree_model_get (model, &iter, THEME_PARENT_ID_COL, &parent, -1); + if (parent != NULL && strcmp (parent, CUSTOM_THEME_NAME) != 0) { + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + break; + } + } while (gtk_tree_model_iter_next (model, &iter)); + + delete_custom_theme_dir (); + } else { + gtk_tree_model_get (model, &iter, THEME_IDENTIFIER_COL, &parent, -1); + if (strcmp (parent, CUSTOM_THEME_NAME) != 0) { + gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, G_MAXINT, + THEME_DISPLAY_COL, _("Custom"), + THEME_IDENTIFIER_COL, CUSTOM_THEME_NAME, + THEME_PARENT_ID_COL, parent, + -1); + } else { + g_free (parent); + gtk_tree_model_get (model, &iter, THEME_PARENT_ID_COL, &parent, -1); + } + + g_debug ("The parent theme is: %s", parent); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + save_custom_theme (model, parent); + g_free (parent); + + set_theme_name (editor, CUSTOM_THEME_NAME); + } +} + +static void +on_setting_column_edited (GtkCellRendererText *renderer, + char *path, + char *new_text, + GvcSoundThemeEditor *editor) +{ + GtkTreeModel *model; + GtkTreeModel *tree_model; + GtkTreeIter iter; + GtkTreeIter tree_iter; + SoundType type; + char *text; + char *old_filename; + int setting; + + if (new_text == NULL) { + return; + } + + g_object_get (renderer, + "model", &model, + NULL); + + tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + if (gtk_tree_model_get_iter_from_string (tree_model, &tree_iter, path) == FALSE) + return; + + gtk_tree_model_get (tree_model, &tree_iter, + TYPE_COL, &type, + FILENAME_COL, &old_filename, + -1); + + gtk_tree_model_get_iter_first (model, &iter); + do { + int cmp; + + gtk_tree_model_get (model, &iter, + 0, &text, + 1, &setting, + -1); + cmp = g_utf8_collate (text, new_text); + g_free (text); + + if (cmp != 0) { + continue; + } + + if (type == SOUND_TYPE_NORMAL + || type == SOUND_TYPE_FEEDBACK + || type == SOUND_TYPE_AUDIO_BELL) { + + if (setting == SOUND_CUSTOM + || (setting == SOUND_CUSTOM_OLD + && old_filename == NULL)) { + + char *filename = get_sound_filename (editor); + + if (filename == NULL) { + break; + } + gtk_tree_store_set (GTK_TREE_STORE (tree_model), + &tree_iter, + SETTING_COL, setting, + HAS_PREVIEW_COL, setting != SOUND_OFF, + FILENAME_COL, filename, + -1); + g_free (filename); + } else if (setting == SOUND_CUSTOM_OLD) { + gtk_tree_store_set (GTK_TREE_STORE (tree_model), + &tree_iter, + SETTING_COL, setting, + HAS_PREVIEW_COL, setting != SOUND_OFF, + FILENAME_COL, old_filename, + -1); + } else { + gtk_tree_store_set (GTK_TREE_STORE (tree_model), + &tree_iter, + SETTING_COL, setting, + HAS_PREVIEW_COL, setting != SOUND_OFF, + -1); + } + + g_debug ("Something changed, dump theme"); + dump_theme (editor); + + break; + } + + g_assert_not_reached (); + + } while (gtk_tree_model_iter_next (model, &iter)); + + g_free (old_filename); +} + +static void +fill_custom_model (GtkListStore *store, + const char *prev_filename) +{ + GtkTreeIter iter; + + gtk_list_store_clear (store); + + if (prev_filename != NULL) { + char *display; + display = g_filename_display_basename (prev_filename); + gtk_list_store_insert_with_values (store, &iter, G_MAXINT, + 0, display, + 1, SOUND_CUSTOM_OLD, + -1); + g_free (display); + } + + gtk_list_store_insert_with_values (store, &iter, G_MAXINT, + 0, _("Default"), + 1, SOUND_BUILTIN, + -1); + gtk_list_store_insert_with_values (store, &iter, G_MAXINT, + 0, _("Disabled"), + 1, SOUND_OFF, + -1); + gtk_list_store_insert_with_values (store, &iter, G_MAXINT, + 0, _("Custom…"), + 1, SOUND_CUSTOM, -1); +} + +static void +on_combobox_editing_started (GtkCellRenderer *renderer, + GtkCellEditable *editable, + gchar *path, + GvcSoundThemeEditor *editor) +{ + GtkTreeModel *model; + GtkTreeModel *store; + GtkTreeIter iter; + SoundType type; + char *filename; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (editor->priv->treeview)); + if (gtk_tree_model_get_iter_from_string (model, &iter, path) == FALSE) { + return; + } + + gtk_tree_model_get (model, &iter, TYPE_COL, &type, FILENAME_COL, &filename, -1); + g_object_get (renderer, "model", &store, NULL); + fill_custom_model (GTK_LIST_STORE (store), filename); + g_free (filename); +} + +static gboolean +play_sound_at_path (GtkWidget *tree_view, + GtkTreePath *path) +{ + GtkTreeModel *model; + GtkTreeIter iter; + char **sound_names; + gboolean sensitive; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); + if (gtk_tree_model_get_iter (model, &iter, path) == FALSE) { + return FALSE; + } + + gtk_tree_model_get (model, &iter, + SOUND_NAMES_COL, &sound_names, + SENSITIVE_COL, &sensitive, + -1); + if (!sensitive || sound_names == NULL) { + return FALSE; + } + + ca_gtk_play_for_widget (GTK_WIDGET (tree_view), 0, + CA_PROP_APPLICATION_NAME, _("Sound Preferences"), + CA_PROP_EVENT_ID, sound_names[0], + CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"), + CA_PROP_CANBERRA_CACHE_CONTROL, "never", + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", +#ifdef CA_PROP_CANBERRA_ENABLE + CA_PROP_CANBERRA_ENABLE, "1", +#endif + NULL); + + g_strfreev (sound_names); + + return TRUE; +} + +static void +setting_set_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + int setting; + char *filename; + SoundType type; + + gtk_tree_model_get (model, iter, + SETTING_COL, &setting, + FILENAME_COL, &filename, + TYPE_COL, &type, + -1); + + if (setting == SOUND_UNSET) { + g_object_set (cell, + "visible", FALSE, + NULL); + g_free (filename); + return; + } + + if (setting == SOUND_OFF) { + g_object_set (cell, + "text", _("Disabled"), + NULL); + } else if (setting == SOUND_BUILTIN) { + g_object_set (cell, + "text", _("Default"), + NULL); + } else if (setting == SOUND_CUSTOM || setting == SOUND_CUSTOM_OLD) { + char *display; + + display = g_filename_display_basename (filename); + g_object_set (cell, + "text", display, + NULL); + g_free (display); + } + + g_free (filename); +} + +typedef GtkCellRendererPixbuf ActivatableCellRendererPixbuf; +typedef GtkCellRendererPixbufClass ActivatableCellRendererPixbufClass; + +GType activatable_cell_renderer_pixbuf_get_type (void); +#define ACTIVATABLE_TYPE_CELL_RENDERER_PIXBUF (activatable_cell_renderer_pixbuf_get_type ()) +G_DEFINE_TYPE (ActivatableCellRendererPixbuf, activatable_cell_renderer_pixbuf, GTK_TYPE_CELL_RENDERER_PIXBUF); + +static gboolean +activatable_cell_renderer_pixbuf_activate (GtkCellRenderer *cell, + GdkEvent *event, + GtkWidget *widget, + const gchar *path_string, + GdkRectangle *background_area, + GdkRectangle *cell_area, + GtkCellRendererState flags) +{ + GtkTreePath *path; + gboolean res; + + g_debug ("Activating pixbuf"); + + path = gtk_tree_path_new_from_string (path_string); + res = play_sound_at_path (widget, path); + gtk_tree_path_free (path); + + return res; +} + +static void +activatable_cell_renderer_pixbuf_init (ActivatableCellRendererPixbuf *cell) +{ +} + +static void +activatable_cell_renderer_pixbuf_class_init (ActivatableCellRendererPixbufClass *class) +{ + GtkCellRendererClass *cell_class; + + cell_class = GTK_CELL_RENDERER_CLASS (class); + + cell_class->activate = activatable_cell_renderer_pixbuf_activate; +} + +static void +setup_theme_custom_selector (GvcSoundThemeEditor *editor, + gboolean have_xkb ) +{ + GtkTreeStore *store; + GtkTreeModel *custom_model; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeIter iter; + GtkTreeIter parent; + CategoryType type; + guint i; + + /* Set up the model for the custom view */ + store = gtk_tree_store_new (NUM_COLS, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_STRING, + G_TYPE_STRV); + + /* The first column with the categories/sound names */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Display", renderer, + "text", DISPLAY_COL, + "sensitive", SENSITIVE_COL, + "ellipsize", PANGO_ELLIPSIZE_START, + "ellipsize-set", TRUE, + NULL); + g_object_set (G_OBJECT (column), "expand", TRUE, NULL); + + gtk_tree_view_append_column (GTK_TREE_VIEW (editor->priv->treeview), column); + + /* The 2nd column with the sound settings */ + renderer = gtk_cell_renderer_combo_new (); + g_signal_connect (renderer, + "edited", + G_CALLBACK (on_setting_column_edited), + editor); + g_signal_connect (renderer, + "editing-started", + G_CALLBACK (on_combobox_editing_started), + editor); + custom_model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT)); + fill_custom_model (GTK_LIST_STORE (custom_model), NULL); + + g_object_set (renderer, + "model", custom_model, + "has-entry", FALSE, + "editable", TRUE, + "text-column", 0, + NULL); + column = gtk_tree_view_column_new_with_attributes ("Setting", renderer, + "editable", SENSITIVE_COL, + "sensitive", SENSITIVE_COL, + "visible", TRUE, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (editor->priv->treeview), column); + gtk_tree_view_column_set_cell_data_func (column, renderer, setting_set_func, NULL, NULL); + + /* The 3rd column with the preview pixbuf */ + renderer = g_object_new (ACTIVATABLE_TYPE_CELL_RENDERER_PIXBUF, NULL); + g_object_set (renderer, + "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, + "icon-name", "media-playback-start", + "stock-size", GTK_ICON_SIZE_MENU, + NULL); + column = gtk_tree_view_column_new_with_attributes ("Preview", renderer, + "visible", HAS_PREVIEW_COL, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (editor->priv->treeview), column); + g_object_set_data (G_OBJECT (editor->priv->treeview), "preview-column", column); + + gtk_tree_view_set_model (GTK_TREE_VIEW (editor->priv->treeview), GTK_TREE_MODEL (store)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (editor->priv->treeview), FALSE); + + /* Fill in the model */ + type = CATEGORY_INVALID; + + for (i = 0; ; i++) { + GtkTreeIter *_parent; + + if (sounds[i].category == -1) { + break; + } + + /* Is it a new type of sound? */ + if (sounds[i].category == type + && type != CATEGORY_INVALID + && type != CATEGORY_BELL) { + _parent = &parent; + } else { + _parent = NULL; + } + + if (sounds[i].type != -1) { + gtk_tree_store_insert_with_values (store, &iter, _parent, G_MAXINT, + DISPLAY_COL, g_dpgettext2 (NULL, "Sound event", sounds[i].display_name), + SETTING_COL, SOUND_BUILTIN, + TYPE_COL, sounds[i].type, + SOUND_NAMES_COL, sounds[i].names, + HAS_PREVIEW_COL, TRUE, + SENSITIVE_COL, TRUE, + -1); + } else { + /* Category */ + gtk_tree_store_insert_with_values (store, &iter, _parent, G_MAXINT, + DISPLAY_COL, g_dpgettext2 (NULL, "Sound event", sounds[i].display_name), + SETTING_COL, SOUND_UNSET, + TYPE_COL, sounds[i].type, + SENSITIVE_COL, TRUE, + HAS_PREVIEW_COL, FALSE, + -1); + } + + /* If we didn't set a parent already, set one in case we need it later */ + if (_parent == NULL) { + parent = iter; + } + type = sounds[i].category; + } + + gtk_tree_view_expand_all (GTK_TREE_VIEW (editor->priv->treeview)); +} + +static GObject * +gvc_sound_theme_editor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcSoundThemeEditor *self; + + object = G_OBJECT_CLASS (gvc_sound_theme_editor_parent_class)->constructor (type, n_construct_properties, construct_params); + + self = GVC_SOUND_THEME_EDITOR (object); + + setup_theme_selector (self); + setup_theme_custom_selector (self, TRUE); + + update_theme (self); + + return object; +} + +static void +gvc_sound_theme_editor_class_init (GvcSoundThemeEditorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_sound_theme_editor_constructor; + object_class->finalize = gvc_sound_theme_editor_finalize; + + g_type_class_add_private (klass, sizeof (GvcSoundThemeEditorPrivate)); +} + +static void +on_click_feedback_toggled (GtkToggleButton *button, + GvcSoundThemeEditor *editor) +{ + GConfClient *client; + gboolean enabled; + + enabled = gtk_toggle_button_get_active (button); + + client = gconf_client_get_default (); + gconf_client_set_bool (client, INPUT_SOUNDS_KEY, enabled, NULL); + g_object_unref (client); +} + +static void +on_key_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + GvcSoundThemeEditor *editor) +{ + const char *key; + GConfValue *value; + + key = gconf_entry_get_key (entry); + + if (! g_str_has_prefix (key, KEY_SOUNDS_DIR) + && ! g_str_has_prefix (key, KEY_METACITY_DIR)) { + return; + } + + value = gconf_entry_get_value (entry); + if (strcmp (key, EVENT_SOUNDS_KEY) == 0) { + update_theme (editor); + } else if (strcmp (key, SOUND_THEME_KEY) == 0) { + update_theme (editor); + } else if (strcmp (key, INPUT_SOUNDS_KEY) == 0) { + update_theme (editor); + } else if (strcmp (key, AUDIO_BELL_KEY) == 0) { + update_theme (editor); + } +} + +static void +on_treeview_row_activated (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + GvcSoundThemeEditor *editor) +{ + g_debug ("row activated"); + play_sound_at_path (GTK_WIDGET (treeview), path); +} + +static void +constrain_list_size (GtkWidget *widget, + GtkRequisition *requisition, + GtkWidget *to_size) +{ + GtkRequisition req; + int max_height; + + /* constrain height to be the tree height up to a max */ + max_height = (gdk_screen_get_height (gtk_widget_get_screen (widget))) / 4; + + gtk_widget_get_preferred_size (to_size, NULL, &req); + + requisition->height = MIN (req.height, max_height); +} + +static void +setup_list_size_constraint (GtkWidget *widget, + GtkWidget *to_size) +{ + g_signal_connect (widget, + "size-request", + G_CALLBACK (constrain_list_size), + to_size); +} + +static void +gvc_sound_theme_editor_init (GvcSoundThemeEditor *editor) +{ + GtkWidget *box; + GtkWidget *label; + GtkWidget *scrolled_window; + + editor->priv = GVC_SOUND_THEME_EDITOR_GET_PRIVATE (editor); + + editor->priv->theme_box = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (editor), + editor->priv->theme_box, FALSE, FALSE, 0); + + label = gtk_label_new (_("Sound Theme:")); + gtk_box_pack_start (GTK_BOX (editor->priv->theme_box), label, FALSE, FALSE, 6); + editor->priv->combo_box = gtk_combo_box_new (); + gtk_box_pack_start (GTK_BOX (editor->priv->theme_box), editor->priv->combo_box, FALSE, FALSE, 0); + + + editor->priv->client = gconf_client_get_default (); + + editor->priv->selection_box = box = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (editor), box, TRUE, TRUE, 0); + + editor->priv->treeview = gtk_tree_view_new (); + g_signal_connect (editor->priv->treeview, + "row-activated", + G_CALLBACK (on_treeview_row_activated), + editor); + + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + setup_list_size_constraint (scrolled_window, editor->priv->treeview); + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (scrolled_window), editor->priv->treeview); + gtk_container_add (GTK_CONTAINER (box), scrolled_window); + + editor->priv->click_feedback_button = gtk_check_button_new_with_mnemonic (_("Enable window and button sounds")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->click_feedback_button), + gconf_client_get_bool (editor->priv->client, INPUT_SOUNDS_KEY, NULL)); + gtk_box_pack_start (GTK_BOX (box), + editor->priv->click_feedback_button, + FALSE, FALSE, 0); + g_signal_connect (editor->priv->click_feedback_button, + "toggled", + G_CALLBACK (on_click_feedback_toggled), + editor); + + + gconf_client_add_dir (editor->priv->client, KEY_SOUNDS_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + editor->priv->sounds_dir_id = gconf_client_notify_add (editor->priv->client, + KEY_SOUNDS_DIR, + (GConfClientNotifyFunc)on_key_changed, + editor, NULL, NULL); + gconf_client_add_dir (editor->priv->client, KEY_METACITY_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + editor->priv->metacity_dir_id = gconf_client_notify_add (editor->priv->client, + KEY_METACITY_DIR, + (GConfClientNotifyFunc)on_key_changed, + editor, NULL, NULL); + + /* FIXME: should accept drag and drop themes. should also + add an "Add Theme..." item to the theme combobox */ +} + +static void +gvc_sound_theme_editor_finalize (GObject *object) +{ + GvcSoundThemeEditor *sound_theme_editor; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_SOUND_THEME_EDITOR (object)); + + sound_theme_editor = GVC_SOUND_THEME_EDITOR (object); + + if (sound_theme_editor->priv != NULL) { + if (sound_theme_editor->priv->sounds_dir_id > 0) { + gconf_client_notify_remove (sound_theme_editor->priv->client, + sound_theme_editor->priv->sounds_dir_id); + sound_theme_editor->priv->sounds_dir_id = 0; + } + if (sound_theme_editor->priv->metacity_dir_id > 0) { + gconf_client_notify_remove (sound_theme_editor->priv->client, + sound_theme_editor->priv->metacity_dir_id); + sound_theme_editor->priv->metacity_dir_id = 0; + } + g_object_unref (sound_theme_editor->priv->client); + sound_theme_editor->priv->client = NULL; + } + + G_OBJECT_CLASS (gvc_sound_theme_editor_parent_class)->finalize (object); +} + +GtkWidget * +gvc_sound_theme_editor_new (void) +{ + GObject *editor; + editor = g_object_new (GVC_TYPE_SOUND_THEME_EDITOR, + "spacing", 6, + NULL); + return GTK_WIDGET (editor); +} diff --git a/panels/sound/gvc-sound-theme-editor.h b/panels/sound/gvc-sound-theme-editor.h new file mode 100644 index 000000000..5e4330d70 --- /dev/null +++ b/panels/sound/gvc-sound-theme-editor.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_SOUND_THEME_EDITOR_H +#define __GVC_SOUND_THEME_EDITOR_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_SOUND_THEME_EDITOR (gvc_sound_theme_editor_get_type ()) +#define GVC_SOUND_THEME_EDITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_SOUND_THEME_EDITOR, GvcSoundThemeEditor)) +#define GVC_SOUND_THEME_EDITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_SOUND_THEME_EDITOR, GvcSoundThemeEditorClass)) +#define GVC_IS_SOUND_THEME_EDITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_SOUND_THEME_EDITOR)) +#define GVC_IS_SOUND_THEME_EDITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_SOUND_THEME_EDITOR)) +#define GVC_SOUND_THEME_EDITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_SOUND_THEME_EDITOR, GvcSoundThemeEditorClass)) + +typedef struct GvcSoundThemeEditorPrivate GvcSoundThemeEditorPrivate; + +typedef struct +{ + GtkVBox parent; + GvcSoundThemeEditorPrivate *priv; +} GvcSoundThemeEditor; + +typedef struct +{ + GtkVBoxClass parent_class; +} GvcSoundThemeEditorClass; + +GType gvc_sound_theme_editor_get_type (void); + +GtkWidget * gvc_sound_theme_editor_new (void); + +G_END_DECLS + +#endif /* __GVC_SOUND_THEME_EDITOR_H */ diff --git a/panels/sound/gvc-speaker-test.c b/panels/sound/gvc-speaker-test.c new file mode 100644 index 000000000..8b56c48a7 --- /dev/null +++ b/panels/sound/gvc-speaker-test.c @@ -0,0 +1,500 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2009 Bastien Nocera + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <canberra.h> +#include <canberra-gtk.h> +#include <pulse/pulseaudio.h> + +#include "gvc-speaker-test.h" +#include "gvc-mixer-stream.h" +#include "gvc-mixer-card.h" + +#define GVC_SPEAKER_TEST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_SPEAKER_TEST, GvcSpeakerTestPrivate)) + +struct GvcSpeakerTestPrivate +{ + GtkWidget *channel_controls[PA_CHANNEL_POSITION_MAX]; + ca_context *canberra; + GvcMixerCard *card; + GvcMixerControl *control; +}; + +enum { + COL_NAME, + COL_HUMAN_NAME, + NUM_COLS +}; + +enum { + PROP_0, + PROP_CARD, + PROP_CONTROL +}; + +static void gvc_speaker_test_class_init (GvcSpeakerTestClass *klass); +static void gvc_speaker_test_init (GvcSpeakerTest *speaker_test); +static void gvc_speaker_test_finalize (GObject *object); +static void update_channel_map (GvcSpeakerTest *speaker_test); + +G_DEFINE_TYPE (GvcSpeakerTest, gvc_speaker_test, GTK_TYPE_TABLE) + +static const int position_table[] = { + /* Position, X, Y */ + PA_CHANNEL_POSITION_FRONT_LEFT, 0, 0, + PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, 1, 0, + PA_CHANNEL_POSITION_FRONT_CENTER, 2, 0, + PA_CHANNEL_POSITION_MONO, 2, 0, + PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, 3, 0, + PA_CHANNEL_POSITION_FRONT_RIGHT, 4, 0, + PA_CHANNEL_POSITION_SIDE_LEFT, 0, 1, + PA_CHANNEL_POSITION_SIDE_RIGHT, 4, 1, + PA_CHANNEL_POSITION_REAR_LEFT, 0, 2, + PA_CHANNEL_POSITION_REAR_CENTER, 2, 2, + PA_CHANNEL_POSITION_REAR_RIGHT, 4, 2, + PA_CHANNEL_POSITION_LFE, 3, 2 +}; + +static void +gvc_speaker_test_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcSpeakerTest *self = GVC_SPEAKER_TEST (object); + + switch (prop_id) { + case PROP_CARD: + self->priv->card = g_value_dup_object (value); + if (self->priv->control != NULL) + update_channel_map (self); + break; + case PROP_CONTROL: + self->priv->control = g_value_dup_object (value); + if (self->priv->card != NULL) + update_channel_map (self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_speaker_test_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcSpeakerTest *self = GVC_SPEAKER_TEST (object); + + switch (prop_id) { + case PROP_CARD: + g_value_set_object (value, self->priv->card); + break; + case PROP_CONTROL: + g_value_set_object (value, self->priv->control); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_speaker_test_class_init (GvcSpeakerTestClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gvc_speaker_test_finalize; + object_class->set_property = gvc_speaker_test_set_property; + object_class->get_property = gvc_speaker_test_get_property; + + g_object_class_install_property (object_class, + PROP_CARD, + g_param_spec_object ("card", + "card", + "The card", + GVC_TYPE_MIXER_CARD, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_CONTROL, + g_param_spec_object ("control", + "control", + "The mixer controller", + GVC_TYPE_MIXER_CONTROL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + g_type_class_add_private (klass, sizeof (GvcSpeakerTestPrivate)); +} + +static const char * +sound_name (pa_channel_position_t position) +{ + switch (position) { + case PA_CHANNEL_POSITION_FRONT_LEFT: + return "audio-channel-front-left"; + case PA_CHANNEL_POSITION_FRONT_RIGHT: + return "audio-channel-front-right"; + case PA_CHANNEL_POSITION_FRONT_CENTER: + return "audio-channel-front-center"; + case PA_CHANNEL_POSITION_REAR_LEFT: + return "audio-channel-rear-left"; + case PA_CHANNEL_POSITION_REAR_RIGHT: + return "audio-channel-rear-right"; + case PA_CHANNEL_POSITION_REAR_CENTER: + return "audio-channel-rear-center"; + case PA_CHANNEL_POSITION_LFE: + return "audio-channel-lfe"; + case PA_CHANNEL_POSITION_SIDE_LEFT: + return "audio-channel-side-left"; + case PA_CHANNEL_POSITION_SIDE_RIGHT: + return "audio-channel-side-right"; + default: + return NULL; + } +} + +static const char * +icon_name (pa_channel_position_t position, gboolean playing) +{ + switch (position) { + case PA_CHANNEL_POSITION_FRONT_LEFT: + return playing ? "audio-speaker-left-testing" : "audio-speaker-left"; + case PA_CHANNEL_POSITION_FRONT_RIGHT: + return playing ? "audio-speaker-right-testing" : "audio-speaker-right"; + case PA_CHANNEL_POSITION_FRONT_CENTER: + return playing ? "audio-speaker-center-testing" : "audio-speaker-center"; + case PA_CHANNEL_POSITION_REAR_LEFT: + return playing ? "audio-speaker-left-back-testing" : "audio-speaker-left-back"; + case PA_CHANNEL_POSITION_REAR_RIGHT: + return playing ? "audio-speaker-right-back-testing" : "audio-speaker-right-back"; + case PA_CHANNEL_POSITION_REAR_CENTER: + return playing ? "audio-speaker-center-back-testing" : "audio-speaker-center-back"; + case PA_CHANNEL_POSITION_LFE: + return playing ? "audio-subwoofer-testing" : "audio-subwoofer"; + case PA_CHANNEL_POSITION_SIDE_LEFT: + return playing ? "audio-speaker-left-side-testing" : "audio-speaker-left-side"; + case PA_CHANNEL_POSITION_SIDE_RIGHT: + return playing ? "audio-speaker-right-side-testing" : "audio-speaker-right-side"; + default: + return NULL; + } +} + +static void +update_button (GtkWidget *control) +{ + GtkWidget *button; + GtkWidget *image; + pa_channel_position_t position; + gboolean playing; + + button = g_object_get_data (G_OBJECT (control), "button"); + image = g_object_get_data (G_OBJECT (control), "image"); + position = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (control), "position")); + playing = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (control), "playing")); + gtk_button_set_label (GTK_BUTTON (button), playing ? _("Stop") : _("Test")); + gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name (position, playing), GTK_ICON_SIZE_DIALOG); +} + +static const char * +pretty_position (pa_channel_position_t position) +{ + if (position == PA_CHANNEL_POSITION_LFE) + return N_("Subwoofer"); + + return pa_channel_position_to_pretty_string (position); +} + +static gboolean +idle_cb (GtkWidget *control) +{ + if (control == NULL) + return FALSE; + + /* This is called in the background thread, hence + * forward to main thread via idle callback */ + g_object_set_data (G_OBJECT (control), "playing", GINT_TO_POINTER(FALSE)); + update_button (control); + + return FALSE; +} + +static void +finish_cb (ca_context *c, uint32_t id, int error_code, void *userdata) +{ + GtkWidget *control = (GtkWidget *) userdata; + + if (error_code == CA_ERROR_DESTROYED || control == NULL) + return; + g_idle_add ((GSourceFunc) idle_cb, control); +} + +static void +on_test_button_clicked (GtkButton *button, + GtkWidget *control) +{ + gboolean playing; + ca_context *canberra; + + canberra = g_object_get_data (G_OBJECT (control), "canberra"); + + ca_context_cancel (canberra, 1); + + playing = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (control), "playing")); + + if (playing) { + g_object_set_data (G_OBJECT (control), "playing", GINT_TO_POINTER(FALSE)); + } else { + pa_channel_position_t position; + const char *name; + ca_proplist *proplist; + + position = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (control), "position")); + + ca_proplist_create (&proplist); + ca_proplist_sets (proplist, CA_PROP_MEDIA_ROLE, "test"); + ca_proplist_sets (proplist, CA_PROP_MEDIA_NAME, pretty_position (position)); + ca_proplist_sets (proplist, CA_PROP_CANBERRA_FORCE_CHANNEL, + pa_channel_position_to_string (position)); + ca_proplist_sets (proplist, CA_PROP_CANBERRA_ENABLE, "1"); + + name = sound_name (position); + if (name != NULL) { + ca_proplist_sets (proplist, CA_PROP_EVENT_ID, name); + playing = ca_context_play_full (canberra, 1, proplist, finish_cb, control) >= 0; + } + + if (!playing) { + ca_proplist_sets (proplist, CA_PROP_EVENT_ID, "audio-test-signal"); + playing = ca_context_play_full (canberra, 1, proplist, finish_cb, control) >= 0; + } + + if (!playing) { + ca_proplist_sets(proplist, CA_PROP_EVENT_ID, "bell-window-system"); + playing = ca_context_play_full (canberra, 1, proplist, finish_cb, control) >= 0; + } + g_object_set_data (G_OBJECT (control), "playing", GINT_TO_POINTER(playing)); + } + + update_button (control); +} + +static GtkWidget * +channel_control_new (ca_context *canberra, pa_channel_position_t position) +{ + GtkWidget *control; + GtkWidget *box; + GtkWidget *label; + GtkWidget *image; + GtkWidget *test_button; + const char *name; + + control = gtk_vbox_new (FALSE, 6); + g_object_set_data (G_OBJECT (control), "playing", GINT_TO_POINTER(FALSE)); + g_object_set_data (G_OBJECT (control), "position", GINT_TO_POINTER(position)); + g_object_set_data (G_OBJECT (control), "canberra", canberra); + + name = icon_name (position, FALSE); + if (name == NULL) + name = "audio-volume-medium"; + image = gtk_image_new_from_icon_name (name, GTK_ICON_SIZE_DIALOG); + g_object_set_data (G_OBJECT (control), "image", image); + gtk_box_pack_start (GTK_BOX (control), image, FALSE, FALSE, 0); + + label = gtk_label_new (pretty_position (position)); + gtk_box_pack_start (GTK_BOX (control), label, FALSE, FALSE, 0); + + test_button = gtk_button_new_with_label (_("Test")); + g_signal_connect (G_OBJECT (test_button), "clicked", + G_CALLBACK (on_test_button_clicked), control); + g_object_set_data (G_OBJECT (control), "button", test_button); + + box = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), test_button, TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (control), box, FALSE, FALSE, 0); + + gtk_widget_show_all (control); + + return control; +} + +static void +create_channel_controls (GvcSpeakerTest *speaker_test) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (position_table); i += 3) { + speaker_test->priv->channel_controls[position_table[i]] = channel_control_new (speaker_test->priv->canberra, (pa_channel_position_t) position_table[i]); + gtk_table_attach (GTK_TABLE (speaker_test), + speaker_test->priv->channel_controls[position_table[i]], + position_table[i+1], + position_table[i+1]+1, + position_table[i+2], + position_table[i+2]+1, + GTK_EXPAND, GTK_EXPAND, 0, 0); + } +} + +static const GvcChannelMap * +get_channel_map_for_card (GvcMixerControl *control, + GvcMixerCard *card, + char **output_name) +{ + int card_index; + GSList *sinks, *l; + GvcMixerStream *stream; + const GvcChannelMap *map; + + /* This gets the channel map for the only + * output for the card */ + + card_index = gvc_mixer_card_get_index (card); + if (card_index == PA_INVALID_INDEX) + return NULL; + sinks = gvc_mixer_control_get_sinks (control); + stream = NULL; + for (l = sinks; l != NULL; l = l->next) { + GvcMixerStream *s = l->data; + if (gvc_mixer_stream_get_card_index (s) == card_index) { + stream = g_object_ref (s); + break; + } + } + g_slist_free (sinks); + + g_assert (stream); + + g_debug ("Found stream '%s' for card '%s'", + gvc_mixer_stream_get_name (stream), + gvc_mixer_card_get_name (card)); + + *output_name = g_strdup (gvc_mixer_stream_get_name (stream)); + map = gvc_mixer_stream_get_channel_map (stream); + + g_debug ("Got channel map '%s' for port '%s'", + gvc_channel_map_get_mapping (map), *output_name); + + return map; +} + +static void +update_channel_map (GvcSpeakerTest *speaker_test) +{ + guint i; + const GvcChannelMap *map; + char *output_name; + + g_return_if_fail (speaker_test->priv->control != NULL); + g_return_if_fail (speaker_test->priv->card != NULL); + + g_debug ("XXX update_channel_map called XXX"); + + map = get_channel_map_for_card (speaker_test->priv->control, + speaker_test->priv->card, + &output_name); + + g_return_if_fail (map != NULL); + + ca_context_change_device (speaker_test->priv->canberra, output_name); + g_free (output_name); + + for (i = 0; i < G_N_ELEMENTS (position_table); i += 3) { + gtk_widget_set_visible (speaker_test->priv->channel_controls[position_table[i]], + gvc_channel_map_has_position(map, position_table[i])); + } +} + +static void +gvc_speaker_test_init (GvcSpeakerTest *speaker_test) +{ + GtkWidget *face; + + speaker_test->priv = GVC_SPEAKER_TEST_GET_PRIVATE (speaker_test); + + ca_context_create (&speaker_test->priv->canberra); + ca_context_set_driver (speaker_test->priv->canberra, "pulse"); + ca_context_change_props (speaker_test->priv->canberra, + CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl", + NULL); + + gtk_table_resize (GTK_TABLE (speaker_test), 3, 5); + gtk_container_set_border_width (GTK_CONTAINER (speaker_test), 12); + gtk_table_set_homogeneous (GTK_TABLE (speaker_test), TRUE); + gtk_table_set_row_spacings (GTK_TABLE (speaker_test), 12); + gtk_table_set_col_spacings (GTK_TABLE (speaker_test), 12); + + create_channel_controls (speaker_test); + + face = gtk_image_new_from_icon_name ("face-smile", GTK_ICON_SIZE_DIALOG); + gtk_table_attach (GTK_TABLE (speaker_test), face, + 2, 3, 1, 2, GTK_EXPAND, GTK_EXPAND, 0, 0); + gtk_widget_show (face); +} + +static void +gvc_speaker_test_finalize (GObject *object) +{ + GvcSpeakerTest *speaker_test; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_SPEAKER_TEST (object)); + + speaker_test = GVC_SPEAKER_TEST (object); + + g_return_if_fail (speaker_test->priv != NULL); + + g_object_unref (speaker_test->priv->card); + speaker_test->priv->card = NULL; + + g_object_unref (speaker_test->priv->control); + speaker_test->priv->control = NULL; + + ca_context_destroy (speaker_test->priv->canberra); + speaker_test->priv->canberra = NULL; + + G_OBJECT_CLASS (gvc_speaker_test_parent_class)->finalize (object); +} + +GtkWidget * +gvc_speaker_test_new (GvcMixerControl *control, + GvcMixerCard *card) +{ + GObject *speaker_test; + + g_return_val_if_fail (card != NULL, NULL); + g_return_val_if_fail (control != NULL, NULL); + + speaker_test = g_object_new (GVC_TYPE_SPEAKER_TEST, + "card", card, + "control", control, + NULL); + + return GTK_WIDGET (speaker_test); +} + diff --git a/panels/sound/gvc-speaker-test.h b/panels/sound/gvc-speaker-test.h new file mode 100644 index 000000000..912c5948e --- /dev/null +++ b/panels/sound/gvc-speaker-test.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_SPEAKER_TEST_H +#define __GVC_SPEAKER_TEST_H + +#include <glib-object.h> +#include <gvc-mixer-card.h> +#include <gvc-mixer-control.h> + +G_BEGIN_DECLS + +#define GVC_TYPE_SPEAKER_TEST (gvc_speaker_test_get_type ()) +#define GVC_SPEAKER_TEST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_SPEAKER_TEST, GvcSpeakerTest)) +#define GVC_SPEAKER_TEST_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_SPEAKER_TEST, GvcSpeakerTestClass)) +#define GVC_IS_SPEAKER_TEST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_SPEAKER_TEST)) +#define GVC_IS_SPEAKER_TEST_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_SPEAKER_TEST)) +#define GVC_SPEAKER_TEST_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_SPEAKER_TEST, GvcSpeakerTestClass)) + +typedef struct GvcSpeakerTestPrivate GvcSpeakerTestPrivate; + +typedef struct +{ + GtkNotebook parent; + GvcSpeakerTestPrivate *priv; +} GvcSpeakerTest; + +typedef struct +{ + GtkNotebookClass parent_class; +} GvcSpeakerTestClass; + +GType gvc_speaker_test_get_type (void); + +GtkWidget * gvc_speaker_test_new (GvcMixerControl *control, + GvcMixerCard *card); + +G_END_DECLS + +#endif /* __GVC_SPEAKER_TEST_H */ diff --git a/panels/sound/gvc-stream-status-icon.c b/panels/sound/gvc-stream-status-icon.c new file mode 100644 index 000000000..02c095fe2 --- /dev/null +++ b/panels/sound/gvc-stream-status-icon.c @@ -0,0 +1,822 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 William Jon McCann + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + +#include <glib.h> +#include <glib/gi18n.h> +#include <gdk/gdkkeysyms.h> +#include <gtk/gtk.h> +#include <pulse/pulseaudio.h> + +#include "gvc-mixer-stream.h" +#include "gvc-channel-bar.h" +#include "gvc-stream-status-icon.h" + +#define GVC_STREAM_STATUS_ICON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_STREAM_STATUS_ICON, GvcStreamStatusIconPrivate)) + +struct GvcStreamStatusIconPrivate +{ + char **icon_names; + GvcMixerStream *mixer_stream; + GtkWidget *dock; + GtkWidget *bar; + guint current_icon; + char *display_name; + gboolean thaw; +}; + +enum +{ + PROP_0, + PROP_DISPLAY_NAME, + PROP_MIXER_STREAM, + PROP_ICON_NAMES, +}; + +static void gvc_stream_status_icon_class_init (GvcStreamStatusIconClass *klass); +static void gvc_stream_status_icon_init (GvcStreamStatusIcon *stream_status_icon); +static void gvc_stream_status_icon_finalize (GObject *object); + +G_DEFINE_TYPE (GvcStreamStatusIcon, gvc_stream_status_icon, GTK_TYPE_STATUS_ICON) + +static void +on_adjustment_value_changed (GtkAdjustment *adjustment, + GvcStreamStatusIcon *icon) +{ + gdouble volume; + + if (icon->priv->thaw) + return; + + volume = gtk_adjustment_get_value (adjustment); + + /* Only push the volume if it's actually changed */ + if (gvc_mixer_stream_set_volume(icon->priv->mixer_stream, + (pa_volume_t) round (volume)) != FALSE) { + gvc_mixer_stream_push_volume(icon->priv->mixer_stream); + } +} + +static void +update_dock (GvcStreamStatusIcon *icon) +{ + GtkAdjustment *adj; + gboolean is_muted; + + g_return_if_fail (icon); + + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (icon->priv->bar))); + + icon->priv->thaw = TRUE; + gtk_adjustment_set_value (adj, + gvc_mixer_stream_get_volume (icon->priv->mixer_stream)); + is_muted = gvc_mixer_stream_get_is_muted (icon->priv->mixer_stream); + gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (icon->priv->bar), is_muted); + icon->priv->thaw = FALSE; +} + +static gboolean +popup_dock (GvcStreamStatusIcon *icon, + guint time) +{ + GdkRectangle area; + GtkOrientation orientation; + GdkDisplay *display; + GdkScreen *screen; + gboolean res; + int x; + int y; + int monitor_num; + GdkRectangle monitor; + GtkRequisition dock_req; + + update_dock (icon); + + screen = gtk_status_icon_get_screen (GTK_STATUS_ICON (icon)); + res = gtk_status_icon_get_geometry (GTK_STATUS_ICON (icon), + &screen, + &area, + &orientation); + if (! res) { + g_warning ("Unable to determine geometry of status icon"); + return FALSE; + } + + /* position roughly */ + gtk_window_set_screen (GTK_WINDOW (icon->priv->dock), screen); + gvc_channel_bar_set_orientation (GVC_CHANNEL_BAR (icon->priv->bar), + 1 - orientation); + + monitor_num = gdk_screen_get_monitor_at_point (screen, area.x, area.y); + gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + + gtk_container_foreach (GTK_CONTAINER (icon->priv->dock), + (GtkCallback) gtk_widget_show_all, NULL); + gtk_widget_get_preferred_size (icon->priv->dock, &dock_req, NULL); + + if (orientation == GTK_ORIENTATION_VERTICAL) { + if (area.x + area.width + dock_req.width <= monitor.x + monitor.width) { + x = area.x + area.width; + } else { + x = area.x - dock_req.width; + } + if (area.y + dock_req.height <= monitor.y + monitor.height) { + y = area.y; + } else { + y = monitor.y + monitor.height - dock_req.height; + } + } else { + if (area.y + area.height + dock_req.height <= monitor.y + monitor.height) { + y = area.y + area.height; + } else { + y = area.y - dock_req.height; + } + if (area.x + dock_req.width <= monitor.x + monitor.width) { + x = area.x; + } else { + x = monitor.x + monitor.width - dock_req.width; + } + } + + gtk_window_move (GTK_WINDOW (icon->priv->dock), x, y); + + /* FIXME: without this, the popup window appears as a square + * after changing the orientation + */ + gtk_window_resize (GTK_WINDOW (icon->priv->dock), 1, 1); + + gtk_widget_show_all (icon->priv->dock); + + + /* grab focus */ + gtk_grab_add (icon->priv->dock); + + if (gdk_pointer_grab (gtk_widget_get_window (icon->priv->dock), TRUE, + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK, NULL, NULL, + time) + != GDK_GRAB_SUCCESS) { + gtk_grab_remove (icon->priv->dock); + gtk_widget_hide (icon->priv->dock); + return FALSE; + } + + if (gdk_keyboard_grab (gtk_widget_get_window (icon->priv->dock), TRUE, time) != GDK_GRAB_SUCCESS) { + display = gtk_widget_get_display (icon->priv->dock); + gdk_display_pointer_ungrab (display, time); + gtk_grab_remove (icon->priv->dock); + gtk_widget_hide (icon->priv->dock); + return FALSE; + } + + gtk_widget_grab_focus (icon->priv->dock); + + return TRUE; +} + +static void +on_status_icon_activate (GtkStatusIcon *status_icon, + GvcStreamStatusIcon *icon) +{ + popup_dock (icon, GDK_CURRENT_TIME); +} + +static void +on_menu_mute_toggled (GtkMenuItem *item, + GvcStreamStatusIcon *icon) +{ + gboolean is_muted; + is_muted = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (item)); + gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (icon->priv->bar), is_muted); +} + +static void +on_menu_activate_open_volume_control (GtkMenuItem *item, + GvcStreamStatusIcon *icon) +{ + GError *error; + + error = NULL; + gdk_spawn_command_line_on_screen (gtk_widget_get_screen (icon->priv->dock), + "gnome-control-center sound", + &error); + + if (error != NULL) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, + 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Failed to start Sound Preferences: %s"), + error->message); + g_signal_connect (dialog, + "response", + G_CALLBACK (gtk_widget_destroy), + NULL); + gtk_widget_show (dialog); + g_error_free (error); + } +} + +static void +on_status_icon_popup_menu (GtkStatusIcon *status_icon, + guint button, + guint activate_time, + GvcStreamStatusIcon *icon) +{ + GtkWidget *menu; + GtkWidget *item; + GtkWidget *image; + + menu = gtk_menu_new (); + + item = gtk_check_menu_item_new_with_mnemonic (_("_Mute")); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), + gvc_mixer_stream_get_is_muted (icon->priv->mixer_stream)); + g_signal_connect (item, + "toggled", + G_CALLBACK (on_menu_mute_toggled), + icon); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + item = gtk_image_menu_item_new_with_mnemonic (_("_Sound Preferences")); + image = gtk_image_new_from_icon_name ("multimedia-volume-control", + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + g_signal_connect (item, + "activate", + G_CALLBACK (on_menu_activate_open_volume_control), + icon); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + gtk_widget_show_all (menu); + gtk_menu_popup (GTK_MENU (menu), + NULL, + NULL, + gtk_status_icon_position_menu, + status_icon, + button, + activate_time); +} + +static gboolean +on_status_icon_scroll_event (GtkStatusIcon *status_icon, + GdkEventScroll *event, + GvcStreamStatusIcon *icon) +{ + return gvc_channel_bar_scroll (GVC_CHANNEL_BAR (icon->priv->bar), event->direction); +} + +static void +gvc_icon_release_grab (GvcStreamStatusIcon *icon, + GdkEventButton *event) +{ + GdkDisplay *display; + + /* ungrab focus */ + display = gtk_widget_get_display (GTK_WIDGET (icon->priv->dock)); + gdk_display_keyboard_ungrab (display, event->time); + gdk_display_pointer_ungrab (display, event->time); + gtk_grab_remove (icon->priv->dock); + + /* hide again */ + gtk_widget_hide (icon->priv->dock); +} + +static gboolean +on_dock_button_press (GtkWidget *widget, + GdkEventButton *event, + GvcStreamStatusIcon *icon) +{ + if (event->type == GDK_BUTTON_PRESS) { + gvc_icon_release_grab (icon, event); + return TRUE; + } + + return FALSE; +} + +static void +popdown_dock (GvcStreamStatusIcon *icon) +{ + GdkDisplay *display; + + /* ungrab focus */ + display = gtk_widget_get_display (icon->priv->dock); + gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME); + gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); + gtk_grab_remove (icon->priv->dock); + + /* hide again */ + gtk_widget_hide (icon->priv->dock); +} + +/* This is called when the grab is broken for + * either the dock, or the scale itself */ +static void +gvc_icon_grab_notify (GvcStreamStatusIcon *icon, + gboolean was_grabbed) +{ + if (was_grabbed != FALSE) { + return; + } + + if (!gtk_widget_has_grab (icon->priv->dock)) { + return; + } + + if (gtk_widget_is_ancestor (gtk_grab_get_current (), icon->priv->dock)) { + return; + } + + popdown_dock (icon); +} + +static void +on_dock_grab_notify (GtkWidget *widget, + gboolean was_grabbed, + GvcStreamStatusIcon *icon) +{ + gvc_icon_grab_notify (icon, was_grabbed); +} + +static gboolean +on_dock_grab_broken_event (GtkWidget *widget, + gboolean was_grabbed, + GvcStreamStatusIcon *icon) +{ + gvc_icon_grab_notify (icon, FALSE); + + return FALSE; +} + +static gboolean +on_dock_key_release (GtkWidget *widget, + GdkEventKey *event, + GvcStreamStatusIcon *icon) +{ + if (event->keyval == GDK_KEY_Escape) { + popdown_dock (icon); + return TRUE; + } + +#if 0 + if (!gtk_bindings_activate_event (GTK_OBJECT (widget), event)) { + /* The popup hasn't managed the event, pass onto the button */ + gtk_bindings_activate_event (GTK_OBJECT (user_data), event); + } +#endif + return TRUE; +} + +static gboolean +on_dock_scroll_event (GtkWidget *widget, + GdkEventScroll *event, + GvcStreamStatusIcon *icon) +{ + /* Forward event to the status icon */ + on_status_icon_scroll_event (NULL, event, icon); + return TRUE; +} + +static void +update_icon (GvcStreamStatusIcon *icon) +{ + guint volume; + gboolean is_muted; + guint n; + char *markup; + gboolean can_decibel; + gdouble db; + + if (icon->priv->mixer_stream == NULL) { + return; + } + + volume = gvc_mixer_stream_get_volume (icon->priv->mixer_stream); + is_muted = gvc_mixer_stream_get_is_muted (icon->priv->mixer_stream); + db = gvc_mixer_stream_get_decibel (icon->priv->mixer_stream); + can_decibel = gvc_mixer_stream_get_can_decibel (icon->priv->mixer_stream); + + /* select image */ + if (volume <= 0 || is_muted) { + n = 0; + } else { + n = 3 * volume / PA_VOLUME_NORM + 1; + if (n < 1) { + n = 1; + } else if (n > 3) { + n = 3; + } + } + + /* apparently status icon will reset icon even if + * if doesn't change */ + if (icon->priv->current_icon != n) { + gtk_status_icon_set_from_icon_name (GTK_STATUS_ICON (icon), + icon->priv->icon_names [n]); + icon->priv->current_icon = n; + } + + + if (is_muted) { + markup = g_strdup_printf ( + "<b>%s: %s</b>\n<small>%s</small>", + icon->priv->display_name, + _("Muted"), + gvc_mixer_stream_get_description (icon->priv->mixer_stream)); + } else if (can_decibel && (db > PA_DECIBEL_MININFTY)) { + markup = g_strdup_printf ( + "<b>%s: %.0f%%</b>\n<small>%0.2f dB\n%s</small>", + icon->priv->display_name, + 100 * (float)volume / PA_VOLUME_NORM, + db, + gvc_mixer_stream_get_description (icon->priv->mixer_stream)); + } else if (can_decibel) { + markup = g_strdup_printf ( + "<b>%s: %.0f%%</b>\n<small>-∞ dB\n%s</small>", + icon->priv->display_name, + 100 * (float)volume / PA_VOLUME_NORM, + gvc_mixer_stream_get_description (icon->priv->mixer_stream)); + } else { + markup = g_strdup_printf ( + "<b>%s: %.0f%%</b>\n<small>%s</small>", + icon->priv->display_name, + 100 * (float)volume / PA_VOLUME_NORM, + gvc_mixer_stream_get_description (icon->priv->mixer_stream)); + } + gtk_status_icon_set_tooltip_markup (GTK_STATUS_ICON (icon), markup); + g_free (markup); +} + +void +gvc_stream_status_icon_set_icon_names (GvcStreamStatusIcon *icon, + const char **names) +{ + g_return_if_fail (GVC_IS_STREAM_STATUS_ICON (icon)); + + g_strfreev (icon->priv->icon_names); + icon->priv->icon_names = g_strdupv ((char **)names); + update_icon (icon); + g_object_notify (G_OBJECT (icon), "icon-names"); +} + +static void +on_stream_volume_notify (GObject *object, + GParamSpec *pspec, + GvcStreamStatusIcon *icon) +{ + update_icon (icon); + update_dock (icon); +} + +static void +on_stream_is_muted_notify (GObject *object, + GParamSpec *pspec, + GvcStreamStatusIcon *icon) +{ + update_icon (icon); + update_dock (icon); +} + +void +gvc_stream_status_icon_set_display_name (GvcStreamStatusIcon *icon, + const char *name) +{ + g_return_if_fail (GVC_STREAM_STATUS_ICON (icon)); + + g_free (icon->priv->display_name); + icon->priv->display_name = g_strdup (name); + update_icon (icon); + g_object_notify (G_OBJECT (icon), "display-name"); +} + +void +gvc_stream_status_icon_set_mixer_stream (GvcStreamStatusIcon *icon, + GvcMixerStream *stream) +{ + g_return_if_fail (GVC_STREAM_STATUS_ICON (icon)); + + if (stream != NULL) { + g_object_ref (stream); + } + + if (icon->priv->mixer_stream != NULL) { + g_signal_handlers_disconnect_by_func (icon->priv->mixer_stream, + G_CALLBACK (on_stream_volume_notify), + icon); + g_signal_handlers_disconnect_by_func (icon->priv->mixer_stream, + G_CALLBACK (on_stream_is_muted_notify), + icon); + g_object_unref (icon->priv->mixer_stream); + icon->priv->mixer_stream = NULL; + } + + icon->priv->mixer_stream = stream; + + if (icon->priv->mixer_stream != NULL) { + GtkAdjustment *adj; + + g_object_ref (icon->priv->mixer_stream); + + icon->priv->thaw = TRUE; + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (icon->priv->bar))); + gtk_adjustment_set_value (adj, + gvc_mixer_stream_get_volume (icon->priv->mixer_stream)); + icon->priv->thaw = FALSE; + + g_signal_connect (icon->priv->mixer_stream, + "notify::volume", + G_CALLBACK (on_stream_volume_notify), + icon); + g_signal_connect (icon->priv->mixer_stream, + "notify::is-muted", + G_CALLBACK (on_stream_is_muted_notify), + icon); + } + + update_icon (icon); + + g_object_notify (G_OBJECT (icon), "mixer-stream"); +} + +static void +gvc_stream_status_icon_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GvcStreamStatusIcon *self = GVC_STREAM_STATUS_ICON (object); + + switch (prop_id) { + case PROP_MIXER_STREAM: + gvc_stream_status_icon_set_mixer_stream (self, g_value_get_object (value)); + break; + case PROP_DISPLAY_NAME: + gvc_stream_status_icon_set_display_name (self, g_value_get_string (value)); + break; + case PROP_ICON_NAMES: + gvc_stream_status_icon_set_icon_names (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gvc_stream_status_icon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GvcStreamStatusIcon *self = GVC_STREAM_STATUS_ICON (object); + GvcStreamStatusIconPrivate *priv = self->priv; + + switch (prop_id) { + case PROP_MIXER_STREAM: + g_value_set_object (value, priv->mixer_stream); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, priv->display_name); + break; + case PROP_ICON_NAMES: + g_value_set_boxed (value, priv->icon_names); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +on_bar_is_muted_notify (GObject *object, + GParamSpec *pspec, + GvcStreamStatusIcon *icon) +{ + gboolean is_muted; + + is_muted = gvc_channel_bar_get_is_muted (GVC_CHANNEL_BAR (object)); + + if (gvc_mixer_stream_get_is_muted (icon->priv->mixer_stream) != is_muted) { + /* Update the stream before pushing the change */ + gvc_mixer_stream_set_is_muted (icon->priv->mixer_stream, is_muted); + gvc_mixer_stream_change_is_muted (icon->priv->mixer_stream, + is_muted); + } +} + +static GObject * +gvc_stream_status_icon_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GvcStreamStatusIcon *icon; + GtkWidget *frame; + GtkWidget *box; + GtkAdjustment *adj; + + object = G_OBJECT_CLASS (gvc_stream_status_icon_parent_class)->constructor (type, n_construct_properties, construct_params); + + icon = GVC_STREAM_STATUS_ICON (object); + + gtk_status_icon_set_from_icon_name (GTK_STATUS_ICON (icon), + icon->priv->icon_names[0]); + + /* window */ + icon->priv->dock = gtk_window_new (GTK_WINDOW_POPUP); + gtk_widget_set_name (icon->priv->dock, "gvc-stream-status-icon-popup-window"); + g_signal_connect (icon->priv->dock, + "button-press-event", + G_CALLBACK (on_dock_button_press), + icon); + g_signal_connect (icon->priv->dock, + "key-release-event", + G_CALLBACK (on_dock_key_release), + icon); + g_signal_connect (icon->priv->dock, + "scroll-event", + G_CALLBACK (on_dock_scroll_event), + icon); + g_signal_connect (icon->priv->dock, + "grab-notify", + G_CALLBACK (on_dock_grab_notify), + icon); + g_signal_connect (icon->priv->dock, + "grab-broken-event", + G_CALLBACK (on_dock_grab_broken_event), + icon); + + gtk_window_set_decorated (GTK_WINDOW (icon->priv->dock), FALSE); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); + gtk_container_add (GTK_CONTAINER (icon->priv->dock), frame); + + box = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (box), 2); + gtk_container_add (GTK_CONTAINER (frame), box); + + icon->priv->bar = gvc_channel_bar_new (); + gvc_channel_bar_set_orientation (GVC_CHANNEL_BAR (icon->priv->bar), + GTK_ORIENTATION_VERTICAL); + + gtk_box_pack_start (GTK_BOX (box), icon->priv->bar, TRUE, FALSE, 0); + g_signal_connect (icon->priv->bar, + "notify::is-muted", + G_CALLBACK (on_bar_is_muted_notify), + icon); + + adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (icon->priv->bar))); + g_signal_connect (adj, + "value-changed", + G_CALLBACK (on_adjustment_value_changed), + icon); + + return object; +} + +static void +gvc_stream_status_icon_dispose (GObject *object) +{ + GvcStreamStatusIcon *icon = GVC_STREAM_STATUS_ICON (object); + + if (icon->priv->dock != NULL) { + gtk_widget_destroy (icon->priv->dock); + icon->priv->dock = NULL; + } + + if (icon->priv->mixer_stream != NULL) { + g_object_unref (icon->priv->mixer_stream); + icon->priv->mixer_stream = NULL; + } + + G_OBJECT_CLASS (gvc_stream_status_icon_parent_class)->dispose (object); +} + +static void +gvc_stream_status_icon_class_init (GvcStreamStatusIconClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructor = gvc_stream_status_icon_constructor; + object_class->finalize = gvc_stream_status_icon_finalize; + object_class->dispose = gvc_stream_status_icon_dispose; + object_class->set_property = gvc_stream_status_icon_set_property; + object_class->get_property = gvc_stream_status_icon_get_property; + + g_object_class_install_property (object_class, + PROP_MIXER_STREAM, + g_param_spec_object ("mixer-stream", + "mixer stream", + "mixer stream", + GVC_TYPE_MIXER_STREAM, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_DISPLAY_NAME, + g_param_spec_string ("display-name", + "Display Name", + "Name to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_ICON_NAMES, + g_param_spec_boxed ("icon-names", + "Icon Names", + "Name of icon to display for this stream", + G_TYPE_STRV, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_type_class_add_private (klass, sizeof (GvcStreamStatusIconPrivate)); +} + +static void +on_status_icon_visible_notify (GvcStreamStatusIcon *icon) +{ + gboolean visible; + + g_object_get (icon, "visible", &visible, NULL); + if (! visible) { + if (icon->priv->dock != NULL) { + gtk_widget_hide (icon->priv->dock); + } + } +} + +static void +gvc_stream_status_icon_init (GvcStreamStatusIcon *icon) +{ + icon->priv = GVC_STREAM_STATUS_ICON_GET_PRIVATE (icon); + + g_signal_connect (icon, + "activate", + G_CALLBACK (on_status_icon_activate), + icon); + g_signal_connect (icon, + "popup-menu", + G_CALLBACK (on_status_icon_popup_menu), + icon); + g_signal_connect (icon, + "scroll-event", + G_CALLBACK (on_status_icon_scroll_event), + icon); + g_signal_connect (icon, + "notify::visible", + G_CALLBACK (on_status_icon_visible_notify), + NULL); + + icon->priv->thaw = FALSE; +} + +static void +gvc_stream_status_icon_finalize (GObject *object) +{ + GvcStreamStatusIcon *stream_status_icon; + + g_return_if_fail (object != NULL); + g_return_if_fail (GVC_IS_STREAM_STATUS_ICON (object)); + + stream_status_icon = GVC_STREAM_STATUS_ICON (object); + + g_return_if_fail (stream_status_icon->priv != NULL); + + g_strfreev (stream_status_icon->priv->icon_names); + + G_OBJECT_CLASS (gvc_stream_status_icon_parent_class)->finalize (object); +} + +GvcStreamStatusIcon * +gvc_stream_status_icon_new (GvcMixerStream *stream, + const char **icon_names) +{ + GObject *icon; + icon = g_object_new (GVC_TYPE_STREAM_STATUS_ICON, + "mixer-stream", stream, + "icon-names", icon_names, + NULL); + return GVC_STREAM_STATUS_ICON (icon); +} diff --git a/panels/sound/gvc-stream-status-icon.h b/panels/sound/gvc-stream-status-icon.h new file mode 100644 index 000000000..55887f346 --- /dev/null +++ b/panels/sound/gvc-stream-status-icon.h @@ -0,0 +1,63 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __GVC_STREAM_STATUS_ICON_H +#define __GVC_STREAM_STATUS_ICON_H + +#include <glib-object.h> +#include "gvc-mixer-stream.h" + +G_BEGIN_DECLS + +#define GVC_TYPE_STREAM_STATUS_ICON (gvc_stream_status_icon_get_type ()) +#define GVC_STREAM_STATUS_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_STREAM_STATUS_ICON, GvcStreamStatusIcon)) +#define GVC_STREAM_STATUS_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_STREAM_STATUS_ICON, GvcStreamStatusIconClass)) +#define GVC_IS_STREAM_STATUS_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_STREAM_STATUS_ICON)) +#define GVC_IS_STREAM_STATUS_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_STREAM_STATUS_ICON)) +#define GVC_STREAM_STATUS_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_STREAM_STATUS_ICON, GvcStreamStatusIconClass)) + +typedef struct GvcStreamStatusIconPrivate GvcStreamStatusIconPrivate; + +typedef struct +{ + GtkStatusIcon parent; + GvcStreamStatusIconPrivate *priv; +} GvcStreamStatusIcon; + +typedef struct +{ + GtkStatusIconClass parent_class; +} GvcStreamStatusIconClass; + +GType gvc_stream_status_icon_get_type (void); + +GvcStreamStatusIcon * gvc_stream_status_icon_new (GvcMixerStream *stream, + const char **icon_names); + +void gvc_stream_status_icon_set_icon_names (GvcStreamStatusIcon *icon, + const char **icon_names); +void gvc_stream_status_icon_set_display_name (GvcStreamStatusIcon *icon, + const char *display_name); +void gvc_stream_status_icon_set_mixer_stream (GvcStreamStatusIcon *icon, + GvcMixerStream *stream); + +G_END_DECLS + +#endif /* __GVC_STREAM_STATUS_ICON_H */ diff --git a/panels/sound/sound-theme-file-utils.c b/panels/sound/sound-theme-file-utils.c new file mode 100644 index 000000000..06877c72d --- /dev/null +++ b/panels/sound/sound-theme-file-utils.c @@ -0,0 +1,305 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net> + * + * 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, 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include <config.h> +#include <glib/gstdio.h> +#include <glib/gi18n-lib.h> +#include <gio/gio.h> +#include <utime.h> +#include <strings.h> + +#include "sound-theme-file-utils.h" + +#define CUSTOM_THEME_NAME "__custom" + +/* This function needs to be called after each individual + * changeset to the theme */ +void +custom_theme_update_time (void) +{ + char *path; + + path = custom_theme_dir_path (NULL); + utime (path, NULL); + g_free (path); +} + +char * +custom_theme_dir_path (const char *child) +{ + static char *dir = NULL; + const char *data_dir; + + if (dir == NULL) { + data_dir = g_get_user_data_dir (); + dir = g_build_filename (data_dir, "sounds", CUSTOM_THEME_NAME, NULL); + } + if (child == NULL) + return g_strdup (dir); + + return g_build_filename (dir, child, NULL); +} + +static gboolean +directory_delete_recursive (GFile *directory, GError **error) +{ + GFileEnumerator *enumerator; + GFileInfo *info; + gboolean success = TRUE; + + enumerator = g_file_enumerate_children (directory, + G_FILE_ATTRIBUTE_STANDARD_NAME "," + G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NONE, + NULL, error); + if (enumerator == NULL) + return FALSE; + + while (success && + (info = g_file_enumerator_next_file (enumerator, NULL, NULL))) { + GFile *child; + + child = g_file_get_child (directory, g_file_info_get_name (info)); + + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) { + success = directory_delete_recursive (child, error); + } + g_object_unref (info); + + if (success) + success = g_file_delete (child, NULL, error); + } + g_file_enumerator_close (enumerator, NULL, NULL); + + if (success) + success = g_file_delete (directory, NULL, error); + + return success; +} + +/** + * capplet_file_delete_recursive : + * @file : + * @error : + * + * A utility routine to delete files and/or directories, + * including non-empty directories. + **/ +static gboolean +capplet_file_delete_recursive (GFile *file, GError **error) +{ + GFileInfo *info; + GFileType type; + + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NONE, + NULL, error); + if (info == NULL) + return FALSE; + + type = g_file_info_get_file_type (info); + g_object_unref (info); + + if (type == G_FILE_TYPE_DIRECTORY) + return directory_delete_recursive (file, error); + else + return g_file_delete (file, NULL, error); +} + +void +delete_custom_theme_dir (void) +{ + char *dir; + GFile *file; + + dir = custom_theme_dir_path (NULL); + file = g_file_new_for_path (dir); + g_free (dir); + capplet_file_delete_recursive (file, NULL); + g_object_unref (file); + + g_debug ("deleted the custom theme dir"); +} + +gboolean +custom_theme_dir_is_empty (void) +{ + char *dir; + GFile *file; + gboolean is_empty; + GFileEnumerator *enumerator; + GFileInfo *info; + GError *error = NULL; + + dir = custom_theme_dir_path (NULL); + file = g_file_new_for_path (dir); + g_free (dir); + + is_empty = TRUE; + + enumerator = g_file_enumerate_children (file, + G_FILE_ATTRIBUTE_STANDARD_NAME "," + G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NONE, + NULL, &error); + if (enumerator == NULL) { + g_warning ("Unable to enumerate files: %s", error->message); + g_error_free (error); + goto out; + } + + while (is_empty && + (info = g_file_enumerator_next_file (enumerator, NULL, NULL))) { + + if (strcmp ("index.theme", g_file_info_get_name (info)) != 0) { + is_empty = FALSE; + } + + g_object_unref (info); + } + g_file_enumerator_close (enumerator, NULL, NULL); + + out: + g_object_unref (file); + + return is_empty; +} + +static void +delete_one_file (const char *sound_name, const char *pattern) +{ + GFile *file; + char *name, *filename; + + name = g_strdup_printf (pattern, sound_name); + filename = custom_theme_dir_path (name); + g_free (name); + file = g_file_new_for_path (filename); + g_free (filename); + capplet_file_delete_recursive (file, NULL); + g_object_unref (file); +} + +void +delete_old_files (const char **sounds) +{ + guint i; + + for (i = 0; sounds[i] != NULL; i++) { + delete_one_file (sounds[i], "%s.ogg"); + } +} + +void +delete_disabled_files (const char **sounds) +{ + guint i; + + for (i = 0; sounds[i] != NULL; i++) + delete_one_file (sounds[i], "%s.disabled"); +} + +static void +create_one_file (GFile *file) +{ + GFileOutputStream* stream; + + stream = g_file_create (file, G_FILE_CREATE_NONE, NULL, NULL); + if (stream != NULL) { + g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, NULL); + g_object_unref (stream); + } +} + +void +add_disabled_file (const char **sounds) +{ + guint i; + + for (i = 0; sounds[i] != NULL; i++) { + GFile *file; + char *name, *filename; + + name = g_strdup_printf ("%s.disabled", sounds[i]); + filename = custom_theme_dir_path (name); + g_free (name); + file = g_file_new_for_path (filename); + g_free (filename); + + create_one_file (file); + g_object_unref (file); + } +} + +void +add_custom_file (const char **sounds, const char *filename) +{ + guint i; + + for (i = 0; sounds[i] != NULL; i++) { + GFile *file; + char *name, *path; + + /* We use *.ogg because it's the first type of file that + * libcanberra looks at */ + name = g_strdup_printf ("%s.ogg", sounds[i]); + path = custom_theme_dir_path (name); + g_free (name); + /* In case there's already a link there, delete it */ + g_unlink (path); + file = g_file_new_for_path (path); + g_free (path); + + /* Create the link */ + g_file_make_symbolic_link (file, filename, NULL, NULL); + g_object_unref (file); + } +} + +void +create_custom_theme (const char *parent) +{ + GKeyFile *keyfile; + char *data; + char *path; + + /* Create the custom directory */ + path = custom_theme_dir_path (NULL); + g_mkdir_with_parents (path, 0755); + g_free (path); + + /* Set the data for index.theme */ + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "Sound Theme", "Name", _("Custom")); + g_key_file_set_string (keyfile, "Sound Theme", "Inherits", parent); + g_key_file_set_string (keyfile, "Sound Theme", "Directories", "."); + data = g_key_file_to_data (keyfile, NULL, NULL); + g_key_file_free (keyfile); + + /* Save the index.theme */ + path = custom_theme_dir_path ("index.theme"); + g_file_set_contents (path, data, -1, NULL); + g_free (path); + g_free (data); + + custom_theme_update_time (); +} diff --git a/panels/sound/sound-theme-file-utils.h b/panels/sound/sound-theme-file-utils.h new file mode 100644 index 000000000..7fc3a5880 --- /dev/null +++ b/panels/sound/sound-theme-file-utils.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net> + * + * 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, 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ +#ifndef __SOUND_THEME_FILE_UTILS_HH__ +#define __SOUND_THEME_FILE_UTILS_HH__ + +#include <gio/gio.h> + +char *custom_theme_dir_path (const char *child); +gboolean custom_theme_dir_is_empty (void); +void create_custom_theme (const char *parent); + +void delete_custom_theme_dir (void); +void delete_old_files (const char **sounds); +void delete_disabled_files (const char **sounds); + +void add_disabled_file (const char **sounds); +void add_custom_file (const char **sounds, const char *filename); + +void custom_theme_update_time (void); + +#endif /* __SOUND_THEME_FILE_UTILS_HH__ */ diff --git a/po/POTFILES.in b/po/POTFILES.in index f9bc81f83..e3cdea42a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -46,6 +46,22 @@ panels/mouse/gnome-mouse-panel.desktop.in.in panels/network/gnome-network-properties.c panels/network/gnome-network-panel.desktop.in.in [type: gettext/glade]panels/network/gnome-network-properties.ui +panels/sound/applet-main.c +panels/sound/cc-sound-panel.c +panels/sound/gvc-applet.c +panels/sound/gvc-balance-bar.c +panels/sound/gvc-channel-bar.c +panels/sound/gvc-combo-box.c +panels/sound/gvc-mixer-control.c +panels/sound/gvc-mixer-dialog.c +panels/sound/gvc-speaker-test.c +panels/sound/gvc-stream-status-icon.c +panels/sound/gvc-sound-theme-chooser.c +panels/sound/gvc-sound-theme-editor.c +panels/sound/sound-theme-file-utils.c +panels/sound/data/gnome-sound-applet.desktop.in +panels/sound/data/gnome-sound-panel.desktop.in.in +panels/sound/data/sounds/gnome-sounds-default.xml.in.in panels/universal-access/gnome-universal-access-panel.desktop.in.in [type: gettext/glade]panels/universal-access/uap.ui shell/control-center.c diff --git a/po/POTFILES.skip b/po/POTFILES.skip index e8c5cdc67..cb6a3a1d8 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -8,6 +8,8 @@ panels/default-applications/gnome-at-session.desktop.in panels/display/gnome-display-panel.desktop.in panels/keybindings/gnome-keybindings-panel.desktop.in panels/keyboard/gnome-keyboard-panel.desktop.in +panels/sound/data/gnome-sound-panel.desktop.in +panels/sound/data/sounds/gnome-sounds-default.xml.in capplets/localization/localization.desktop.in capplets/mouse/gnome-settings-mouse.desktop.in panels/network/gnome-network-panel.desktop.in |