[Goodies-commits] r7849 - in parole/trunk: . data/desktop data/icons data/icons/scalable data/icons/scalable/apps data/icons/scalable/status data/interfaces data/pixmaps parole plugins plugins/properties plugins/tray po
Ali Abdallah
aliov at xfce.org
Mon Jul 27 16:50:47 CEST 2009
Author: aliov
Date: 2009-07-27 14:50:47 +0000 (Mon, 27 Jul 2009)
New Revision: 7849
Added:
parole/trunk/data/icons/scalable/
parole/trunk/data/icons/scalable/Makefile.am
parole/trunk/data/icons/scalable/apps/
parole/trunk/data/icons/scalable/apps/Makefile.am
parole/trunk/data/icons/scalable/apps/parole.svg
parole/trunk/data/icons/scalable/status/
parole/trunk/data/icons/scalable/status/Makefile.am
parole/trunk/plugins/tray/
parole/trunk/plugins/tray/Makefile.am
parole/trunk/plugins/tray/tray-icon.c
Modified:
parole/trunk/ChangeLog
parole/trunk/TODO
parole/trunk/configure.ac.in
parole/trunk/data/desktop/parole.desktop.in.in
parole/trunk/data/icons/Makefile.am
parole/trunk/data/interfaces/parole.ui
parole/trunk/data/interfaces/plugins.ui
parole/trunk/data/pixmaps/parole.png
parole/trunk/parole/Makefile.am
parole/trunk/parole/parole-gst.c
parole/trunk/parole/parole-gst.h
parole/trunk/parole/parole-module.c
parole/trunk/parole/parole-player.c
parole/trunk/parole/parole-plugin.c
parole/trunk/parole/parole-plugin.h
parole/trunk/parole/parole-plugins-manager.c
parole/trunk/parole/parole-rc-utils.h
parole/trunk/parole/parole-stream.c
parole/trunk/parole/parole-stream.h
parole/trunk/plugins/Makefile.am
parole/trunk/plugins/properties/stream-properties.c
parole/trunk/po/POTFILES.in
parole/trunk/po/parole-media-player.pot
Log:
* Added system tray icon plugin, with optional notification
support.
* plugins, Now have optional configure dialog.
* Added some home made icons and a logo.
* Always set the stop button sensitive when we are trying to play
a media file, this gives the possibility to cancel at any time.
Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/ChangeLog 2009-07-27 14:50:47 UTC (rev 7849)
@@ -1,3 +1,11 @@
+2009-07-27: 15:36 Ali aliov at xfce.org
+ * Added system tray icon plugin, with optional notification
+ support.
+ * plugins, Now have optional configure dialog.
+ * Added some home made icons and a logo.
+ * Always set the stop button sensitive when we are trying to play
+ a media file, this gives the possibility to cancel at any time.
+
2009-07-26: 01:15 Ali aliov at xfce.org
* Provides a dialog to load/unload plugins.
* data/interfaces/ Mark some gtk labels as non-translatable+default
Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/TODO 2009-07-27 14:50:47 UTC (rev 7849)
@@ -1,6 +1,6 @@
=== Media player ===
-* Configure plugins dialog to load/unload plugins.
* Better statusbar information.
+* Complete the settings dialog.
* Complete the shortcut keys.
* Encoding support for subtitles.
* Better support for cdda.
Modified: parole/trunk/configure.ac.in
===================================================================
--- parole/trunk/configure.ac.in 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/configure.ac.in 2009-07-27 14:50:47 UTC (rev 7849)
@@ -132,6 +132,22 @@
AM_CONDITIONAL([PAROLE_PROPERTIES_PLUGIN], [test x"$ac_properties_plugin" = x"yes"])
AC_MSG_RESULT([$ac_properties_plugin])
+# Tray plugin.
+#--------------------------
+AC_ARG_ENABLE([tray-plugin], AC_HELP_STRING([--disable-tray-plugin], [Don't build parole tray icon plugin]),
+ [ac_tray_plugin=$enableval], [ac_tray_plugin=yes])
+AC_MSG_CHECKING([whether to build the system tray plugin])
+AM_CONDITIONAL([PAROLE_TRAY_PLUGIN], [test x"$ac_tray_plugin" = x"yes"])
+AC_MSG_RESULT([$ac_tray_plugin])
+# Should we build the tray icon with notification support?
+LIBNOTIFY_FOUND="no"
+if test x"$ac_tray_plugin" = x"yes"; then
+ XDT_CHECK_OPTIONAL_PACKAGE([LIBNOTIFY],
+ [libnotify], [libnotify_minimum_version],
+ [libnotify],
+ [libnotify library], [yes])
+fi
+
#=======================================================#
# Check for debugging support #
#=======================================================#
@@ -148,11 +164,15 @@
data/pixmaps/Makefile
data/interfaces/Makefile
data/icons/Makefile
+data/icons/scalable/Makefile
+data/icons/scalable/apps/Makefile
+data/icons/scalable/status/Makefile
data/mime/Makefile
data/desktop/Makefile
parole/Makefile
plugins/Makefile
plugins/properties/Makefile
+plugins/tray/Makefile
docs/Makefile
docs/plugin-api/version.xml
docs/plugin-api/Makefile
@@ -170,9 +190,10 @@
Debug: $enable_debug
Building plugin api docs: ${enable_gtk_doc}
- Plugins to build:
- -----------------
- Stream Properties plugin: ${ac_properties_plugin}
+ Plugins to build:
+ =================
+ Stream Properties: ${ac_properties_plugin}
+ System Tray icon: ${ac_tray_plugin} (With notification $LIBNOTIFY_FOUND).
------------------------------------------------------
Configuration finished, type make to compile"
Modified: parole/trunk/data/desktop/parole.desktop.in.in
===================================================================
--- parole/trunk/data/desktop/parole.desktop.in.in 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/data/desktop/parole.desktop.in.in 2009-07-27 14:50:47 UTC (rev 7849)
@@ -1,6 +1,6 @@
[Desktop Entry]
_Name=Parole Media Player
-Icon=multimedia
+Icon=parole
Exec=parole-media-player %F
Terminal=false
Type=Application;
Modified: parole/trunk/data/icons/Makefile.am
===================================================================
--- parole/trunk/data/icons/Makefile.am 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/data/icons/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,17 @@
+SUBDIRS = \
+ scalable
+
+
+
+gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+
+install-data-hook:
+ @-if test -z "$(DESTDIR)"; then \
+ echo "Updating Gtk icon cache."; \
+ $(gtk_update_icon_cache); \
+ else \
+ echo "*** Icon cache not updated. Remember to run:"; \
+ echo "***"; \
+ echo "*** $(gtk_update_icon_cache)"; \
+ echo "***"; \
+ fi
Added: parole/trunk/data/icons/scalable/Makefile.am
===================================================================
--- parole/trunk/data/icons/scalable/Makefile.am (rev 0)
+++ parole/trunk/data/icons/scalable/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,2 @@
+SUBDIRS = apps status
+
Added: parole/trunk/data/icons/scalable/apps/Makefile.am
===================================================================
--- parole/trunk/data/icons/scalable/apps/Makefile.am (rev 0)
+++ parole/trunk/data/icons/scalable/apps/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,7 @@
+EXTRA_DIST = \
+ $(Data_DATA)
+
+Datadir = $(datadir)/icons/hicolor/scalable/apps
+
+Data_DATA = \
+ parole.svg
Added: parole/trunk/data/icons/scalable/apps/parole.svg
===================================================================
--- parole/trunk/data/icons/scalable/apps/parole.svg (rev 0)
+++ parole/trunk/data/icons/scalable/apps/parole.svg 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,1346 @@
+<?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="64px"
+ height="64px"
+ id="svg2393"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="parole.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2395">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 32 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="64 : 32 : 1"
+ inkscape:persp3d-origin="32 : 21.333333 : 1"
+ id="perspective2401" />
+ <linearGradient
+ y2="47.250328"
+ x2="12.875"
+ y1="1.2498308"
+ x1="12.875"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7275"
+ xlink:href="#linearGradient3459"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="0.74983191"
+ x2="10"
+ y1="49.613293"
+ x1="10"
+ gradientTransform="translate(1,-1)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7273"
+ xlink:href="#linearGradient3435"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="1.8811454"
+ x2="17.375"
+ y1="47.874966"
+ x1="17.375"
+ gradientTransform="translate(1,-1)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7271"
+ xlink:href="#linearGradient3427"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="31.003086"
+ x2="12.625"
+ y1="21.121838"
+ x1="12.625"
+ gradientTransform="matrix(0.8,0,0,1,2.4,11)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7263"
+ xlink:href="#linearGradient7221"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="28.762295"
+ x2="12.625"
+ y1="20.371838"
+ x1="12.625"
+ gradientTransform="matrix(0.8,0,0,1,2.4,23)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7261"
+ xlink:href="#linearGradient7213"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="31.003086"
+ x2="12.625"
+ y1="21.121838"
+ x1="12.625"
+ gradientTransform="matrix(0.8,0,0,1,2.4,-1)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7259"
+ xlink:href="#linearGradient7686"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="31.003086"
+ x2="12.625"
+ y1="21.121838"
+ x1="12.625"
+ gradientTransform="matrix(0.8,0,0,1,2.4,-13)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7257"
+ xlink:href="#linearGradient7227"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="1.5"
+ x2="13.125"
+ y1="7.00071"
+ x1="13.125"
+ gradientTransform="matrix(0.8,0,0,1,2.4,-1)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7255"
+ xlink:href="#linearGradient7726"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0982903,0,0,1.451942,-30.497853,0.5192613)"
+ r="7"
+ fy="6.2929435"
+ fx="30.5"
+ cy="6.2929435"
+ cx="30.5"
+ id="radialGradient7253"
+ xlink:href="#linearGradient7247"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.4244604,0,22.913669)"
+ r="8.6875"
+ fy="39.8125"
+ fx="38.8125"
+ cy="39.8125"
+ cx="38.8125"
+ id="radialGradient8052"
+ xlink:href="#linearGradient8046"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="43.406342"
+ x2="35.606419"
+ y1="40.792191"
+ x1="33.786095"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8034"
+ xlink:href="#linearGradient2397"
+ inkscape:collect="always" />
+ <radialGradient
+ r="6.1868596"
+ fy="39.242989"
+ fx="31.635492"
+ cy="39.242989"
+ cx="31.635492"
+ gradientTransform="matrix(0.8459014,0,-2.6674958e-8,0.2782165,5.0485079,30.343064)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient8032"
+ xlink:href="#linearGradient2508"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="24.705801"
+ x2="18.488775"
+ y1="8.672389"
+ x1="18.488775"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8030"
+ xlink:href="#linearGradient3345"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="24.705801"
+ x2="18.488775"
+ y1="8.672389"
+ x1="18.488775"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8028"
+ xlink:href="#linearGradient3345"
+ inkscape:collect="always" />
+ <radialGradient
+ r="7"
+ fy="19.956959"
+ fx="33.457024"
+ cy="19.956959"
+ cx="33.457024"
+ gradientTransform="matrix(0.9037069,-0.5217554,0.9177806,1.5896425,-14.147728,4.4338202)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient8026"
+ xlink:href="#linearGradient3390"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="24.705801"
+ x2="18.488775"
+ y1="8.672389"
+ x1="18.488775"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8024"
+ xlink:href="#linearGradient3345"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="24.705801"
+ x2="18.488775"
+ y1="8.672389"
+ x1="18.488775"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8022"
+ xlink:href="#linearGradient3345"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="43.406342"
+ x2="35.606419"
+ y1="40.792191"
+ x1="33.786095"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8020"
+ xlink:href="#linearGradient2397"
+ inkscape:collect="always" />
+ <radialGradient
+ r="6.1868596"
+ fy="39.242989"
+ fx="31.635492"
+ cy="39.242989"
+ cx="31.635492"
+ gradientTransform="matrix(0.8459014,0,-2.6674958e-8,0.2782165,5.0485079,30.343064)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient8018"
+ xlink:href="#linearGradient2508"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="18.520807"
+ x2="28.5"
+ y1="9.122757"
+ x1="32.426598"
+ gradientTransform="translate(5,0)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8016"
+ xlink:href="#linearGradient7789"
+ inkscape:collect="always" />
+ <radialGradient
+ r="9.375"
+ fy="9.375"
+ fx="9.375"
+ cy="9.375"
+ cx="9.375"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5879"
+ xlink:href="#linearGradient3524"
+ inkscape:collect="always" />
+ <radialGradient
+ r="9.375"
+ fy="9.375"
+ fx="9.375"
+ cy="9.375"
+ cx="9.375"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5877"
+ xlink:href="#linearGradient3524"
+ inkscape:collect="always" />
+ <radialGradient
+ r="9.375"
+ fy="9.375"
+ fx="9.375"
+ cy="9.375"
+ cx="9.375"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5875"
+ xlink:href="#linearGradient3524"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="40.00526"
+ x2="29"
+ y1="31.069963"
+ x1="28.976408"
+ gradientTransform="translate(-222.45316,-277.85765)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5654"
+ xlink:href="#linearGradient4457"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="40.00526"
+ x2="29"
+ y1="31.069963"
+ x1="28.976408"
+ gradientTransform="matrix(0.750053,0,0,0.750052,49.87293,11.12351)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5643"
+ xlink:href="#linearGradient4457"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="40.00526"
+ x2="29"
+ y1="31.069963"
+ x1="28.976408"
+ gradientTransform="translate(-1,-1)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5639"
+ xlink:href="#linearGradient4457"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4457"
+ inkscape:collect="always">
+ <stop
+ id="stop4459"
+ offset="0"
+ style="stop-color:#cc0000" />
+ <stop
+ id="stop4461"
+ offset="1"
+ style="stop-color:#ef2929" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3524">
+ <stop
+ style="stop-color:#729fcf;stop-opacity:0;"
+ offset="0"
+ id="stop5270" />
+ <stop
+ id="stop5272"
+ offset="0.85000002"
+ style="stop-color:#729fcf;stop-opacity:0;" />
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1;"
+ offset="1"
+ id="stop3528" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2508">
+ <stop
+ id="stop2510"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop2512"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2397">
+ <stop
+ id="stop2399"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop2401"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3345"
+ inkscape:collect="always">
+ <stop
+ id="stop3347"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3349"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3390"
+ inkscape:collect="always">
+ <stop
+ id="stop3392"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ id="stop3394"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3427">
+ <stop
+ id="stop3429"
+ offset="0"
+ style="stop-color:#555753;stop-opacity:0;" />
+ <stop
+ style="stop-color:#6d6f6a;stop-opacity:1;"
+ offset="0.34788632"
+ id="stop3445" />
+ <stop
+ id="stop3447"
+ offset="0.79285717"
+ style="stop-color:#6f726c;stop-opacity:1;" />
+ <stop
+ id="stop3431"
+ offset="1"
+ style="stop-color:#555753;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3435">
+ <stop
+ id="stop3437"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:0;" />
+ <stop
+ style="stop-color:#2e3436;stop-opacity:1;"
+ offset="0.19285715"
+ id="stop3449" />
+ <stop
+ id="stop3453"
+ offset="0.69999999"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ <stop
+ id="stop3439"
+ offset="1"
+ style="stop-color:#2e3436;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3459">
+ <stop
+ id="stop3461"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.1632653"
+ id="stop3467" />
+ <stop
+ id="stop3472"
+ offset="0.80000001"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3463"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7686">
+ <stop
+ id="stop7688"
+ offset="0"
+ style="stop-color:#729fcf;stop-opacity:1" />
+ <stop
+ id="stop7690"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7726"
+ inkscape:collect="always">
+ <stop
+ id="stop7728"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop7730"
+ offset="1"
+ style="stop-color:#729fcf;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7789">
+ <stop
+ style="stop-color:#a7cc5c;stop-opacity:1;"
+ offset="0"
+ id="stop7791" />
+ <stop
+ style="stop-color:#789e2d;stop-opacity:1;"
+ offset="1"
+ id="stop7793" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8046"
+ inkscape:collect="always">
+ <stop
+ id="stop8048"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop8050"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7213">
+ <stop
+ style="stop-color:#9bbbdd;stop-opacity:1"
+ offset="0"
+ id="stop7215" />
+ <stop
+ id="stop7219"
+ offset="0.5"
+ style="stop-color:#b8cfe7;stop-opacity:0.0295858;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1"
+ id="stop7217" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7221">
+ <stop
+ id="stop7223"
+ offset="0"
+ style="stop-color:#729fcf;stop-opacity:1" />
+ <stop
+ id="stop7225"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.69083971" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7227">
+ <stop
+ id="stop7229"
+ offset="0"
+ style="stop-color:#729fcf;stop-opacity:0.62213743" />
+ <stop
+ id="stop7231"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7247"
+ inkscape:collect="always">
+ <stop
+ id="stop7249"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop7251"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective167"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <radialGradient
+ spreadMethod="pad"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient619"
+ id="radialGradient627"
+ r="5.5634472"
+ fy="55.133288"
+ fx="28.736504"
+ cy="55.133288"
+ cx="28.736504"
+ gradientTransform="scale(1.074784,0.9304195)" />
+ <linearGradient
+ spreadMethod="pad"
+ gradientUnits="objectBoundingBox"
+ xlink:href="#linearGradient619"
+ id="linearGradient626"
+ y2="0.00000000"
+ x2="1.00000000"
+ y1="0.00000000"
+ x1="0.00000000" />
+ <radialGradient
+ spreadMethod="pad"
+ gradientTransform="matrix(1.074967,0,0,0.930261,-2.970606e-7,-1.274941e-6)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient619"
+ id="radialGradient622"
+ r="3.43041444"
+ fy="60.7591972"
+ fx="9.37104893"
+ cy="60.7591972"
+ cx="9.37104893" />
+ <linearGradient
+ spreadMethod="pad"
+ gradientUnits="objectBoundingBox"
+ id="linearGradient619"
+ y2="0.00000000"
+ x2="1.00000000"
+ y1="0.00000000"
+ x1="0.00000000">
+ <stop
+ id="stop620"
+ offset="0.00000000"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop621"
+ offset="1.00000000"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective3185"
+ inkscape:persp3d-origin="45 : 30 : 1"
+ inkscape:vp_z="90 : 45 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 45 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3427"
+ id="linearGradient3861"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1,-1)"
+ x1="17.375"
+ y1="47.874966"
+ x2="17.375"
+ y2="1.8811454" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3435"
+ id="linearGradient3863"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1,-1)"
+ x1="10"
+ y1="49.613293"
+ x2="10"
+ y2="0.74983191" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7686"
+ id="linearGradient3865"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0,0,1,2.4,-1)"
+ x1="12.625"
+ y1="21.121838"
+ x2="12.625"
+ y2="31.003086" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3459"
+ id="linearGradient3867"
+ gradientUnits="userSpaceOnUse"
+ x1="12.875"
+ y1="1.2498308"
+ x2="12.875"
+ y2="47.250328" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7227"
+ id="linearGradient3869"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0,0,1,2.4,-13)"
+ x1="12.625"
+ y1="21.121838"
+ x2="12.625"
+ y2="31.003086" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7726"
+ id="linearGradient3871"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0,0,1,2.4,-1)"
+ x1="13.125"
+ y1="7.00071"
+ x2="13.125"
+ y2="1.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7221"
+ id="linearGradient3873"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0,0,1,2.4,11)"
+ x1="12.625"
+ y1="21.121838"
+ x2="12.625"
+ y2="31.003086" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7213"
+ id="linearGradient3875"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0,0,1,2.4,23)"
+ x1="12.625"
+ y1="20.371838"
+ x2="12.625"
+ y2="28.762295" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient619"
+ id="radialGradient3913"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.074967,0,0,0.930261,-2.9706059e-7,-1.274941e-6)"
+ spreadMethod="pad"
+ cx="9.37104893"
+ cy="60.7591972"
+ fx="9.37104893"
+ fy="60.7591972"
+ r="3.43041444" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient619"
+ id="radialGradient3915"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.074784,0.9304195)"
+ spreadMethod="pad"
+ cx="28.736504"
+ cy="55.133288"
+ fx="28.736504"
+ fy="55.133288"
+ r="5.5634472" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient619"
+ id="radialGradient3917"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.074967,0,0,0.930261,-2.9706061e-7,-1.274941e-6)"
+ spreadMethod="pad"
+ cx="9.37104893"
+ cy="60.7591972"
+ fx="9.37104893"
+ fy="60.7591972"
+ r="3.43041444" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="32"
+ inkscape:cy="25.606225"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1280"
+ inkscape:window-height="721"
+ inkscape:window-x="0"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata2398">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ inkscape:label="Layer 1"
+ id="g2863"
+ transform="translate(153.22661,104.92883)">
+ <g
+ transform="translate(9,3)"
+ style="opacity:0.30632181"
+ id="g3238" />
+ <g
+ transform="translate(1.0000005,98.6875)"
+ id="g3374" />
+ <g
+ transform="translate(-80,60)"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/lapo/Desktop/kenneth.png"
+ style="opacity:0"
+ id="g3681">
+ <rect
+ style="opacity:0.25999989;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3675"
+ width="48"
+ height="48"
+ x="0"
+ y="-1.7763568e-15" />
+ <rect
+ style="opacity:0.25999989;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3677"
+ width="48"
+ height="48"
+ x="-80"
+ y="-1.7763568e-15" />
+ <rect
+ style="opacity:0.25999989;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3679"
+ width="48"
+ height="48"
+ x="-160"
+ y="-1.7763568e-15" />
+ </g>
+ <rect
+ style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;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:none;overflow:visible"
+ id="rect1315"
+ width="16"
+ height="16"
+ x="-203.45316"
+ y="-253.85765" />
+ <rect
+ style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;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:none;overflow:visible"
+ id="rect3481"
+ width="22"
+ height="22"
+ x="-203.45316"
+ y="-227.85765" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient5875);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.60878164;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:none;overflow:visible"
+ id="path3584"
+ sodipodi:cx="9.375"
+ sodipodi:cy="9.375"
+ sodipodi:rx="9.375"
+ sodipodi:ry="9.375"
+ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
+ transform="matrix(1.706666,0,0,1.706666,-151.45316,-198.85765)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient5877);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.48148614;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:none;overflow:visible"
+ id="path3586"
+ sodipodi:cx="9.375"
+ sodipodi:cy="9.375"
+ sodipodi:rx="9.375"
+ sodipodi:ry="9.375"
+ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
+ transform="matrix(2.133334,0,0,2.133334,-155.45316,-202.85766)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient5879);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.39974412;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:none;overflow:visible"
+ id="path3588"
+ sodipodi:cx="9.375"
+ sodipodi:cy="9.375"
+ sodipodi:rx="9.375"
+ sodipodi:ry="9.375"
+ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
+ transform="matrix(2.559999,0,0,2.559999,-159.45316,-206.85765)" />
+ <g
+ style="display:none"
+ id="g3977"
+ transform="translate(-339.45321,-219.35765)">
+ <path
+ transform="matrix(1.142857,0,0,1.5,-11.14285,-8.25)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path3954"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ <rect
+ y="26"
+ x="53"
+ height="8.5"
+ width="1"
+ id="rect3956"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3964"
+ d="M 54,26 C 56,26 55.5,29 56.5,28.999999 C 54.5,29 56,27.5 54,27.5 L 54,26 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ style="display:none"
+ id="g3997"
+ transform="translate(-339.45321,-219.35765)">
+ <path
+ transform="matrix(1.142857,0,0,1.5,-2.642849,-8.25)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path3984"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ <rect
+ y="26"
+ x="61.5"
+ height="8.5"
+ width="1"
+ id="rect3986"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3988"
+ d="M 62.500001,26 C 64.5,26 64,28.500001 65,28.5 C 63.499999,28.500001 64.500001,27.5 62.500001,27.5 L 62.500001,26 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3995"
+ d="M 62.500001,28 C 64.5,28 64,30.500001 65,30.5 C 63.499999,30.500001 64.500001,29.5 62.500001,29.5 L 62.500001,28 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ </g>
+ <g
+ transform="translate(-261.45316,-253.85765)"
+ id="g4113"
+ style="display:none">
+ <path
+ transform="matrix(-1.142857,0,0,-1.5,56.14275,104.75)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path4005"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-70.5"
+ x="8.0000496"
+ height="8.5"
+ width="1"
+ id="rect4007"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path4009"
+ d="M -8.00005,70.499999 C -6.00005,70.499999 -6.50005,67.499999 -5.50005,67.5 C -7.50005,67.499999 -6.00005,68.999999 -8.00005,68.999999 L -8.00005,70.499999 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ </g>
+ <g
+ style="display:none"
+ id="g4028"
+ transform="translate(-339.95316,-219.35765)">
+ <path
+ transform="matrix(-1.142857,0,0,-1.5,142.6428,70.25)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path4016"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-36"
+ x="-78.5"
+ height="8.5"
+ width="1"
+ id="rect4018"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path4020"
+ d="M 78.500001,36 C 80.5,36 80,33.499999 81,33.5 C 79.499999,33.499999 80.500001,34.5 78.500001,34.5 L 78.500001,36 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path4022"
+ d="M 78.500001,34 C 80.5,34 80,31.499999 81,31.5 C 79.499999,31.499999 80.500001,32.5 78.500001,32.5 L 78.500001,34 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ </g>
+ <g
+ id="g4074"
+ transform="translate(-260.45316,-254.85765)"
+ style="display:none">
+ <path
+ transform="matrix(1.142857,0,0,1.5,-89.14285,39.75)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path4053"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="rect4055"
+ d="M -25,74 L -19,75.5 L -19,84 L -20,84 L -20,77 L -24,76 L -24,82.5 L -25,82.5 L -25,74 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ transform="matrix(1.142857,0,0,1.5,-84.14285,41.25)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path4061"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g4090"
+ transform="translate(-261.95316,-255.85765)"
+ style="display:none">
+ <path
+ transform="matrix(1.142857,0,0,-1.5,-74.64285,120.75)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path4081"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path4083"
+ d="M -13.5,86.5 L -7.5,85 L -7.5,76.5 L -8.5,76.5 L -8.5,83.5 L -12.5,84.5 L -12.5,78 L -13.5,78 L -13.5,86.5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ transform="matrix(1.142857,0,0,-1.5,-69.64285,119.25)"
+ d="M 57,28.5 A 1.75,1 0 1 1 53.5,28.5 A 1.75,1 0 1 1 57,28.5 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1.75"
+ sodipodi:cy="28.5"
+ sodipodi:cx="55.25"
+ id="path4085"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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"
+ sodipodi:type="arc" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="fill:#5c3566;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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:none;overflow:visible"
+ id="path5560"
+ sodipodi:cx="64"
+ sodipodi:cy="37"
+ sodipodi:rx="16"
+ sodipodi:ry="16"
+ d="M 80,37 A 16,16 0 1 1 48,37 A 16,16 0 1 1 80,37 z"
+ transform="translate(-197.94836,-174.85285)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#75507b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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:none;overflow:visible"
+ id="path5562"
+ sodipodi:cx="64"
+ sodipodi:cy="37"
+ sodipodi:rx="16"
+ sodipodi:ry="16"
+ d="M 80,37 A 16,16 0 1 1 48,37 A 16,16 0 1 1 80,37 z"
+ transform="matrix(0.7503,0,0,0.7503,-181.96756,-165.61395)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ad7fa8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;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:none;overflow:visible"
+ id="path5564"
+ sodipodi:cx="64"
+ sodipodi:cy="37"
+ sodipodi:rx="16"
+ sodipodi:ry="16"
+ d="M 80,37 A 16,16 0 1 1 48,37 A 16,16 0 1 1 80,37 z"
+ transform="matrix(0.499916,0,0,0.499916,-165.943,-156.34975)" />
+ <g
+ id="g4489"
+ transform="translate(-261.45316,-254.85765)"
+ style="display:none">
+ <rect
+ ry="1.0852587"
+ y="27.5"
+ x="26.5"
+ height="12"
+ width="12"
+ id="rect4451"
+ style="fill:url(#linearGradient5639);fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1;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" />
+ <g
+ transform="translate(-2.000047,-2.00005)"
+ id="g4467">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;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"
+ id="rect4463"
+ width="9.0000229"
+ height="2.0000057"
+ x="44.997532"
+ y="-0.29288569"
+ ry="0"
+ transform="matrix(0.707107,0.707107,-0.707107,0.707107,0,0)" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;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"
+ id="rect4465"
+ width="9.0000229"
+ height="2.0000057"
+ x="-3.7929118"
+ y="48.497509"
+ ry="0"
+ transform="matrix(-0.707107,0.707107,0.707107,0.707107,0,0)" />
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ef2929;stroke-width:1;stroke-linecap:round;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"
+ id="rect4479"
+ width="10"
+ height="10"
+ x="27.5"
+ y="28.5"
+ ry="0" />
+ </g>
+ <rect
+ ry="1.0852587"
+ y="-249.35765"
+ x="-194.95316"
+ height="7"
+ width="7"
+ id="rect4506"
+ style="fill:url(#linearGradient5654);fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1;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:none;overflow:visible" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:none"
+ d="M -193.95316,-247.35765 L -192.95316,-248.35765 L -188.95316,-244.35765 L -189.95316,-243.35765 L -193.95316,-247.35765 z"
+ id="path4510"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:none"
+ d="M -192.95316,-243.35765 L -193.95316,-244.35765 L -189.95316,-248.35765 L -188.95316,-247.35765 L -192.95316,-243.35765 z"
+ id="path4512"
+ sodipodi:nodetypes="ccccc" />
+ <g
+ transform="translate(-261.45316,-253.85765)"
+ id="g5709"
+ style="display:none">
+ <rect
+ ry="0.99253845"
+ y="32.499989"
+ x="70.499382"
+ height="9.0006237"
+ width="9.0006361"
+ id="rect5674"
+ style="fill:url(#linearGradient5643);fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1;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" />
+ <rect
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ef2929;stroke-width:1;stroke-linecap:round;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"
+ id="rect5682"
+ width="7"
+ height="7"
+ x="71.5"
+ y="33.5"
+ ry="0" />
+ <g
+ id="g5705">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="M 72.5,35.5 L 73.5,34.5 L 77.5,38.5 L 76.5,39.5 L 72.5,35.5 z"
+ id="path5693"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="M 73.5,39.5 L 72.5,38.5 L 76.5,34.5 L 77.5,35.5 L 73.5,39.5 z"
+ id="path5695"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ </g>
+ <path
+ transform="matrix(1.0647482,0,0,1,-3.5755396,2.25)"
+ d="M 47.5,39.8125 A 8.6875,3.6875 0 1 1 30.125,39.8125 A 8.6875,3.6875 0 1 1 47.5,39.8125 z"
+ sodipodi:ry="3.6875"
+ sodipodi:rx="8.6875"
+ sodipodi:cy="39.8125"
+ sodipodi:cx="38.8125"
+ id="path8036"
+ style="opacity:0.35;fill:url(#radialGradient8052);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <g
+ transform="translate(1,0)"
+ style="opacity:0.9"
+ id="g7235">
+ <path
+ style="opacity:1;fill:url(#linearGradient7271);fill-opacity:1;stroke:url(#linearGradient7273);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2.5,-16.5 L 2.5,60.5 L 4.5,60.5 L 4.5,59.5 L 6.5,59.5 L 6.5,60.5 L 21.5,60.5 L 21.5,59.5 L 23.5,59.5 L 23.5,60.5 L 25.5,60.5 L 25.5,-16.5 L 23.5,-16.5 L 23.5,-14.5 L 21.5,-14.5 L 21.5,-16.5 L 6.5,-16.5 L 6.5,-14.5 L 4.5,-14.5 L 4.5,-16.5 L 2.5,-16.5 z M 4.5,-12.5 L 6.5,-12.5 L 6.5,-10.5 L 4.5,-10.5 L 4.5,-12.5 z M 21.5,-12.5 L 23.5,-12.5 L 23.5,-10.5 L 21.5,-10.5 L 21.5,-12.5 z M 4.5,-8.5 L 6.5,-8.5 L 6.5,-6.5 L 4.5,-6.5 L 4.5,-8.5 z M 21.5,-8.5 L 23.5,-8.5 L 23.5,-6.5 L 21.5,-6.5 L 21.5,-8.5 z M 4.5,-4.5 L 6.5,-4.5 L 6.5,-2.5 L 4.5,-2.5 L 4.5,-4.5 z M 21.5,-4.5 L 23.5,-4.5 L 23.5,-2.5 L 21.5,-2.5 L 21.5,-4.5 z M 4.5,-0.5 L 6.5,-0.5 L 6.5,1.5 L 4.5,1.5 L 4.5,-0.5 z M 21.5,-0.5 L 23.5,-0.5 L 23.5,1.5 L 21.5,1.5 L 21.5,-0.5 z M 4.5,3.5 L 6.5,3.5 L 6.5,5.5 L 4.5,5.5 L 4.5,3.5 z M 21.5,3.5 L 23.5,3.5 L 23.5,5.5 L 21.5,5.5 L 21.5,3.5 z M 4.5,7.5 L 6.5,7.5 L 6.5,9.5 L 4.5,9.5 L 4.5,7.5 z M 21.5,7.5 L 23.5,7.5 L 23.5,9.5 L 21.5,9.5 L 21.5,7.5 z M 4.5,11.5 L 6.5,11.5
L 6.5,13.5 L 4.5,13.5 L 4.5,11.5 z M 21.5,11.5 L 23.5,11.5 L 23.5,13.5 L 21.5,13.5 L 21.5,11.5 z M 4.5,15.5 L 6.5,15.5 L 6.5,17.5 L 4.5,17.5 L 4.5,15.5 z M 21.5,15.5 L 23.5,15.5 L 23.5,17.5 L 21.5,17.5 L 21.5,15.5 z M 4.5,19.5 L 6.5,19.5 L 6.5,21.5 L 4.5,21.5 L 4.5,19.5 z M 21.5,19.5 L 23.5,19.5 L 23.5,21.5 L 21.5,21.5 L 21.5,19.5 z M 4.5,23.5 L 6.5,23.5 L 6.5,25.5 L 4.5,25.5 L 4.5,23.5 z M 21.5,23.5 L 23.5,23.5 L 23.5,25.5 L 21.5,25.5 L 21.5,23.5 z M 4.5,27.5 L 6.5,27.5 L 6.5,29.5 L 4.5,29.5 L 4.5,27.5 z M 21.5,27.5 L 23.5,27.5 L 23.5,29.5 L 21.5,29.5 L 21.5,27.5 z M 4.5,31.5 L 6.5,31.5 L 6.5,33.5 L 4.5,33.5 L 4.5,31.5 z M 21.5,31.5 L 23.5,31.5 L 23.5,33.5 L 21.5,33.5 L 21.5,31.5 z M 4.5,35.5 L 6.5,35.5 L 6.5,37.5 L 4.5,37.5 L 4.5,35.5 z M 21.5,35.5 L 23.5,35.5 L 23.5,37.5 L 21.5,37.5 L 21.5,35.5 z M 4.5,39.5 L 6.5,39.5 L 6.5,41.5 L 4.5,41.5 L 4.5,39.5 z M 21.5,39.5 L 23.5,39.5 L 23.5,41.5 L 21.5,41.5 L 21.5,39.5 z M 4.5,43.5 L 6.5,43.5 L 6.5,45.5 L 4.5,45.5 L 4.5,43.5 z M
21.5,43.5 L 23.5,43.5 L 23.5,45.5 L 21.5,45.5 L 21.5,43.5 z M 4.5,47.5 L 6.5,47.5 L 6.5,49.5 L 4.5,49.5 L 4.5,47.5 z M 21.5,47.5 L 23.5,47.5 L 23.5,49.5 L 21.5,49.5 L 21.5,47.5 z M 4.5,51.5 L 6.5,51.5 L 6.5,53.5 L 4.5,53.5 L 4.5,51.5 z M 21.5,51.5 L 23.5,51.5 L 23.5,53.5 L 21.5,53.5 L 21.5,51.5 z M 4.5,55.5 L 6.5,55.5 L 6.5,57.5 L 4.5,57.5 L 4.5,55.5 z M 21.5,55.5 L 23.5,55.5 L 23.5,57.5 L 21.5,57.5 L 21.5,55.5 z"
+ id="rect3561"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient7259);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8,19 L 20,19 L 20,30 L 8,30 L 8,19 z"
+ id="rect3558"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.3;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7275);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
+ d="M 3.5,-15.5 L 24.5,-15.5 L 24.5,59.499992 L 3.5,59.499992 L 3.5,-15.5 z"
+ id="rect6707"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient7257);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+ d="M 8,7 L 20,7 L 20,18 L 8,18 L 8,7 z"
+ id="rect7694"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.5;fill:url(#linearGradient7255);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+ d="M 8,-5 L 20,-5 L 20,6 L 8,6 L 8,-5 z"
+ id="rect7698"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient7263);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+ d="M 8,31 L 20,31 L 20,42 L 8,42 L 8,31 z"
+ id="rect7702"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.74626896;fill:url(#linearGradient7261);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+ d="M 8,43 L 20,43 L 20,54 L 8,54 L 8,43 z"
+ id="path7209"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ transform="translate(-2,1)"
+ id="g8005">
+ <path
+ sodipodi:nodetypes="cccsssccccsssccccc"
+ id="rect2415"
+ d="M 31.5,5.5 L 31.5,12.5 L 31.5,27.3125 C 30.333,26.789102 28.74849,26.500001 27,26.5 C 23.41909,26.5 20.5,27.835511 20.5,29.5 C 20.5,31.16449 23.41909,32.500001 27,32.5 C 30.58091,32.5 33.5,31.164492 33.5,29.5 L 33.5,13.84375 L 44.5,21.15625 L 44.5,36.3125 C 43.333,35.789102 41.74849,35.500001 40,35.5 C 36.41909,35.5 33.5,36.835511 33.5,38.5 C 33.5,40.16449 36.41909,41.500001 40,41.5 C 43.58091,41.5 46.5,40.164492 46.5,38.5 L 46.5,22.5 L 46.5,17.5 L 46.5,15.5 L 31.5,5.5 z"
+ style="fill:url(#linearGradient8016);fill-opacity:1;fill-rule:nonzero;stroke:#42770c;stroke-width:1;stroke-linecap:round;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" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.7;fill:url(#radialGradient8018);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient8020);stroke-width:0.98374951;stroke-linecap:square;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"
+ id="path2237"
+ sodipodi:cx="33.786095"
+ sodipodi:cy="41.87933"
+ sodipodi:rx="5.6637621"
+ sodipodi:ry="1.8473293"
+ d="M 39.449857,41.87933 A 5.6637621,1.8473293 0 1 1 28.122333,41.87933 A 5.6637621,1.8473293 0 1 1 39.449857,41.87933 z"
+ transform="matrix(0.966787,0,0,1.068809,7.32798,-6.261024)" />
+ <g
+ id="g3361"
+ style="opacity:0.6529851"
+ transform="translate(5,1)">
+ <g
+ transform="translate(9,3)"
+ style="opacity:1;fill-opacity:1;stroke:url(#linearGradient8022)"
+ id="g3392">
+ <path
+ sodipodi:nodetypes="cc"
+ id="path2387"
+ d="M 18.5,25.5 L 18.5,4.5"
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8024);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.973384;display:inline" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccscccccc"
+ id="path3264"
+ d="M 27.5,6.375 L 27.5,11.5 L 27.5,12.75 C 27.526842,12.393366 27.742082,12.078211 28.064505,11.923448 C 28.386928,11.768685 28.767453,11.797873 29.0625,12 L 40.0625,19.3125 C 40.314911,19.482855 40.475956,19.758931 40.5,20.0625 L 40.5,16.5 L 40.5,15.0625 L 27.5,6.375 z"
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient8026);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" />
+ <g
+ transform="translate(22,13)"
+ style="opacity:1;fill-opacity:1;stroke:url(#linearGradient8028)"
+ id="g3353">
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3355"
+ d="M 18.5,25.5 L 18.5,2.5"
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8030);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.973384;display:inline" />
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.7;fill:url(#radialGradient8032);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient8034);stroke-width:0.98374951;stroke-linecap:square;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"
+ id="path7999"
+ sodipodi:cx="33.786095"
+ sodipodi:cy="41.87933"
+ sodipodi:rx="5.6637621"
+ sodipodi:ry="1.8473293"
+ d="M 39.449857,41.87933 A 5.6637621,1.8473293 0 1 1 28.122333,41.87933 A 5.6637621,1.8473293 0 1 1 39.449857,41.87933 z"
+ transform="matrix(0.966787,0,0,1.068809,-5.67202,-15.261024)" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ id="path7244"
+ d="M 43.5,17.0625 L 30.5,8.375"
+ style="opacity:0.88805967;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient7253);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" />
+ </g>
+ <g
+ id="g3845"
+ style="opacity:0.9;display:inline"
+ transform="matrix(2.6432826,0,0,1.1913711,-4.733227,2.4262009)">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+ id="path3847"
+ d="M 2.5,-16.5 L 2.5,60.5 L 4.5,60.5 L 4.5,59.5 L 6.5,59.5 L 6.5,60.5 L 21.5,60.5 L 21.5,59.5 L 23.5,59.5 L 23.5,60.5 L 25.5,60.5 L 25.5,-16.5 L 23.5,-16.5 L 23.5,-14.5 L 21.5,-14.5 L 21.5,-16.5 L 6.5,-16.5 L 6.5,-14.5 L 4.5,-14.5 L 4.5,-16.5 L 2.5,-16.5 z M 4.5,-12.5 L 6.5,-12.5 L 6.5,-10.5 L 4.5,-10.5 L 4.5,-12.5 z M 21.5,-12.5 L 23.5,-12.5 L 23.5,-10.5 L 21.5,-10.5 L 21.5,-12.5 z M 4.5,-8.5 L 6.5,-8.5 L 6.5,-6.5 L 4.5,-6.5 L 4.5,-8.5 z M 21.5,-8.5 L 23.5,-8.5 L 23.5,-6.5 L 21.5,-6.5 L 21.5,-8.5 z M 4.5,-4.5 L 6.5,-4.5 L 6.5,-2.5 L 4.5,-2.5 L 4.5,-4.5 z M 21.5,-4.5 L 23.5,-4.5 L 23.5,-2.5 L 21.5,-2.5 L 21.5,-4.5 z M 4.5,-0.5 L 6.5,-0.5 L 6.5,1.5 L 4.5,1.5 L 4.5,-0.5 z M 21.5,-0.5 L 23.5,-0.5 L 23.5,1.5 L 21.5,1.5 L 21.5,-0.5 z M 4.5,3.5 L 6.5,3.5 L 6.5,5.5 L 4.5,5.5 L 4.5,3.5 z M 21.5,3.5 L 23.5,3.5 L 23.5,5.5 L 21.5,5.5 L 21.5,3.5 z M 4.5,7.5 L 6.5,7.5 L 6.5,9.5 L 4.5,9.5 L 4.5,7.5 z M 21.5,7.5 L 23.5,7.5 L 23.5,9.5 L 21.5,9.5 L 21.5,7.5 z M 4.5,11.5 L 6.5,11.5 L
6.5,13.5 L 4.5,13.5 L 4.5,11.5 z M 21.5,11.5 L 23.5,11.5 L 23.5,13.5 L 21.5,13.5 L 21.5,11.5 z M 4.5,15.5 L 6.5,15.5 L 6.5,17.5 L 4.5,17.5 L 4.5,15.5 z M 21.5,15.5 L 23.5,15.5 L 23.5,17.5 L 21.5,17.5 L 21.5,15.5 z M 4.5,19.5 L 6.5,19.5 L 6.5,21.5 L 4.5,21.5 L 4.5,19.5 z M 21.5,19.5 L 23.5,19.5 L 23.5,21.5 L 21.5,21.5 L 21.5,19.5 z M 4.5,23.5 L 6.5,23.5 L 6.5,25.5 L 4.5,25.5 L 4.5,23.5 z M 21.5,23.5 L 23.5,23.5 L 23.5,25.5 L 21.5,25.5 L 21.5,23.5 z M 4.5,27.5 L 6.5,27.5 L 6.5,29.5 L 4.5,29.5 L 4.5,27.5 z M 21.5,27.5 L 23.5,27.5 L 23.5,29.5 L 21.5,29.5 L 21.5,27.5 z M 4.5,31.5 L 6.5,31.5 L 6.5,33.5 L 4.5,33.5 L 4.5,31.5 z M 21.5,31.5 L 23.5,31.5 L 23.5,33.5 L 21.5,33.5 L 21.5,31.5 z M 4.5,35.5 L 6.5,35.5 L 6.5,37.5 L 4.5,37.5 L 4.5,35.5 z M 21.5,35.5 L 23.5,35.5 L 23.5,37.5 L 21.5,37.5 L 21.5,35.5 z M 4.5,39.5 L 6.5,39.5 L 6.5,41.5 L 4.5,41.5 L 4.5,39.5 z M 21.5,39.5 L 23.5,39.5 L 23.5,41.5 L 21.5,41.5 L 21.5,39.5 z M 4.5,43.5 L 6.5,43.5 L 6.5,45.5 L 4.5,45.5 L 4.5,43.5 z M 2
1.5,43.5 L 23.5,43.5 L 23.5,45.5 L 21.5,45.5 L 21.5,43.5 z M 4.5,47.5 L 6.5,47.5 L 6.5,49.5 L 4.5,49.5 L 4.5,47.5 z M 21.5,47.5 L 23.5,47.5 L 23.5,49.5 L 21.5,49.5 L 21.5,47.5 z M 4.5,51.5 L 6.5,51.5 L 6.5,53.5 L 4.5,53.5 L 4.5,51.5 z M 21.5,51.5 L 23.5,51.5 L 23.5,53.5 L 21.5,53.5 L 21.5,51.5 z M 4.5,55.5 L 6.5,55.5 L 6.5,57.5 L 4.5,57.5 L 4.5,55.5 z M 21.5,55.5 L 23.5,55.5 L 23.5,57.5 L 21.5,57.5 L 21.5,55.5 z"
+ style="opacity:1;fill:url(#linearGradient3861);fill-opacity:1;stroke:url(#linearGradient3863);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3849"
+ d="M 8,19 L 20,19 L 20,30 L 8,30 L 8,19 z"
+ style="opacity:1;fill:url(#linearGradient3865);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3851"
+ d="M 3.5,-15.5 L 24.5,-15.5 L 24.5,59.499992 L 3.5,59.499992 L 3.5,-15.5 z"
+ style="opacity:0.3;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3867);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3853"
+ d="M 8,7 L 20,7 L 20,18 L 8,18 L 8,7 z"
+ style="opacity:1;fill:url(#linearGradient3869);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3855"
+ d="M 8,-5 L 20,-5 L 20,6 L 8,6 L 8,-5 z"
+ style="opacity:0.5;fill:url(#linearGradient3871);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3857"
+ d="M 8,31 L 20,31 L 20,42 L 8,42 L 8,31 z"
+ style="opacity:1;fill:url(#linearGradient3873);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3859"
+ d="M 8,43 L 20,43 L 20,54 L 8,54 L 8,43 z"
+ style="opacity:0.74626926;fill:url(#linearGradient3875);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
+ </g>
+ <g
+ id="g3877"
+ transform="matrix(0.7248717,0,0,0.6796277,7.1508262,-4.2292099)">
+ <g
+ id="g3879"
+ style="font-size:12px"
+ transform="translate(3.125,-8.28125)">
+ <path
+ id="path3881"
+ style="fill:#0d0000;fill-opacity:0.30147101;fill-rule:evenodd;stroke-width:1pt"
+ transform="matrix(1.035546,0,0,1.035546,0.722309,-0.302267)"
+ d="M 7.73398,34.2049 L 12.0429,51.3301 C 5.08232,51.2196 4.19844,55.9705 4.64039,59.1746 C 6.73961,68.2343 17.4567,65.6933 24.5277,62.7102 C 23.6438,59.506 20.3293,44.3696 19.8874,41.7178 C 23.7543,40.7235 31.8198,38.4033 31.8198,38.4033 C 31.8198,38.4033 34.6924,45.5849 35.1343,47.0212 C 26.0745,46.6897 25.4117,52.3244 26.1851,54.8656 C 27.6214,61.9367 34.0295,61.8262 37.5651,60.8318 C 40.8796,60.2795 45.52,58.2907 48.0612,57.1859 C 47.0668,53.3189 38.3384,29.233 37.2336,26.1394 C 32.9246,27.6862 7.62349,34.4258 7.73398,34.2049 z" />
+ <path
+ id="path3883"
+ style="fill:#0d3c07;fill-rule:evenodd;stroke-width:1pt"
+ d="M 7.73398,34.2049 L 12.0429,51.3301 C 5.08232,51.2196 4.19844,55.9705 4.64039,59.1746 C 6.73961,68.2343 17.4567,65.6933 24.5277,62.7102 C 23.6438,59.506 20.3293,44.3696 19.8874,41.7178 C 23.7543,40.7235 31.8198,38.4033 31.8198,38.4033 C 31.8198,38.4033 34.6924,45.5849 35.1343,47.0212 C 26.0745,46.6897 25.4117,52.3244 26.1851,54.8656 C 27.6214,61.9367 34.0295,61.8262 37.5651,60.8318 C 40.8796,60.2795 45.52,58.2907 48.0612,57.1859 C 47.0668,53.3189 38.3384,29.233 37.2336,26.1394 C 32.9246,27.6862 7.62349,34.4258 7.73398,34.2049 z" />
+ <path
+ id="path3885"
+ style="fill:#2aaf18;fill-rule:evenodd;stroke-width:1pt"
+ d="M 15.7994,54.2027 L 11.159,35.9726 L 35.7973,29.1225 L 44.7466,54.9761 C 44.7466,54.9761 33.3666,59.506 31.7093,57.5173 C 28.9471,57.4067 26.7375,51.2197 33.4771,50.0043 C 37.1231,49.8938 38.5594,49.6728 39.5538,50.0042 L 33.3666,34.0944 L 15.247,39.3977 L 20.3293,60.0584 C 20.3293,60.0584 13.7002,64.9198 7.95495,60.1689 C 6.73961,59.0641 6.62912,56.0809 8.61786,54.9761 C 10.2751,52.8769 15.6889,54.4237 15.7994,54.2027 z" />
+ <path
+ id="path3887"
+ style="fill:url(#radialGradient3913);fill-rule:evenodd;stroke-width:1pt"
+ transform="matrix(1.488889,0,0,1.488889,-6.003039,-28.69898)"
+ d="M 14.4736,57.5725 C 12.6184,56.7928 11.9994,58.2032 11.601,60.0584 C 10.0153,60.0584 8.87676,59.2416 8.87676,57.8693 C 8.87676,56.4971 9.94109,55.5318 11.5268,55.5318 C 13.1125,55.5318 14.4736,56.2003 14.4736,57.5725 z" />
+ <path
+ id="path3889"
+ style="fill:url(#radialGradient3915);fill-rule:evenodd;stroke-width:1pt"
+ d="M 37.3441,53.6503 C 33.3666,51.8834 34.4706,54.4237 33.6428,56.8544 C 31.5997,56.8544 29.9416,55.4189 29.9416,53.6503 C 29.9416,51.8816 31.5997,50.4462 33.6428,50.4462 C 35.6859,50.4462 37.3441,51.8816 37.3441,53.6503 z" />
+ <path
+ id="path3891"
+ style="fill:#34674b;fill-rule:evenodd;stroke-width:1pt"
+ d="M 15.3575,39.5082 L 33.3666,34.2049 L 33.8085,32.5476 L 15.7994,37.7404 L 15.3575,39.5082 z" />
+ <path
+ id="path3893"
+ style="fill:#cbff87;fill-rule:evenodd;stroke-width:1pt"
+ d="M 11.159,35.9726 L 13.3687,36.5251 L 36.1287,30.2274 L 35.6868,29.1225 L 11.159,35.9726 z" />
+ <path
+ id="path3895"
+ style="fill:#cbff87;fill-rule:evenodd;stroke-width:1pt"
+ d="M 33.6981,32.879 L 39.6643,49.8938 L 33.2561,34.2049 L 33.6981,32.879 z" />
+ <path
+ id="path3897"
+ style="fill:#cbff87;fill-rule:evenodd;stroke-width:1pt"
+ d="M 13.1478,36.1936 C 13.1478,36.1936 16.1309,54.3132 16.0204,54.3132 C 15.9099,54.3132 11.2695,36.0831 11.2695,36.0831 L 13.1478,36.1936 z" />
+ </g>
+ <g
+ id="g3899"
+ style="font-size:12px"
+ transform="translate(-8.90625,-2.1875)">
+ <path
+ id="path3901"
+ style="fill:#0d0007;fill-opacity:0.3;fill-rule:evenodd;stroke-width:1pt"
+ transform="translate(1.878252,1.988735)"
+ d="M 59.5517,32.3266 L 63.5291,56.8544 C 52.7015,54.3132 51.9282,59.948 52.1491,63.152 C 52.7016,75.8578 66.6227,75.416 71.926,72.6538 C 72.147,68.8973 71.926,40.7235 71.926,40.7235 C 76.3454,35.9727 84.4109,27.0233 86.7311,24.4821 C 80.8753,25.808 62.5347,31.6637 59.5517,32.3266 z" />
+ <path
+ id="path3903"
+ style="fill:#0d3c07;fill-rule:evenodd;stroke-width:1pt"
+ d="M 59.5517,32.3266 L 63.5291,56.8544 C 52.7015,54.3132 51.9282,59.948 52.1491,63.152 C 52.7016,75.8578 66.6227,75.416 71.926,72.6538 C 72.147,68.8973 71.926,40.7235 71.926,40.7235 C 76.3454,35.9727 84.4109,27.0233 86.7311,24.4821 C 80.8753,25.808 62.5347,31.6637 59.5517,32.3266 z" />
+ <path
+ id="path3905"
+ style="fill:#2aaf18;fill-rule:evenodd;stroke-width:1pt"
+ d="M 67.5066,63.9254 L 63.1977,35.6412 L 80.4334,28.1282 L 67.9485,39.6186 C 67.838,41.3864 69.6058,67.3505 69.2744,69.3392 C 69.6059,70.9966 67.1751,70.665 64.8549,70.665 C 56.0162,69.2287 53.1435,62.5996 58.5573,60.0584 C 61.5404,59.5061 66.5122,61.2738 67.5066,63.9254 z" />
+ <path
+ id="path3907"
+ style="fill:url(#radialGradient3917);fill-rule:evenodd;stroke-width:1pt"
+ transform="matrix(1.488889,0,0,1.488889,42.83153,-22.62228)"
+ d="M 14.4736,57.5725 C 12.6184,56.7928 11.9994,58.2032 11.601,60.0584 C 10.0153,60.0584 8.87676,59.2416 8.87676,57.8693 C 8.87676,56.4971 9.94109,55.5318 11.5268,55.5318 C 13.1125,55.5318 14.4736,56.2003 14.4736,57.5725 z" />
+ <path
+ id="path3909"
+ style="fill:#34674b;fill-rule:evenodd;stroke-width:1pt"
+ d="M 67.9485,39.8396 L 67.3961,37.9614 L 80.2124,28.2386 L 67.9485,39.8396 z" />
+ <path
+ id="path3911"
+ style="fill:#cbff87;fill-rule:evenodd;stroke-width:1pt"
+ d="M 79.881,28.4596 L 64.634,36.5251 L 67.5066,63.4835 L 63.1977,35.5307 L 79.881,28.4596 z" />
+ </g>
+ </g>
+ </g>
+</svg>
Added: parole/trunk/data/icons/scalable/status/Makefile.am
===================================================================
--- parole/trunk/data/icons/scalable/status/Makefile.am (rev 0)
+++ parole/trunk/data/icons/scalable/status/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,6 @@
+EXTRA_DIST = \
+ $(Data_DATA)
+
+Datadir = $(datadir)/icons/hicolor/scalable/status
+
+Data_DATA =
Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/data/interfaces/parole.ui 2009-07-27 14:50:47 UTC (rev 7849)
@@ -6,9 +6,10 @@
<property name="window_position">center</property>
<property name="default_width">780</property>
<property name="default_height">480</property>
+ <property name="icon_name">parole</property>
<signal name="destroy" handler="parole_player_destroy_cb"/>
<signal name="key_press_event" handler="parole_player_key_press"/>
- <signal name="delete_event" handler="parole_player_delete_event_cb"/>
+ <signal name="delete_event" handler="parole_player_delete_event_cb" after="yes"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
Modified: parole/trunk/data/interfaces/plugins.ui
===================================================================
--- parole/trunk/data/interfaces/plugins.ui 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/data/interfaces/plugins.ui 2009-07-27 14:50:47 UTC (rev 7849)
@@ -14,9 +14,15 @@
</object>
<object class="GtkDialog" id="dialog">
<property name="border_width">5</property>
+ <property name="title" translatable="yes">Parole Plugins Preferences</property>
+ <property name="default_width">300</property>
+ <property name="default_height">220</property>
+ <property name="destroy_with_parent">True</property>
<property name="type_hint">normal</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
<property name="has_separator">False</property>
- <signal name="response" handler="gtk_widget_destroy"/>
+ <signal name="response" handler="parole_plugins_manager_pref_response_cb"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
@@ -25,7 +31,7 @@
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="spacing">5</property>
+ <property name="spacing">10</property>
<child>
<object class="GtkViewport" id="viewport1">
<property name="visible">True</property>
@@ -72,122 +78,160 @@
</packing>
</child>
<child>
- <object class="GtkVSeparator" id="vseparator1">
+ <object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
+ <property name="spacing">10</property>
<child>
- <object class="GtkHBox" id="hbox5">
+ <object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
- <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkLabel" id="label1">
+ <object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
- <property name="label" translatable="yes"><b>Description:</b></property>
- <property name="use_markup">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Description:</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="description">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="description">
+ <object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Author:</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="author">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <property name="spacing">4</property>
<child>
- <object class="GtkLabel" id="label2">
+ <object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
- <property name="label" translatable="yes"><b>Author:</b></property>
- <property name="use_markup">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Copyright:</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="copyright">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="position">0</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="author">
+ <object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Site:</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="site">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="position">1</property>
+ <property name="position">3</property>
</packing>
</child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <property name="spacing">4</property>
<child>
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Copyright:</b></property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
+ <placeholder/>
</child>
- <child>
- <object class="GtkLabel" id="copyright">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
</object>
<packing>
- <property name="position">2</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox2">
+ <object class="GtkHBox" id="hbox6">
<property name="visible">True</property>
- <property name="spacing">4</property>
+ <property name="spacing">10</property>
<child>
- <object class="GtkLabel" id="label4">
+ <object class="GtkButton" id="configure">
+ <property name="label" translatable="yes">gtk-properties</property>
<property name="visible">True</property>
- <property name="label" translatable="yes"><b>Site:</b></property>
- <property name="use_markup">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="parole_plugins_manager_show_configure"/>
</object>
<packing>
- <property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="site">
+ <object class="GtkButton" id="about">
+ <property name="label" translatable="yes">gtk-about</property>
<property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="parole_plugins_manager_show_about"/>
</object>
<packing>
<property name="position">1</property>
@@ -195,12 +239,12 @@
</child>
</object>
<packing>
- <property name="position">3</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
<packing>
- <property name="position">2</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
Modified: parole/trunk/data/pixmaps/parole.png
===================================================================
(Binary files differ)
Modified: parole/trunk/parole/Makefile.am
===================================================================
--- parole/trunk/parole/Makefile.am 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -133,7 +133,8 @@
parole_glib_enum_headers = \
parole-gst.h \
parole-plugin.h \
- parole-pl-parser.h
+ parole-pl-parser.h \
+ parole-stream.h
if MAINTAINER_MODE
@@ -166,6 +167,7 @@
--fhead "#include \"parole-gst.h\"\n\n" \
--fhead "#include \"parole-plugin.h\"\n\n" \
--fhead "#include \"parole-pl-parser.h\"\n\n" \
+ --fhead "#include \"parole-stream.h\"\n\n" \
--fprod "\n/* enumerations from \"@filename@\" */" \
--vhead "GType\n at enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G at Type@Value values[] = {" \
--vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-gst.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -28,7 +28,6 @@
#include <glib.h>
-#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
#include <gst/interfaces/navigation.h>
@@ -61,6 +60,7 @@
GMutex *lock;
GstState state;
GstState target;
+ ParoleMediaState media_state;
ParoleStream *stream;
gulong tick_id;
@@ -566,15 +566,17 @@
parole_gst_query_duration (gst);
parole_gst_query_capabilities (gst);
parole_gst_query_info (gst);
-
+ gst->priv->media_state = PAROLE_MEDIA_STATE_PLAYING;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_PLAYING);
break;
case GST_STATE_PAUSED:
+ gst->priv->media_state = PAROLE_MEDIA_STATE_PAUSED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_PAUSED);
break;
case GST_STATE_READY:
+ gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_STOPPED);
@@ -592,6 +594,7 @@
}
break;
case GST_STATE_NULL:
+ gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_STOPPED);
break;
@@ -662,6 +665,10 @@
g_free (str);
}
+ g_object_set (G_OBJECT (gst->priv->stream),
+ "tag-available", TRUE,
+ NULL);
+
g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream);
}
@@ -676,6 +683,7 @@
{
case GST_MESSAGE_EOS:
TRACE ("End of stream");
+ gst->priv->media_state = PAROLE_MEDIA_STATE_FINISHED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_FINISHED);
break;
@@ -1033,6 +1041,7 @@
gst->priv->state = GST_STATE_VOID_PENDING;
gst->priv->target = GST_STATE_VOID_PENDING;
+ gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED;
gst->priv->lock = g_mutex_new ();
gst->priv->stream = parole_stream_new ();
gst->priv->tick_id = 0;
@@ -1201,3 +1210,18 @@
NULL);
return volume;
}
+
+ParoleMediaState parole_gst_get_state (ParoleGst *gst)
+{
+ return gst->priv->media_state;
+}
+
+GstState parole_gst_get_gst_state (ParoleGst *gst)
+{
+ return gst->priv->state;
+}
+
+GstState parole_gst_get_gst_target_state (ParoleGst *gst)
+{
+ return gst->priv->target;
+}
Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-gst.h 2009-07-27 14:50:47 UTC (rev 7849)
@@ -22,6 +22,7 @@
#define __PAROLE_GST_H
#include <glib-object.h>
+#include <gst/gst.h>
#include <gtk/gtk.h>
#include "parole-stream.h"
@@ -101,6 +102,12 @@
gdouble parole_gst_get_volume (ParoleGst *gst);
+ParoleMediaState parole_gst_get_state (ParoleGst *gst);
+
+GstState parole_gst_get_gst_state (ParoleGst *gst);
+
+GstState parole_gst_get_gst_target_state (ParoleGst *gst);
+
G_END_DECLS
#endif /* __PAROLE_GST_H */
Modified: parole/trunk/parole/parole-module.c
===================================================================
--- parole/trunk/parole/parole-module.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-module.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -116,7 +116,7 @@
{
if ( module->plugin )
{
- g_signal_emit_by_name (G_OBJECT (module->plugin), "free-data", 0);
+ g_signal_emit_by_name (G_OBJECT (module->plugin), "free-data");
g_object_unref (module->plugin);
module->plugin = NULL;
}
Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-player.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -237,6 +237,7 @@
parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, ParolePlayer *player)
{
parole_player_reset (player);
+ gtk_widget_set_sensitive (player->priv->stop, TRUE);
parole_gst_play_uri (PAROLE_GST (player->priv->gst), uri);
}
@@ -244,6 +245,7 @@
parole_player_uri_opened_cb (ParoleMediaList *list, const gchar *uri, ParolePlayer *player)
{
parole_player_reset (player);
+ gtk_widget_set_sensitive (player->priv->stop, TRUE);
parole_gst_play_uri (PAROLE_GST (player->priv->gst), uri);
}
@@ -310,7 +312,7 @@
gboolean seekable;
player->priv->state = PAROLE_MEDIA_STATE_PLAYING;
- pix = xfce_themed_icon_load ("gtk-media-play-ltr", 16);
+ pix = xfce_themed_icon_load (GTK_STOCK_MEDIA_PLAY, 16);
parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, pix);
@@ -386,7 +388,15 @@
parole_statusbar_set_text (player->priv->status, _("Stopped"));
gtk_widget_set_sensitive (player->priv->play_pause, FALSE);
- gtk_widget_set_sensitive (player->priv->stop, FALSE);
+
+ /* Set the stop widget insensitive only if we are not going to got to playing
+ * state, this give the possibility to press on it if the media get stuck
+ * for some reason.
+ */
+ if ( parole_gst_get_gst_target_state (PAROLE_GST (player->priv->gst)) != GST_STATE_PLAYING)
+ {
+ gtk_widget_set_sensitive (player->priv->stop, FALSE);
+ }
parole_player_change_range_value (player, 0);
gtk_widget_set_sensitive (player->priv->range, FALSE);
Modified: parole/trunk/parole/parole-plugin.c
===================================================================
--- parole/trunk/parole/parole-plugin.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-plugin.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -60,6 +60,9 @@
GtkWidget *widget;
gboolean packed;
+ gboolean configurable;
+ gboolean show_about;
+
/* sig id's*/
gulong gst_sig1;
gulong gst_sig2;
@@ -70,7 +73,9 @@
PROP_0,
PROP_TITLE,
PROP_DESC,
- PROP_AUTHOR
+ PROP_AUTHOR,
+ PROP_CONFIGURABLE,
+ PROP_SHOW_ABOUT
};
enum
@@ -78,6 +83,8 @@
STATE_CHANGED,
TAG_MESSAGE,
FREE_DATA,
+ CONFIGURE,
+ ABOUT,
LAST_SIGNAL
};
@@ -162,6 +169,42 @@
G_TYPE_NONE, 0, G_TYPE_NONE);
/**
+ * ParolePlugin::configure:
+ * @plugin: the object which received the signal.
+ *
+ * Emitted when the user click the configure button in the plugins
+ * configuration dialog.
+ *
+ * Since: 0.1
+ **/
+ signals [CONFIGURE] =
+ g_signal_new ("configure",
+ PAROLE_TYPE_PLUGIN,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(ParolePluginClass, configure),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
+
+ /**
+ * ParolePlugin::configure:
+ * @plugin: the object which received the signal.
+ *
+ * Emitted when the user click the configure button in the plugins
+ * configuration dialog.
+ *
+ * Since: 0.1
+ **/
+ signals [ABOUT] =
+ g_signal_new ("about",
+ PAROLE_TYPE_PLUGIN,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(ParolePluginClass, about),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
+
+ /**
* ParolePlugin:title:
*
* Title to display for this plugin.
@@ -205,7 +248,33 @@
NULL,
G_PARAM_READWRITE|
G_PARAM_CONSTRUCT_ONLY));
+
+ /**
+ * ParolePlugin:configurable:
+ *
+ *
+ * Since: 0.1
+ **/
+ g_object_class_install_property (object_class,
+ PROP_CONFIGURABLE,
+ g_param_spec_boolean ("configurable",
+ NULL, NULL,
+ FALSE,
+ G_PARAM_READWRITE));
+ /**
+ * ParolePlugin:show-about:
+ *
+ *
+ * Since: 0.1
+ **/
+ g_object_class_install_property (object_class,
+ PROP_SHOW_ABOUT,
+ g_param_spec_boolean ("show-about",
+ NULL, NULL,
+ FALSE,
+ G_PARAM_READWRITE));
+
g_type_class_add_private (klass, sizeof (ParolePluginPrivate));
}
@@ -219,6 +288,7 @@
priv->title = NULL;
priv->packed = FALSE;
priv->widget = NULL;
+ priv->configurable = FALSE;
priv->gst = PAROLE_GST (parole_gst_new ());
@@ -248,6 +318,12 @@
case PROP_AUTHOR:
PAROLE_PLUGIN_GET_PRIVATE (plugin)->author = g_value_dup_string (value);
break;
+ case PROP_CONFIGURABLE:
+ PAROLE_PLUGIN_GET_PRIVATE (plugin)->configurable = g_value_get_boolean (value);
+ break;
+ case PROP_SHOW_ABOUT:
+ PAROLE_PLUGIN_GET_PRIVATE (plugin)->show_about = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -274,6 +350,12 @@
case PROP_AUTHOR:
g_value_set_string (value, PAROLE_PLUGIN_GET_PRIVATE (plugin)->author);
break;
+ case PROP_CONFIGURABLE:
+ g_value_set_boolean (value, PAROLE_PLUGIN_GET_PRIVATE (plugin)->configurable);
+ break;
+ case PROP_SHOW_ABOUT:
+ g_value_set_boolean (value, PAROLE_PLUGIN_GET_PRIVATE (plugin)->show_about);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -340,9 +422,13 @@
**/
GtkWidget *parole_plugin_get_main_window (ParolePlugin *plugin)
{
+ ParolePluginPrivate *priv;
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), NULL);
- return NULL;
+ priv = PAROLE_PLUGIN_GET_PRIVATE (plugin);
+
+ return gtk_widget_get_toplevel (GTK_WIDGET (priv->gst));
}
/**
@@ -380,6 +466,83 @@
}
/**
+ * parole_plugin_get_state:
+ * @plugin: a #ParolePlugin.
+ *
+ *
+ *
+ * Returns: The current state of the media player.
+ **/
+ParoleState parole_plugin_get_state (ParolePlugin *plugin)
+{
+ ParolePluginPrivate *priv;
+
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), PAROLE_STATE_STOPPED);
+
+ priv = PAROLE_PLUGIN_GET_PRIVATE (plugin);
+
+ return parole_gst_get_state (priv->gst);
+}
+
+/**
+ * parole_plugin_get_is_configurable:
+ * @plugin: a #ParolePlugin.
+ *
+ *
+ *
+ * Returns: Whether the plugin is configurable.
+ **/
+gboolean parole_plugin_get_is_configurable (ParolePlugin *plugin)
+{
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
+
+ return PAROLE_PLUGIN_GET_PRIVATE (plugin)->configurable;
+}
+
+/**
+ * parole_plugin_set_is_configurable:
+ * @plugin: a #ParolePlugin.
+ *
+ *
+ *
+ **/
+void parole_plugin_set_is_configurable (ParolePlugin *plugin, gboolean is_configurable)
+{
+ g_return_if_fail (PAROLE_IS_PLUGIN (plugin));
+
+ PAROLE_PLUGIN_GET_PRIVATE (plugin)->configurable = is_configurable;
+}
+
+/**
+ * parole_plugin_get_show_about:
+ * @plugin: a #ParolePlugin.
+ *
+ *
+ *
+ * Returns:
+ **/
+gboolean parole_plugin_get_show_about (ParolePlugin *plugin)
+{
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
+
+ return PAROLE_PLUGIN_GET_PRIVATE (plugin)->show_about;
+}
+
+/**
+ * parole_plugin_set_show_about:
+ * @plugin: a #ParolePlugin.
+ *
+ *
+ *
+ **/
+void parole_plugin_set_show_about (ParolePlugin *plugin, gboolean show_about)
+{
+ g_return_if_fail (PAROLE_IS_PLUGIN (plugin));
+
+ PAROLE_PLUGIN_GET_PRIVATE (plugin)->show_about = show_about;
+}
+
+/**
* parole_plugin_play_uri:
* @plugin: a #ParolePlugin.
* @uri: uri of the file to play.
@@ -396,45 +559,53 @@
}
/**
- * parole_plugin_pause_playing:
+ * parole_plugin_pause_playback:
* @plugin: a #ParolePlugin.
*
* Causes the media player to pause any playback.
*
* Returns: TRUE on success, FALSE otherwise.
**/
-gboolean parole_plugin_pause_playing (ParolePlugin *plugin)
+gboolean parole_plugin_pause_playback (ParolePlugin *plugin)
{
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
+ parole_gst_pause (PAROLE_PLUGIN_GET_PRIVATE (plugin)->gst);
+
return TRUE;
}
/**
- * parole_plugin_pause_playing:
+ * parole_plugin_pause_playback:
* @plugin: a #ParolePlugin.
*
* Causes the media player to resume playing the currently paused stream.
*
* Returns: TRUE on success, FALSE otherwise.
**/
-gboolean parole_plugin_resume (ParolePlugin *plugin)
+gboolean parole_plugin_resume_playback (ParolePlugin *plugin)
{
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
+ parole_gst_resume (PAROLE_PLUGIN_GET_PRIVATE (plugin)->gst);
return TRUE;
-}
-
+}
+
/**
- * parole_plugin_stop_playing:
+ * parole_plugin_stop_playback:
* @plugin: a #ParolePlugin.
*
* Causes the media player to stop any playback.
*
* Returns: TRUE on success, FALSE otherwise.
**/
-gboolean parole_plugin_stop_playing (ParolePlugin *plugin)
+gboolean parole_plugin_stop_playback (ParolePlugin *plugin)
{
+ g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
+ parole_gst_stop (PAROLE_PLUGIN_GET_PRIVATE (plugin)->gst);
+
return TRUE;
}
Modified: parole/trunk/parole/parole-plugin.h
===================================================================
--- parole/trunk/parole/parole-plugin.h 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-plugin.h 2009-07-27 14:50:47 UTC (rev 7849)
@@ -45,7 +45,7 @@
typedef enum
{
- PAROLE_STATE_STOPPED,
+ PAROLE_STATE_STOPPED = 0,
PAROLE_STATE_PLAYBACK_FINISHED,
PAROLE_STATE_PAUSED,
PAROLE_STATE_PLAYING
@@ -61,39 +61,57 @@
{
GObjectClass parent_class;
- void (*state_changed) (ParolePlugin *plugin,
- const ParoleStream *stream,
- ParoleState state);
+ void (*state_changed) (ParolePlugin *plugin,
+ const ParoleStream *stream,
+ ParoleState state);
- void (*tag_message) (ParolePlugin *plugin,
- const ParoleStream *stream);
+ void (*tag_message) (ParolePlugin *plugin,
+ const ParoleStream *stream);
- void (*free_data) (ParolePlugin *plugin);
+ void (*free_data) (ParolePlugin *plugin);
+
+ void (*configure) (ParolePlugin *plugin,
+ GtkWidget *widget);
+
+ void (*about) (ParolePlugin *plugin,
+ GtkWidget *widget);
};
-GType parole_plugin_get_type (void) G_GNUC_CONST;
+GType parole_plugin_get_type (void) G_GNUC_CONST;
-ParolePlugin *parole_plugin_new (const gchar *title,
- const gchar *desc,
- const gchar *author);
+ParolePlugin *parole_plugin_new (const gchar *title,
+ const gchar *desc,
+ const gchar *author);
-GtkWidget *parole_plugin_get_main_window (ParolePlugin *plugin);
+GtkWidget *parole_plugin_get_main_window (ParolePlugin *plugin);
-void parole_plugin_pack_widget (ParolePlugin *plugin,
- GtkWidget *widget,
- ParolePluginContainer container);
+void parole_plugin_pack_widget (ParolePlugin *plugin,
+ GtkWidget *widget,
+ ParolePluginContainer container);
-gboolean parole_plugin_play_uri (ParolePlugin *plugin,
- const gchar *uri);
+ParoleState parole_plugin_get_state (ParolePlugin *plugin);
-gboolean parole_plugin_pause_playing (ParolePlugin *plugin);
+gboolean parole_plugin_get_is_configurable (ParolePlugin *plugin);
-gboolean parole_plugin_resume (ParolePlugin *plugin);
+void parole_plugin_set_is_configurable (ParolePlugin *plugin,
+ gboolean is_configurable);
+
+gboolean parole_plugin_get_show_about (ParolePlugin *plugin);
+
+void parole_plugin_set_show_about (ParolePlugin *plugin,
+ gboolean show_about);
+
+gboolean parole_plugin_play_uri (ParolePlugin *plugin,
+ const gchar *uri);
+
+gboolean parole_plugin_pause_playback (ParolePlugin *plugin);
+
+gboolean parole_plugin_resume_playback (ParolePlugin *plugin);
-gboolean parole_plugin_stop_playing (ParolePlugin *plugin);
+gboolean parole_plugin_stop_playback (ParolePlugin *plugin);
-gboolean parole_plugin_seek (ParolePlugin *plugin,
- gdouble pos);
+gboolean parole_plugin_seek (ParolePlugin *plugin,
+ gdouble pos);
G_END_DECLS
Modified: parole/trunk/parole/parole-plugins-manager.c
===================================================================
--- parole/trunk/parole/parole-plugins-manager.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-plugins-manager.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -37,13 +37,39 @@
#include "parole-plugins-manager.h"
#include "parole-module.h"
+typedef struct
+{
+ ParolePluginsManager *manager;
+
+ GtkWidget *window;
+ GtkWidget *view;
+ GtkListStore *store;
+ GtkWidget *desc;
+ GtkWidget *author;
+ GtkWidget *copyright;
+ GtkWidget *site;
+ GtkWidget *about;
+ GtkWidget *configure;
+
+} PrefData;
+
+void parole_plugins_manager_pref_response_cb (GtkDialog *dialog,
+ gint reponse_id,
+ PrefData *pref);
+
void parole_plugins_manager_cell_toggled_cb (GtkCellRendererToggle *cell_renderer,
gchar *path,
- ParolePluginsManager *manager);
+ PrefData *pref);
void parole_plugins_manager_tree_cursor_changed_cb (GtkTreeView *view,
- ParolePluginsManager *manager);
+ PrefData *pref);
+void parole_plugins_manager_show_configure (GtkButton *button,
+ PrefData *pref);
+
+void parole_plugins_manager_show_about (GtkButton *button,
+ PrefData *pref);
+
static void parole_plugins_manager_finalize (GObject *object);
#define PAROLE_PLUGINS_MANAGER_GET_PRIVATE(o) \
@@ -66,6 +92,59 @@
COL_DATA
};
+void parole_plugins_manager_pref_response_cb (GtkDialog *dialog,
+ gint reponse_id,
+ PrefData *pref)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ g_free (pref);
+}
+
+static ParoleModule *
+parole_plugins_manager_get_selected_module (PrefData *pref)
+{
+ ParoleModule *module;
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (pref->view));
+
+ if ( !gtk_tree_selection_get_selected (sel, &model, &iter))
+ return NULL;
+
+ gtk_tree_model_get (model,
+ &iter,
+ COL_DATA,
+ &module,
+ -1);
+ return module;
+}
+
+void parole_plugins_manager_show_configure (GtkButton *button, PrefData *pref)
+{
+ ParoleModule *module;
+
+ module = parole_plugins_manager_get_selected_module (pref);
+
+ if ( !module )
+ return;
+
+ g_signal_emit_by_name (G_OBJECT (module->plugin), "configure", pref->window);
+}
+
+void parole_plugins_manager_show_about (GtkButton *button, PrefData *pref)
+{
+ ParoleModule *module;
+
+ module = parole_plugins_manager_get_selected_module (pref);
+
+ if ( !module )
+ return;
+
+ g_signal_emit_by_name (G_OBJECT (module->plugin), "about", pref->window);
+}
+
static void
parole_plugins_manager_save_rc (gchar *filename, gboolean active)
{
@@ -112,20 +191,17 @@
void
parole_plugins_manager_cell_toggled_cb (GtkCellRendererToggle *cell_renderer,
gchar *path_str,
- ParolePluginsManager *manager)
+ PrefData *pref)
{
ParoleModule *module;
- GtkListStore *store;
GtkTreeIter iter;
GtkTreePath *path;
gboolean active;
- store = g_object_get_data (G_OBJECT (manager), "liststore");
-
path = gtk_tree_path_new_from_string (path_str);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
- gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (pref->store), &iter, path);
+ gtk_tree_model_get (GTK_TREE_MODEL (pref->store), &iter,
COL_ACTIVE, &active,
COL_DATA, &module,
-1);
@@ -134,7 +210,7 @@
parole_module_set_active (module, active);
- gtk_list_store_set (GTK_LIST_STORE (store), &iter,
+ gtk_list_store_set (GTK_LIST_STORE (pref->store), &iter,
COL_ACTIVE, active,
-1);
@@ -144,36 +220,29 @@
}
void parole_plugins_manager_tree_cursor_changed_cb (GtkTreeView *view,
- ParolePluginsManager *manager)
+ PrefData *pref)
{
ParoleModule *module;
- GtkWidget *desc;
- GtkWidget *author;
- GtkWidget *copyright;
- GtkWidget *site;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
+ gboolean configurable = FALSE, show_about = FALSE;
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
-
- if ( !gtk_tree_selection_get_selected (sel, &model, &iter))
- return;
-
- gtk_tree_model_get (model,
- &iter,
- COL_DATA,
- &module,
- -1);
-
+ module = parole_plugins_manager_get_selected_module (pref);
- desc = g_object_get_data (G_OBJECT (manager), "desc");
- author = g_object_get_data (G_OBJECT (manager), "author");
- copyright = g_object_get_data (G_OBJECT (manager), "copyright");
- site = g_object_get_data (G_OBJECT (manager), "site");
+ if ( !module )
+ return;
- gtk_label_set_text (GTK_LABEL (desc), module->desc->desc);
- gtk_label_set_text (GTK_LABEL (author), module->desc->author);
+ gtk_label_set_text (GTK_LABEL (pref->desc), module->desc->desc);
+ gtk_label_set_text (GTK_LABEL (pref->author), module->desc->author);
+
+ if ( module->enabled )
+ {
+ g_object_get (G_OBJECT (module->plugin),
+ "configurable", &configurable,
+ "show-about", &show_about,
+ NULL);
+ }
+
+ gtk_widget_set_sensitive (pref->about, show_about);
+ gtk_widget_set_sensitive (pref->configure, configurable);
}
static void
@@ -191,36 +260,31 @@
parole_plugins_manager_show_plugins_pref (GtkWidget *widget, ParolePluginsManager *manager)
{
GtkBuilder *builder;
- GtkWidget *view;
- GtkWidget *window;
- GtkWidget *desc;
- GtkWidget *author;
- GtkWidget *copyright;
- GtkWidget *site;
GtkTreeSelection *sel;
- GtkListStore *store;
GtkTreePath *path;
GtkTreeIter iter;
guint i;
+ PrefData *pref;
builder = parole_builder_new_from_string (plugins_ui, plugins_ui_length);
- window = GTK_WIDGET (gtk_builder_get_object (builder, "dialog"));
- view = GTK_WIDGET (gtk_builder_get_object (builder, "treeview"));
- store = GTK_LIST_STORE (gtk_builder_get_object (builder, "liststore"));
+ pref = g_new0 (PrefData, 1);
- desc = GTK_WIDGET (gtk_builder_get_object (builder, "description"));
- author = GTK_WIDGET (gtk_builder_get_object (builder, "author"));
- copyright = GTK_WIDGET (gtk_builder_get_object (builder, "copyright"));
- site = GTK_WIDGET (gtk_builder_get_object (builder, "site"));
+ pref->window = GTK_WIDGET (gtk_builder_get_object (builder, "dialog"));
+ pref->view = GTK_WIDGET (gtk_builder_get_object (builder, "treeview"));
- g_object_set_data (G_OBJECT (manager), "liststore", store);
- g_object_set_data (G_OBJECT (manager), "desc", desc);
- g_object_set_data (G_OBJECT (manager), "author", author);
- g_object_set_data (G_OBJECT (manager), "copyright", copyright);
- g_object_set_data (G_OBJECT (manager), "site", site);
+ pref->manager = manager;
+ pref->store = GTK_LIST_STORE (gtk_builder_get_object (builder, "liststore"));
- gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (gtk_widget_get_toplevel (manager->priv->main_nt)));
+ pref->desc = GTK_WIDGET (gtk_builder_get_object (builder, "description"));
+ pref->author = GTK_WIDGET (gtk_builder_get_object (builder, "author"));
+ pref->copyright = GTK_WIDGET (gtk_builder_get_object (builder, "copyright"));
+ pref->site = GTK_WIDGET (gtk_builder_get_object (builder, "site"));
+
+ pref->about = GTK_WIDGET (gtk_builder_get_object (builder, "about"));
+ pref->configure = GTK_WIDGET (gtk_builder_get_object (builder, "configure"));
+
+ gtk_window_set_transient_for (GTK_WINDOW (pref->window), GTK_WINDOW (gtk_widget_get_toplevel (manager->priv->main_nt)));
for ( i = 0; i < manager->priv->array->len; i++)
{
@@ -229,8 +293,8 @@
if ( module->desc )
{
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,
+ gtk_list_store_append (pref->store, &iter);
+ gtk_list_store_set (pref->store, &iter,
COL_ACTIVE, module->enabled,
COL_PLUGIN, module->desc->title,
COL_DATA, module,
@@ -238,18 +302,17 @@
}
}
- gtk_builder_connect_signals (builder, manager);
- gtk_widget_show_all (window);
+ gtk_builder_connect_signals (builder, pref);
+ gtk_widget_show_all (pref->window);
g_object_unref (builder);
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+ sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (pref->view));
path = gtk_tree_path_new_from_string ("0");
gtk_tree_selection_select_path (sel, path);
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, NULL, FALSE);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (pref->view), path, NULL, FALSE);
gtk_tree_path_free (path);
-
}
void
Modified: parole/trunk/parole/parole-rc-utils.h
===================================================================
--- parole/trunk/parole/parole-rc-utils.h 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-rc-utils.h 2009-07-27 14:50:47 UTC (rev 7849)
@@ -22,7 +22,7 @@
#define __RC_UTILS_
#define PAROLE_RC_GROUP_GENERAL "General"
-#define PAROLE_RC_GROUP_PLUGINS "General"
+#define PAROLE_RC_GROUP_PLUGINS "Plugins"
void parole_rc_write_entry_bool (const gchar *property,
const gchar *group,
Modified: parole/trunk/parole/parole-stream.c
===================================================================
--- parole/trunk/parole/parole-stream.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-stream.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -30,6 +30,7 @@
#include "parole-stream.h"
#include "parole-file.h"
+#include "enum-gtypes.h"
#define PAROLE_STREAM_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_STREAM, ParoleStreamPrivate))
@@ -53,6 +54,7 @@
gboolean has_video;
gboolean live;
gboolean seekable;
+ gboolean tag_available;
gdouble duration;
gint64 absolute_duration;
@@ -61,6 +63,7 @@
gchar *year;
gchar *album;
gchar *comment;
+ ParoleMediaType media_type;
};
enum
@@ -68,9 +71,11 @@
PROP_0,
PROP_URI,
PROP_LIVE,
+ PROP_MEDIA_TYPE,
PROP_HAS_AUDIO,
PROP_HAS_VIDEO,
PROP_SEEKABLE,
+ PROP_TAG_AVAILABLE,
PROP_DURATION,
PROP_ABSOLUTE_DURATION,
PROP_TITLE,
@@ -82,6 +87,32 @@
G_DEFINE_TYPE (ParoleStream, parole_stream, G_TYPE_OBJECT)
+static void
+parole_stream_get_media_type_from_uri (ParoleStream *stream, const gchar *uri)
+{
+ GValue val = { 0, };
+
+ ParoleMediaType type = PAROLE_MEDIA_TYPE_UNKNOWN;
+
+ if ( g_str_has_prefix (uri, "file:/") )
+ type = PAROLE_MEDIA_TYPE_LOCAL_FILE;
+ else if ( g_str_has_prefix (uri, "dvd:/") )
+ type = PAROLE_MEDIA_TYPE_DVD;
+ else if ( g_str_has_prefix (uri, "vcd:") )
+ type = PAROLE_MEDIA_TYPE_VCD;
+ else if ( g_str_has_prefix (uri, "svcd:/") )
+ type = PAROLE_MEDIA_TYPE_SVCD;
+ else if ( g_str_has_prefix (uri, "cdda:/") )
+ type = PAROLE_MEDIA_TYPE_CDDA;
+ else
+ type = PAROLE_MEDIA_TYPE_UNKNOWN;
+
+ g_value_init (&val, ENUM_GTYPE_MEDIA_TYPE);
+ g_value_set_enum (&val, type);
+ g_object_set_property (G_OBJECT (stream), "media-type", &val);
+ g_value_unset (&val);
+}
+
static void parole_stream_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -93,11 +124,19 @@
switch (prop_id)
{
case PROP_URI:
- PAROLE_STREAM_GET_PRIVATE (stream)->uri = g_value_dup_string (value);
+ {
+ ParoleStreamPrivate *priv;
+ priv = PAROLE_STREAM_GET_PRIVATE (stream);
+ priv->uri = g_value_dup_string (value);
+ parole_stream_get_media_type_from_uri (stream, priv->uri);
break;
+ }
case PROP_LIVE:
PAROLE_STREAM_GET_PRIVATE (stream)->live = g_value_get_boolean (value);
break;
+ case PROP_MEDIA_TYPE:
+ PAROLE_STREAM_GET_PRIVATE (stream)->media_type = g_value_get_enum (value);
+ break;
case PROP_HAS_AUDIO:
PAROLE_STREAM_GET_PRIVATE (stream)->has_audio = g_value_get_boolean (value);
break;
@@ -107,6 +146,9 @@
case PROP_SEEKABLE:
PAROLE_STREAM_GET_PRIVATE (stream)->seekable = g_value_get_boolean (value);
break;
+ case PROP_TAG_AVAILABLE:
+ PAROLE_STREAM_GET_PRIVATE (stream)->tag_available = g_value_get_boolean (value);
+ break;
case PROP_DURATION:
PAROLE_STREAM_GET_PRIVATE (stream)->duration = g_value_get_double (value);
break;
@@ -150,6 +192,9 @@
case PROP_LIVE:
g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->live);
break;
+ case PROP_MEDIA_TYPE:
+ g_value_set_enum (value, PAROLE_STREAM_GET_PRIVATE (stream)->media_type);
+ break;
case PROP_HAS_AUDIO:
g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->has_audio);
break;
@@ -162,6 +207,9 @@
case PROP_DURATION:
g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->duration);
break;
+ case PROP_TAG_AVAILABLE:
+ g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->tag_available);
+ break;
case PROP_ABSOLUTE_DURATION:
g_value_set_int64 (value, PAROLE_STREAM_GET_PRIVATE (stream)->absolute_duration);
break;
@@ -264,6 +312,21 @@
G_PARAM_READWRITE));
/**
+ * ParoleStream:media-type:
+ *
+ *
+ *
+ * Since: 0.1
+ **/
+ g_object_class_install_property (object_class,
+ PROP_MEDIA_TYPE,
+ g_param_spec_enum ("media-type",
+ NULL, NULL,
+ ENUM_GTYPE_MEDIA_TYPE,
+ PAROLE_MEDIA_TYPE_UNKNOWN,
+ G_PARAM_READWRITE));
+
+ /**
* ParoleStream:seekable:
*
* Whether the stream is seekable, for example live
@@ -294,6 +357,20 @@
G_PARAM_READWRITE));
/**
+ * ParoleStream:tag-available:
+ *
+ * Whether tags information are available on the current stream.
+ *
+ * Since: 0.1
+ **/
+ g_object_class_install_property (object_class,
+ PROP_SEEKABLE,
+ g_param_spec_boolean ("tag-available",
+ NULL, NULL,
+ FALSE,
+ G_PARAM_READWRITE));
+
+ /**
* ParoleStream:absolute-duration:
*
*
@@ -408,6 +485,8 @@
priv->has_video = FALSE;
priv->absolute_duration = 0;
priv->duration = 0;
+ priv->tag_available = FALSE;
+ priv->media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
PAROLE_STREAM_FREE_STR_PROP (priv->title);
PAROLE_STREAM_FREE_STR_PROP (priv->uri);
Modified: parole/trunk/parole/parole-stream.h
===================================================================
--- parole/trunk/parole/parole-stream.h 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/parole/parole-stream.h 2009-07-27 14:50:47 UTC (rev 7849)
@@ -29,6 +29,18 @@
#define PAROLE_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_STREAM, ParoleStream))
#define PAROLE_IS_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_STREAM))
+typedef enum
+{
+ PAROLE_MEDIA_TYPE_UNKNOWN,
+ PAROLE_MEDIA_TYPE_LOCAL_FILE,
+ PAROLE_MEDIA_TYPE_CDDA,
+ PAROLE_MEDIA_TYPE_VCD,
+ PAROLE_MEDIA_TYPE_SVCD,
+ PAROLE_MEDIA_TYPE_DVD,
+ PAROLE_MEDIA_TYPE_REMOTE
+
+} ParoleMediaType;
+
typedef struct _ParoleStream ParoleStream;
typedef struct _ParoleStreamClass ParoleStreamClass;
Modified: parole/trunk/plugins/Makefile.am
===================================================================
--- parole/trunk/plugins/Makefile.am 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/plugins/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -3,3 +3,7 @@
if PAROLE_PROPERTIES_PLUGIN
SUBDIRS+=properties
endif
+
+if PAROLE_TRAY_PLUGIN
+SUBDIRS+=tray
+endif
\ No newline at end of file
Modified: parole/trunk/plugins/properties/stream-properties.c
===================================================================
--- parole/trunk/plugins/properties/stream-properties.c 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/plugins/properties/stream-properties.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -18,6 +18,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
Added: parole/trunk/plugins/tray/Makefile.am
===================================================================
--- parole/trunk/plugins/tray/Makefile.am (rev 0)
+++ parole/trunk/plugins/tray/Makefile.am 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,31 @@
+INCLUDES = \
+ -I$(top_builddir) \
+ -I$(top_srcdir) \
+ -DG_LOG_DOMAIN=\"parole_tray\" \
+ -DLIBEXECDIR=\"$(libexecdir)\" \
+ -DPACKAGE_LOCALE_DIR=\"$(localedir)\"
+
+pluginsdir = \
+ $(libdir)/parole-$(PAROLE_VERSION_API)
+
+plugins_LTLIBRARIES = \
+ tray-icon.la
+
+tray_icon_la_SOURCES = \
+ tray-icon.c
+
+tray_icon_la_CFLAGS = \
+ $(PLATFORM_CFLAGS) \
+ $(GTK_CFLAGS) \
+ $(LIBXFCE4GUI_CFLAGS) \
+ $(LIBXFCE4UTIL_CFLAGS) \
+ $(LIBNOTIFY_CFLAGS)
+
+tray_icon_la_LDFLAGS = \
+ -avoid-version \
+ -export-dynamic \
+ -module \
+ $(PLATFORM_LDFLAGS)
+
+tray_icon_la_LIBADD = \
+ $(LIBNOTIFY_LIBS)
\ No newline at end of file
Added: parole/trunk/plugins/tray/tray-icon.c
===================================================================
--- parole/trunk/plugins/tray/tray-icon.c (rev 0)
+++ parole/trunk/plugins/tray/tray-icon.c 2009-07-27 14:50:47 UTC (rev 7849)
@@ -0,0 +1,410 @@
+/*
+ * * Copyright (C) 2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <parole/parole.h>
+
+#ifdef HAVE_LIBNOTIFY
+#include <libnotify/notify.h>
+#endif
+
+#include <libxfcegui4/libxfcegui4.h>
+#include <libxfce4util/libxfce4util.h>
+
+#define RESOURCE_FILE "xfce4/parole/parole-plugins/tray.rc"
+
+typedef struct
+{
+ ParolePlugin *plugin;
+ GtkStatusIcon *tray;
+ GtkWidget *window;
+ gulong sig;
+
+#ifdef HAVE_LIBNOTIFY
+ NotifyNotification *n;
+ gboolean notify;
+ gboolean enabled;
+#endif
+ ParoleState state;
+ GtkWidget *menu;
+
+} PluginData;
+
+static void
+menu_selection_done_cb (PluginData *data)
+{
+ gtk_widget_destroy (data->menu);
+ data->menu = NULL;
+}
+
+static void
+exit_activated_cb (PluginData *data)
+{
+ GdkEventAny ev;
+
+ menu_selection_done_cb (data);
+
+ ev.type = GDK_DELETE;
+ ev.window = data->window->window;
+ ev.send_event = TRUE;
+
+ g_signal_handler_block (data->window, data->sig);
+ gtk_main_do_event ((GdkEvent *) &ev);
+}
+
+static void
+play_pause_activated_cb (PluginData *data)
+{
+ menu_selection_done_cb (data);
+
+ if ( data->state == PAROLE_STATE_PLAYING )
+ parole_plugin_pause_playback (data->plugin);
+ else if ( data->state == PAROLE_STATE_PAUSED )
+ parole_plugin_resume_playback (data->plugin);
+}
+
+static void
+stop_activated_cb (PluginData *data)
+{
+ menu_selection_done_cb (data);
+ parole_plugin_stop_playback (data->plugin);
+}
+
+static void
+popup_menu_cb (GtkStatusIcon *icon, guint button,
+ guint activate_time, PluginData *data)
+{
+ GtkWidget *menu, *mi;
+
+ menu = gtk_menu_new ();
+
+ /*
+ * Play pause.
+ */
+ mi = gtk_image_menu_item_new_from_stock (data->state == PAROLE_STATE_PLAYING ? GTK_STOCK_MEDIA_PAUSE :
+ GTK_STOCK_MEDIA_PLAY, NULL);
+ gtk_widget_set_sensitive (mi, TRUE);
+ gtk_widget_show (mi);
+ g_signal_connect_swapped (mi, "activate", G_CALLBACK (play_pause_activated_cb), data);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+
+ /*
+ * Stop
+ */
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_STOP, NULL);
+ gtk_widget_set_sensitive (mi, data->state >= PAROLE_STATE_PAUSED);
+ gtk_widget_show (mi);
+ g_signal_connect_swapped (mi, "activate", G_CALLBACK (stop_activated_cb), data);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+
+ /*
+ * Separator.
+ */
+ mi = gtk_separator_menu_item_new ();
+ gtk_widget_show (mi);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+
+ /*
+ * Exit
+ */
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
+ gtk_widget_set_sensitive (mi, TRUE);
+ gtk_widget_show (mi);
+ g_signal_connect_swapped (mi, "activate", G_CALLBACK (exit_activated_cb), data);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
+ gtk_status_icon_position_menu,
+ icon, button, activate_time);
+
+ g_signal_connect_swapped (menu, "selection-done",
+ G_CALLBACK (menu_selection_done_cb), data);
+
+ data->menu = menu;
+}
+
+static void
+free_data_cb (ParolePlugin *plugin, PluginData *data)
+{
+ if ( GTK_IS_WIDGET (data->window) && g_signal_handler_is_connected (data->window, data->sig) )
+ g_signal_handler_disconnect (data->window, data->sig);
+
+ g_object_unref (G_OBJECT (data->tray));
+ g_free (data);
+}
+
+static void
+tray_activate_cb (GtkStatusIcon *tray, PluginData *data)
+{
+ if ( GTK_WIDGET_VISIBLE (data->window) )
+ gtk_widget_hide (data->window);
+ else
+ gtk_window_present (GTK_WINDOW (data->window));
+}
+
+#ifdef HAVE_LIBNOTIFY
+static void
+notification_closed_cb (NotifyNotification *n, PluginData *data)
+{
+ data->n = NULL;
+}
+
+static void
+notify_playing (PluginData *data, const ParoleStream *stream)
+{
+ GdkPixbuf *pix;
+ gboolean live, has_audio, has_video;
+ gchar *title;
+ gchar *message;
+ gdouble duration;
+ ParoleMediaType media_type;
+
+ if ( !data->notify || !data->enabled)
+ return;
+
+ g_object_get (G_OBJECT (stream),
+ "title", &title,
+ "has-audio", &has_audio,
+ "has-video", &has_video,
+ "duration", &duration,
+ "live", &live,
+ "media-type", &media_type,
+ NULL);
+
+ if ( live || media_type != PAROLE_MEDIA_TYPE_LOCAL_FILE )
+ {
+ g_free (title);
+ return;
+ }
+
+ message = g_strdup_printf ("%s %s %s %4.2f", _("<b>Playing:</b>"), title, _("<b>Duration:</b>"), duration);
+
+ data->n = notify_notification_new (title, message, NULL, NULL);
+ g_free (title);
+ g_free (message);
+
+ notify_notification_attach_to_status_icon (data->n, data->tray);
+ pix = xfce_themed_icon_load (has_video ? "video" : "audio-x-generic", 48);
+ if ( pix )
+ {
+ notify_notification_set_icon_from_pixbuf (data->n, pix);
+ g_object_unref (pix);
+ }
+ notify_notification_set_urgency (data->n, NOTIFY_URGENCY_LOW);
+ notify_notification_set_timeout (data->n, 5000);
+
+ notify_notification_show (data->n, NULL);
+ g_signal_connect (data->n, "closed",
+ G_CALLBACK (notification_closed_cb), data);
+
+ data->notify = FALSE;
+}
+#endif
+
+static void
+state_changed_cb (ParolePlugin *plugin, const ParoleStream *stream, ParoleState state, PluginData *data)
+{
+#ifdef HAVE_LIBNOTIFY
+ gboolean tag;
+#endif
+
+ data->state = state;
+
+ if ( data->menu )
+ {
+ gtk_widget_destroy (data->menu);
+ data->menu = NULL;
+ g_signal_emit_by_name (G_OBJECT (data->tray), "popup-menu", 0, gtk_get_current_event_time ());
+ }
+
+#ifdef HAVE_LIBNOTIFY
+
+ if ( state == PAROLE_STATE_PLAYING )
+ {
+ g_object_get (G_OBJECT (stream),
+ "tag-available", &tag,
+ NULL);
+
+ if ( tag )
+ notify_playing (data, stream);
+ }
+ else if ( state <= PAROLE_STATE_PAUSED )
+ {
+ if ( data->n )
+ {
+ notify_notification_close (data->n, NULL);
+ data->n = NULL;
+ }
+ if ( state < PAROLE_STATE_PAUSED )
+ data->notify = TRUE;
+ }
+#endif
+}
+
+static void
+tag_message_cb (ParolePlugin *plugin, const ParoleStream *stream, PluginData *data)
+{
+#ifdef HAVE_LIBNOTIFY
+ ParoleState state;
+
+ state = parole_plugin_get_state (plugin);
+
+ if (state == PAROLE_STATE_PLAYING )
+ notify_playing (data, stream);
+
+#endif
+}
+
+#ifdef HAVE_LIBNOTIFY
+static gboolean
+notify_enabled (void)
+{
+ gboolean ret_val = TRUE;
+ gchar *file;
+ XfceRc *rc;
+
+ file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RESOURCE_FILE, TRUE);
+ rc = xfce_rc_simple_open (file, TRUE);
+ g_free (file);
+
+ if ( rc )
+ {
+ ret_val = xfce_rc_read_bool_entry (rc, "NOTIFY", TRUE);
+ xfce_rc_close (rc);
+ }
+
+ return ret_val;
+}
+
+static void
+notify_toggled_cb (GtkToggleButton *bt, PluginData *data)
+{
+ gboolean active;
+ gchar *file;
+ XfceRc *rc;
+
+ file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RESOURCE_FILE, TRUE);
+ rc = xfce_rc_simple_open (file, FALSE);
+ g_free (file);
+
+ active = gtk_toggle_button_get_active (bt);
+
+ data->enabled = active;
+
+ xfce_rc_write_bool_entry (rc, "NOTIFY", active);
+ xfce_rc_close (rc);
+}
+
+static void
+configure_cb (ParolePlugin *plugin, GtkWidget *widget, PluginData *data)
+{
+ GtkWidget *dialog;
+ GtkWidget *content_area;
+ GtkWidget *check;
+
+ dialog = gtk_dialog_new_with_buttons (_("Tray icon plugin"),
+ GTK_WINDOW (widget),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ NULL);
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+ check = gtk_check_button_new_with_label (_("Enable notification"));
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), data->enabled);
+
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (notify_toggled_cb), data);
+
+ gtk_container_add (GTK_CONTAINER (content_area), check);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gtk_widget_destroy), NULL);
+ gtk_widget_show_all (dialog);
+}
+#endif
+
+G_MODULE_EXPORT static void
+construct (ParolePlugin *plugin)
+{
+ PluginData *data;
+ GdkPixbuf *pix;
+
+ data = g_new0 (PluginData, 1);
+ data->n = NULL;
+ data->state = PAROLE_STATE_STOPPED;
+
+ data->window = parole_plugin_get_main_window (plugin);
+
+ data->tray = gtk_status_icon_new ();
+ data->plugin = plugin;
+ data->menu = NULL;
+
+#ifdef HAVE_LIBNOTIFY
+ notify_init ("parole-tray-icon");
+ data->enabled = notify_enabled ();
+ data->notify = TRUE;
+#endif
+
+ pix = xfce_themed_icon_load ("parole", 48);
+
+ if ( pix )
+ {
+ gtk_status_icon_set_from_pixbuf (data->tray, pix);
+ g_object_unref (pix);
+ }
+
+ g_signal_connect (data->tray, "popup-menu",
+ G_CALLBACK (popup_menu_cb), data);
+
+ g_signal_connect (data->tray, "activate",
+ G_CALLBACK (tray_activate_cb), data);
+
+ data->sig = g_signal_connect (data->window, "delete-event",
+ G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+
+ g_signal_connect (plugin, "free-data",
+ G_CALLBACK (free_data_cb), data);
+
+ g_signal_connect (plugin, "state_changed",
+ G_CALLBACK (state_changed_cb), data);
+
+ g_signal_connect (plugin, "tag-message",
+ G_CALLBACK (tag_message_cb), data);
+
+#ifdef HAVE_LIBNOTIFY
+ parole_plugin_set_is_configurable (plugin, TRUE);
+ g_signal_connect (plugin, "configure",
+ G_CALLBACK (configure_cb), data);
+#endif
+}
+
+PAROLE_PLUGIN_CONSTRUCT (construct, /* Construct function */
+ _("Tray icon"), /* Title */
+ _("Show icon in the system tray"), /* Description */
+ "Ali Abdallah"); /* Author */
Modified: parole/trunk/po/POTFILES.in
===================================================================
--- parole/trunk/po/POTFILES.in 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/po/POTFILES.in 2009-07-27 14:50:47 UTC (rev 7849)
@@ -17,3 +17,4 @@
parole/parole-about.c
parole/parole-disc.c
plugins/properties/stream-properties.c
+plugins/tray/tray-icon.c
Modified: parole/trunk/po/parole-media-player.pot
===================================================================
--- parole/trunk/po/parole-media-player.pot 2009-07-27 06:50:10 UTC (rev 7848)
+++ parole/trunk/po/parole-media-player.pot 2009-07-27 14:50:47 UTC (rev 7849)
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-26 01:16+0200\n"
+"POT-Creation-Date: 2009-07-27 16:47+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -65,9 +65,21 @@
msgstr ""
#: ../data/interfaces/plugins.ui.h:5
+msgid "Parole Plugins Preferences"
+msgstr ""
+
+#: ../data/interfaces/plugins.ui.h:6
+msgid "gtk-about"
+msgstr ""
+
+#: ../data/interfaces/plugins.ui.h:7
msgid "gtk-close"
msgstr ""
+#: ../data/interfaces/plugins.ui.h:8
+msgid "gtk-properties"
+msgstr ""
+
#: ../data/interfaces/parole-settings.ui.h:1
msgid "<b>Audio</b>"
msgstr ""
@@ -131,16 +143,16 @@
msgid "Type '%s --help' for usage."
msgstr ""
-#: ../parole/parole-gst.c:788
+#: ../parole/parole-gst.c:796
msgid "Error in changing state to ready"
msgstr ""
-#: ../parole/parole-gst.c:837
+#: ../parole/parole-gst.c:845
msgid ""
"Unable to load playbin GStreamer plugin, check your GStreamer installation"
msgstr ""
-#: ../parole/parole-gst.c:852
+#: ../parole/parole-gst.c:860
msgid ""
"Unable to load video GStreamer plugin, check your GStreamer installation"
msgstr ""
@@ -173,7 +185,7 @@
msgid "Unknown playlist format, Please select a support playlist format"
msgstr ""
-#: ../parole/parole-medialist.c:455 ../parole/parole-player.c:953
+#: ../parole/parole-medialist.c:455 ../parole/parole-player.c:963
msgid "Playlist"
msgstr ""
@@ -205,20 +217,20 @@
msgid "Show playlist"
msgstr ""
-#: ../parole/parole-player.c:336 ../parole/parole-statusbar.c:125
+#: ../parole/parole-player.c:338 ../parole/parole-statusbar.c:125
#: ../parole/parole-statusbar.c:127
msgid "Playing"
msgstr ""
-#: ../parole/parole-player.c:337
+#: ../parole/parole-player.c:339
msgid "Media stream is not seekable"
msgstr ""
-#: ../parole/parole-player.c:355 ../parole/parole-player.c:368
+#: ../parole/parole-player.c:357 ../parole/parole-player.c:370
msgid "Paused"
msgstr ""
-#: ../parole/parole-player.c:386
+#: ../parole/parole-player.c:388
msgid "Stopped"
msgstr ""
@@ -254,40 +266,66 @@
msgid "Play Disc"
msgstr ""
-#: ../plugins/properties/stream-properties.c:40
-#: ../plugins/properties/stream-properties.c:41
-#: ../plugins/properties/stream-properties.c:42
-#: ../plugins/properties/stream-properties.c:43
#: ../plugins/properties/stream-properties.c:44
+#: ../plugins/properties/stream-properties.c:45
+#: ../plugins/properties/stream-properties.c:46
+#: ../plugins/properties/stream-properties.c:47
+#: ../plugins/properties/stream-properties.c:48
msgid "Unknown"
msgstr ""
-#: ../plugins/properties/stream-properties.c:66
+#: ../plugins/properties/stream-properties.c:70
msgid "Title:"
msgstr ""
-#: ../plugins/properties/stream-properties.c:89
+#: ../plugins/properties/stream-properties.c:93
msgid "Artist:"
msgstr ""
-#: ../plugins/properties/stream-properties.c:112
+#: ../plugins/properties/stream-properties.c:116
msgid "Album:"
msgstr ""
-#: ../plugins/properties/stream-properties.c:135
+#: ../plugins/properties/stream-properties.c:139
msgid "Year:"
msgstr ""
-#: ../plugins/properties/stream-properties.c:158
+#: ../plugins/properties/stream-properties.c:162
msgid "Comment:"
msgstr ""
#. Construct function
-#: ../plugins/properties/stream-properties.c:284
+#: ../plugins/properties/stream-properties.c:288
msgid "Properties"
msgstr ""
#. Title
-#: ../plugins/properties/stream-properties.c:285
+#: ../plugins/properties/stream-properties.c:289
msgid "Read media properties"
msgstr ""
+
+#: ../plugins/tray/tray-icon.c:203
+msgid "<b>Playing:</b>"
+msgstr ""
+
+#: ../plugins/tray/tray-icon.c:203
+msgid "<b>Duration:</b>"
+msgstr ""
+
+#: ../plugins/tray/tray-icon.c:328
+msgid "Tray icon plugin"
+msgstr ""
+
+#: ../plugins/tray/tray-icon.c:337
+msgid "Enable notification"
+msgstr ""
+
+#. Construct function
+#: ../plugins/tray/tray-icon.c:408
+msgid "Tray icon"
+msgstr ""
+
+#. Title
+#: ../plugins/tray/tray-icon.c:409
+msgid "Show icon in the system tray"
+msgstr ""
More information about the Goodies-commits
mailing list