diff options
Diffstat (limited to 'modemlights')
-rw-r--r-- | modemlights/AUTHORS | 4 | ||||
-rw-r--r-- | modemlights/Makefile.am | 103 | ||||
-rw-r--r-- | modemlights/mate-modem-monitor-applet.16.png | bin | 0 -> 719 bytes | |||
-rw-r--r-- | modemlights/mate-modem-monitor-applet.22.png | bin | 0 -> 1168 bytes | |||
-rw-r--r-- | modemlights/mate-modem-monitor-applet.24.png | bin | 0 -> 1221 bytes | |||
-rw-r--r-- | modemlights/mate-modem-monitor-applet.32.png | bin | 0 -> 2148 bytes | |||
-rw-r--r-- | modemlights/mate-modem-monitor-applet.svg | 1377 | ||||
-rw-r--r-- | modemlights/modem-applet-menu.xml | 7 | ||||
-rw-r--r-- | modemlights/modem-applet.c | 1080 | ||||
-rw-r--r-- | modemlights/modem-applet.h | 52 | ||||
-rw-r--r-- | modemlights/modemlights.ui | 220 | ||||
-rw-r--r-- | modemlights/org.mate.applets.ModemApplet.mate-panel-applet.in.in | 16 | ||||
-rw-r--r-- | modemlights/org.mate.panel.applet.ModemAppletFactory.service.in | 3 |
13 files changed, 2862 insertions, 0 deletions
diff --git a/modemlights/AUTHORS b/modemlights/AUTHORS new file mode 100644 index 00000000..274105a8 --- /dev/null +++ b/modemlights/AUTHORS @@ -0,0 +1,4 @@ +Carlos Garnacho <[email protected]> + +The Old Applet: + John Ellis <[email protected]> diff --git a/modemlights/Makefile.am b/modemlights/Makefile.am new file mode 100644 index 00000000..cc69c7e5 --- /dev/null +++ b/modemlights/Makefile.am @@ -0,0 +1,103 @@ +#SUBDIRS = docs + +INCLUDES = -I. -I$(srcdir) \ + -DMODEM_MENU_UI_DIR=\""$(uidir)"\" \ + $(MATE_APPLETS3_CFLAGS) + +libexec_PROGRAMS = modem_applet + +modem_applet_SOURCES = \ + modem-applet.c \ + modem-applet.h + +modem_applet_LDADD = \ + $(MATE_APPLETS3_LIBS) \ + $(MODEMLIGHTS_LIBS) + +uidir = $(datadir)/mate-2.0/ui +ui_DATA = modem-applet-menu.xml + + +appletdir = $(datadir)/mate-panel/applets +applet_in_files = org.mate.applets.ModemApplet.mate-panel-applet.in +applet_DATA = $(applet_in_files:.mate-panel-applet.in=.mate-panel-applet) + +$(applet_in_files): $(applet_in_files).in Makefile + $(AM_V_GEN)sed \ + -e "s|\@LIBEXECDIR\@|$(libexecdir)|" \ + -e "s|\@VERSION\@|$(PACKAGE_VERSION)|" \ + $< > $@ + +%.mate-panel-applet: %.mate-panel-applet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache + +servicedir = $(datadir)/dbus-1/services +service_in_files = org.mate.panel.applet.ModemAppletFactory.service.in +service_DATA = $(service_in_files:.service.in=.service) + +org.mate.panel.applet.ModemAppletFactory.service: $(service_in_files) + $(AM_V_GEN)sed \ + -e "s|\@LIBEXECDIR\@|$(libexecdir)|" \ + $< > $@ + +CLEANFILES = $(applet_DATA) $(applet_DATA).in $(service_DATA) + +builder_DATA = modemlights.ui + +icons = \ + mate-modem-monitor-applet.svg \ + mate-modem-monitor-applet.16.png \ + mate-modem-monitor-applet.32.png \ + mate-modem-monitor-applet.22.png \ + mate-modem-monitor-applet.24.png + +EXTRA_DIST = \ + org.mate.applets.ModemApplet.mate-panel-applet.in.in \ + $(service_in_files) \ + $(icons) \ + $(builder_DATA) \ + $(ui_DATA) + +gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor + +uninstall-local: + for icon in $(icons); do \ + SIZE=`echo $$icon | cut -d. -f2`; \ + FILE=`echo $$icon | cut -d. -f1,3`; \ + if [ "$$SIZE" = "svg" ]; then \ + SIZE="scalable"; \ + FILE="$$FILE.svg"; \ + else \ + SIZE="$${SIZE}x$${SIZE}"; \ + fi; \ + rm -f $(DESTDIR)$(iconsdir)/hicolor/$$SIZE/apps/$$FILE; \ + done + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi + +install-data-local: + for icon in $(icons); do \ + SIZE=`echo $$icon | cut -d. -f2`; \ + FILE=`echo $$icon | cut -d. -f1,3`; \ + if [ "$$SIZE" = "svg" ]; then \ + SIZE="scalable"; \ + FILE="$$FILE.svg"; \ + else \ + SIZE="$${SIZE}x$${SIZE}"; \ + fi; \ + mkdir -p $(DESTDIR)$(iconsdir)/hicolor/$$SIZE/apps/; \ + $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(iconsdir)/hicolor/$$SIZE/apps/$$FILE; \ + done + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi + +-include $(top_srcdir)/git.mk diff --git a/modemlights/mate-modem-monitor-applet.16.png b/modemlights/mate-modem-monitor-applet.16.png Binary files differnew file mode 100644 index 00000000..17bd8f36 --- /dev/null +++ b/modemlights/mate-modem-monitor-applet.16.png diff --git a/modemlights/mate-modem-monitor-applet.22.png b/modemlights/mate-modem-monitor-applet.22.png Binary files differnew file mode 100644 index 00000000..455bbeb0 --- /dev/null +++ b/modemlights/mate-modem-monitor-applet.22.png diff --git a/modemlights/mate-modem-monitor-applet.24.png b/modemlights/mate-modem-monitor-applet.24.png Binary files differnew file mode 100644 index 00000000..a1d39a3a --- /dev/null +++ b/modemlights/mate-modem-monitor-applet.24.png diff --git a/modemlights/mate-modem-monitor-applet.32.png b/modemlights/mate-modem-monitor-applet.32.png Binary files differnew file mode 100644 index 00000000..11714f6c --- /dev/null +++ b/modemlights/mate-modem-monitor-applet.32.png diff --git a/modemlights/mate-modem-monitor-applet.svg b/modemlights/mate-modem-monitor-applet.svg new file mode 100644 index 00000000..f5945111 --- /dev/null +++ b/modemlights/mate-modem-monitor-applet.svg @@ -0,0 +1,1377 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48px" + height="48px" + id="svg1307" + sodipodi:version="0.32" + inkscape:version="0.44" + sodipodi:docbase="/home/lapo/Icone/mate-applets/scalable" + sodipodi:docname="mate-modem-monitor-applet.svg" + inkscape:export-filename="/home/ulisse/icone/modem_phone/modem.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs1309"> + <linearGradient + inkscape:collect="always" + id="linearGradient2954"> + <stop + style="stop-color:#3465a4;stop-opacity:1;" + offset="0" + id="stop2956" /> + <stop + style="stop-color:#3465a4;stop-opacity:0;" + offset="1" + id="stop2958" /> + </linearGradient> + <linearGradient + id="linearGradient2158"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop2160" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop2162" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5302"> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="0" + id="stop5304" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:0" + offset="1" + id="stop5306" /> + </linearGradient> + <linearGradient + id="linearGradient5209" + inkscape:collect="always"> + <stop + id="stop5211" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop5213" + offset="1" + style="stop-color:#eeeeec;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient5203" + inkscape:collect="always"> + <stop + id="stop5205" + offset="0" + style="stop-color:white;stop-opacity:1" /> + <stop + id="stop5207" + offset="1" + style="stop-color:#eeeeec;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5187"> + <stop + style="stop-color:white;stop-opacity:1" + offset="0" + id="stop5189" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop5191" /> + </linearGradient> + <linearGradient + id="linearGradient5111"> + <stop + id="stop5113" + offset="0" + style="stop-color:#f57900;stop-opacity:1" /> + <stop + id="stop5115" + offset="1" + style="stop-color:#fcaf3e;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5105"> + <stop + id="stop5107" + offset="0" + style="stop-color:#edd400;stop-opacity:1" /> + <stop + id="stop5109" + offset="1" + style="stop-color:#fce94f;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient5085"> + <stop + style="stop-color:#73d216;stop-opacity:1;" + offset="0" + id="stop5087" /> + <stop + style="stop-color:#8ae234;stop-opacity:1" + offset="1" + id="stop5089" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4969"> + <stop + style="stop-color:#d3d7cf;stop-opacity:1;" + offset="0" + id="stop4971" /> + <stop + style="stop-color:#d3d7cf;stop-opacity:0" + offset="1" + id="stop4973" /> + </linearGradient> + <linearGradient + id="linearGradient4961"> + <stop + style="stop-color:#555753;stop-opacity:1" + offset="0" + id="stop4963" /> + <stop + style="stop-color:#babdb6;stop-opacity:1" + offset="1" + id="stop4965" /> + </linearGradient> + <linearGradient + id="linearGradient4055"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop4057" /> + <stop + id="stop4063" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop4059" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4033"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop4035" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop4037" /> + </linearGradient> + <linearGradient + id="linearGradient6256"> + <stop + id="stop6258" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop6260" + offset="1" + style="stop-color:#cccec9;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4070"> + <stop + id="stop4072" + offset="0" + style="stop-color:white;stop-opacity:0.42857143;" /> + <stop + id="stop4074" + offset="1" + style="stop-color:white;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:white;stop-opacity:0.29761904;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4044"> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="0" + id="stop4046" /> + <stop + style="stop-color:#204a87;stop-opacity:1" + offset="1" + id="stop4048" /> + </linearGradient> + <linearGradient + id="linearGradient4038"> + <stop + id="stop4040" + offset="0" + style="stop-color:#729fcf;stop-opacity:1" /> + <stop + id="stop4042" + offset="1" + style="stop-color:#3465a4;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient2513" + inkscape:collect="always"> + <stop + id="stop2515" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop2517" + offset="1" + style="stop-color:#ffffff;stop-opacity:0.21789883" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4070" + id="linearGradient1598" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.921903,0,0,0.877945,1.869671,-1.024713)" + x1="24.834204" + y1="24.81731" + x2="24.010672" + y2="8.361702" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2513" + id="linearGradient1601" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.000314,0,0,1,48.01271,-4.000006)" + x1="24.160858" + y1="24.504593" + x2="25.189993" + y2="17.53454" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4038" + id="linearGradient1614" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.000314,0,0,1,7.051909e-3,-4.000006)" + x1="24.414724" + y1="25.463402" + x2="24.414724" + y2="29.477005" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4044" + id="linearGradient1616" + gradientUnits="userSpaceOnUse" + x1="28.260429" + y1="8.7648172" + x2="28.260429" + y2="20.639368" + gradientTransform="matrix(1.000314,0,0,1,-3.614289e-3,0.972209)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4044" + id="linearGradient3404" + x1="23.994669" + y1="13.842071" + x2="23.994669" + y2="18.257809" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4038" + id="radialGradient4024" + cx="17.04607" + cy="6.5931005" + fx="17.04607" + fy="6.5931005" + r="16.994591" + gradientTransform="matrix(2.04444,-0.123888,1.467675e-2,0.242354,-19.8863,13.61936)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4062" + id="radialGradient4068" + cx="16.030262" + cy="3.5110793" + fx="16.030262" + fy="3.5110793" + r="16.031172" + gradientTransform="matrix(2.720795,-3.898649e-2,1.764611e-3,0.123227,-33.03868,12.78605)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient6264" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.331458,-1.031509e-7,0,-1.136461,70.54047,24.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2968" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.331458,-1.031509e-7,0,-1.136461,74.54047,24.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2972" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.331458,-1.031509e-7,0,-1.136461,78.54047,24.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2979" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.543409,-1.031509e-7,0,-1.136461,83.49869,27.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2983" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.543409,-1.031509e-7,0,-1.136461,79.13505,27.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2987" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.543409,-1.031509e-7,0,-1.136461,74.77142,27.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2994" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.755359,-1.031509e-7,0,-1.136461,88.45691,30.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient2998" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.755359,-1.031509e-7,0,-1.136461,83.72964,30.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient3002" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.755359,-1.031509e-7,0,-1.136461,79.00237,30.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient3009" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.96731,-1.031509e-7,0,-1.136461,93.41513,33.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient3013" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.96731,-1.031509e-7,0,-1.136461,88.32422,33.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6256" + id="radialGradient3017" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.96731,-1.031509e-7,0,-1.136461,83.23332,33.67016)" + cx="21.530191" + cy="11.602475" + fx="21.530191" + fy="11.602475" + r="1.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4033" + id="radialGradient4070" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-9.458067e-7,-2.000005,2.003046,-1.684215e-6,-38.5731,51.01229)" + cx="13.006094" + cy="26" + fx="13.006094" + fy="26" + r="2" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4033" + id="radialGradient4072" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-9.458067e-7,-2.000005,2.003046,-1.684215e-6,-86.5731,1.012286)" + cx="13.006094" + cy="26" + fx="13.006094" + fy="26" + r="2" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4055" + id="linearGradient4074" + gradientUnits="userSpaceOnUse" + x1="17.5625" + y1="20.996099" + x2="17.5625" + y2="29.010038" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4961" + id="linearGradient4967" + x1="23.994967" + y1="20.3125" + x2="23.994967" + y2="3.1169004" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4969" + id="linearGradient4975" + x1="19" + y1="33" + x2="20.875" + y2="42" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.944444,0,0,0.999999,1.333333,0)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5085" + id="linearGradient5091" + x1="10" + y1="34.9375" + x2="10" + y2="36.65625" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.666662,1,12.16683)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5105" + id="linearGradient5095" + gradientUnits="userSpaceOnUse" + x1="10" + y1="34.9375" + x2="10" + y2="36.65625" + gradientTransform="matrix(1,0,0,0.666666,7,12.1667)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5111" + id="linearGradient5101" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.666666,13,12.1667)" + x1="10" + y1="34.9375" + x2="10" + y2="36.65625" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5203" + id="linearGradient5193" + x1="12.5" + y1="36.75" + x2="10.5" + y2="33.375" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,1)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5209" + id="linearGradient5197" + gradientUnits="userSpaceOnUse" + x1="12.5" + y1="36.75" + x2="10.5" + y2="33.375" + gradientTransform="translate(6,1)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5187" + id="linearGradient5201" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(12,1)" + x1="12.5" + y1="36.75" + x2="10.5" + y2="33.375" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient5308" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4033" + id="radialGradient5318" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-9.458067e-7,-2.000005,2.003046,-1.684215e-6,-38.5731,51.01229)" + cx="13.006094" + cy="26" + fx="13.006094" + fy="26" + r="2" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4033" + id="radialGradient5320" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-9.458067e-7,-2.000005,2.003046,-1.684215e-6,-98.5731,1.012286)" + cx="13.006094" + cy="26" + fx="13.006094" + fy="26" + r="2" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4055" + id="linearGradient5322" + gradientUnits="userSpaceOnUse" + x1="17.5625" + y1="20.996099" + x2="17.5625" + y2="29.010038" + gradientTransform="matrix(1.571428,0,0,1,-7.714286,0)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2158" + id="linearGradient2164" + x1="5.25" + y1="35.75" + x2="5.25" + y2="21.997721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2055" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2057" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2059" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2061" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2063" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2065" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2067" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2069" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2071" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2073" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2075" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5302" + id="linearGradient2077" + gradientUnits="userSpaceOnUse" + x1="33.5" + y1="34" + x2="33.5625" + y2="39.3125" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2954" + id="linearGradient2960" + x1="21.8125" + y1="13.249833" + x2="21.8125" + y2="40.441154" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#a8a8a8" + borderopacity="1" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="8" + inkscape:cx="22.089613" + inkscape:cy="14.788443" + inkscape:current-layer="layer2" + showgrid="false" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:grid-points="true" + gridspacingx="0.5px" + gridspacingy="0.5px" + gridempspacing="2" + inkscape:window-width="1051" + inkscape:window-height="622" + inkscape:window-x="78" + inkscape:window-y="75" + fill="#e9b96e" + showguides="false" + inkscape:guide-bbox="true" + inkscape:showpageshadow="false" + inkscape:object-paths="false" + inkscape:object-points="false" + showborder="false"> + <sodipodi:guide + orientation="vertical" + position="11.010663" + id="guide2239" /> + <sodipodi:guide + orientation="vertical" + position="3.9395949" + id="guide2241" /> + <sodipodi:guide + orientation="vertical" + position="37.072598" + id="guide2243" /> + <sodipodi:guide + orientation="vertical" + position="43.941636" + id="guide2245" /> + <sodipodi:guide + orientation="horizontal" + position="39.0625" + id="guide2983" /> + </sodipodi:namedview> + <metadata + id="metadata1312"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:creator> + <cc:Agent> + <dc:title>Ulisse Perusin</dc:title> + </cc:Agent> + </dc:creator> + <dc:title>Modem</dc:title> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + <dc:subject> + <rdf:Bag> + <rdf:li>modem</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:contributor> + <cc:Agent> + <dc:title>Lapo Calamandrei</dc:title> + </cc:Agent> + </dc:contributor> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <g + id="g5310" + transform="matrix(1,0,0,1.6875,-6,-5.5625)" + style="opacity:0.4"> + <rect + y="21" + x="9.5" + height="8" + width="4" + id="rect5312" + style="opacity:1;fill:url(#radialGradient5318);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" /> + <rect + transform="scale(-1,-1)" + y="-29" + x="-50.5" + height="8" + width="4" + id="rect5314" + style="opacity:1;fill:url(#radialGradient5320);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" /> + <rect + y="21" + x="13.5" + height="8" + width="33" + id="rect5316" + style="opacity:1;fill:url(#linearGradient5322);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" /> + </g> + <path + sodipodi:nodetypes="cssssccssccccccsssccsssccc" + style="color:black;fill:#eeeeec;fill-opacity:1.0;fill-rule:evenodd;stroke:url(#linearGradient2164);stroke-width:0.99999994;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" + d="M 10.0625,22.504459 C 10.047161,22.507473 10.013575,22.531643 10,22.535709 C 9.995651,22.537187 9.972934,22.534108 9.96875,22.535709 C 9.964867,22.537567 9.941248,22.56497 9.9375,22.566959 C 9.933992,22.569222 9.909653,22.564557 9.90625,22.566959 C 9.767276,22.673796 9.700627,22.926191 9.34375,23.379459 L 7,30.191959 C 7.000193,30.199448 6.999616,30.21577 7,30.223209 C 6.989249,30.23533 7.010461,30.273328 7,30.285709 C 6.701861,30.638559 6.5,31.066738 6.5,31.566959 L 6.53125,38.5 C 6.53125,39.623303 7.439198,40.531251 8.5625,40.53125 L 39.5,40.53125 C 40.623303,40.53125 41.53125,39.623303 41.53125,38.5 L 41.5,31.566959 C 41.5,31.066738 41.298139,30.638559 41,30.285709 C 41.00076,30.278374 40.999427,30.261848 41,30.254459 C 40.994697,30.248333 41.005375,30.22927 41,30.223209 C 41.000384,30.21577 40.999807,30.199448 41,30.191959 L 38.5,23.379459 C 38.121224,22.911098 38.05898,22.668643 37.90625,22.566959 C 37.902538,22.564922 37.878847,22.537615 37.875,22.535709 C 37.871006,22.533933 37.8479,22.537356 37.84375,22.535709 C 37.785333,22.517546 37.694269,22.504459 37.59375,22.504459 L 10.25,22.504459 C 10.172677,22.504459 10.11363,22.494411 10.0625,22.504459 z " + id="path2495" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <rect + style="opacity:1;fill:url(#linearGradient4975);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect4028" + width="34" + height="9" + x="7" + y="31" + rx="1.5195075" + ry="1.6088903" /> + <rect + style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5193);stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="rect5179" + width="5.000011" + height="4.9999833" + x="8.4999924" + y="33.500023" + rx="2.49999" + ry="2.4999917" /> + <rect + style="opacity:1;fill:url(#linearGradient5091);fill-opacity:1;stroke:#4e9a06;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="rect5059" + width="3" + height="2.9999814" + x="9.5" + y="34.500027" + rx="1.4999907" + ry="1.4999907" /> + <rect + style="opacity:1;fill:url(#linearGradient5095);fill-opacity:1;stroke:#c4a000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="rect5093" + width="3" + height="2.9999974" + x="15.5" + y="34.500015" + rx="1.4999987" + ry="1.4999987" /> + <rect + style="opacity:1;fill:url(#linearGradient5101);fill-opacity:1;stroke:#ce5c00;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="rect5099" + width="3" + height="2.9999974" + x="21.5" + y="34.500015" + rx="1.4999987" + ry="1.4999987" /> + <path + sodipodi:type="arc" + style="opacity:0.75675677;fill:#f57900;fill-opacity:1;stroke:white;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="path5117" + sodipodi:cx="9.75" + sodipodi:cy="35.25" + sodipodi:rx="0.25" + sodipodi:ry="0.25" + d="M 10 35.25 A 0.25 0.25 0 1 1 9.5,35.25 A 0.25 0.25 0 1 1 10 35.25 z" + transform="translate(0.75,0.25)" /> + <path + sodipodi:type="arc" + style="opacity:0.85675677;fill:#f57900;fill-opacity:1;stroke:white;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="path5119" + sodipodi:cx="9.75" + sodipodi:cy="35.25" + sodipodi:rx="0.25" + sodipodi:ry="0.25" + d="M 10 35.25 A 0.25 0.25 0 1 1 9.5,35.25 A 0.25 0.25 0 1 1 10 35.25 z" + transform="translate(6.75,0.25)" /> + <path + sodipodi:type="arc" + style="opacity:0.75675677;fill:#f57900;fill-opacity:1;stroke:white;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="path5121" + sodipodi:cx="9.75" + sodipodi:cy="35.25" + sodipodi:rx="0.25" + sodipodi:ry="0.25" + d="M 10 35.25 A 0.25 0.25 0 1 1 9.5,35.25 A 0.25 0.25 0 1 1 10 35.25 z" + transform="translate(12.75,0.25)" /> + <rect + style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5197);stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="rect5195" + width="5.000011" + height="4.9999833" + x="14.499992" + y="33.500023" + rx="2.49999" + ry="2.4999917" /> + <rect + style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5201);stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" + id="rect5199" + width="5.000011" + height="4.9999833" + x="20.499992" + y="33.500023" + rx="2.49999" + ry="2.4999917" /> + <g + id="g5288" + style="fill:url(#linearGradient5308);fill-opacity:1" + transform="translate(-1,0)"> + <g + transform="translate(-2,0)" + id="g4999" + style="fill:url(#linearGradient2055);fill-opacity:1"> + <rect + style="opacity:1;fill:url(#linearGradient2057);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect4979" + width="1" + height="4.5" + x="33" + y="34" + rx="0.5" + ry="0.5" /> + </g> + <g + id="g5007" + style="fill:url(#linearGradient2059);fill-opacity:1"> + <rect + style="opacity:1;fill:url(#linearGradient2061);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect5011" + width="1" + height="4.5" + x="33" + y="34" + rx="0.5" + ry="0.5" /> + </g> + <g + transform="translate(2,0)" + id="g5017" + style="fill:url(#linearGradient2063);fill-opacity:1"> + <rect + style="opacity:1;fill:url(#linearGradient2065);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect5021" + width="1" + height="4.5" + x="33" + y="34" + rx="0.5" + ry="0.5" /> + </g> + <g + transform="translate(4,0)" + id="g5027" + style="fill:url(#linearGradient2067);fill-opacity:1"> + <rect + style="opacity:1;fill:url(#linearGradient2069);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect5031" + width="1" + height="4.5" + x="33" + y="34" + rx="0.5" + ry="0.5" /> + </g> + <g + transform="translate(6,0)" + id="g5037" + style="fill:url(#linearGradient2071);fill-opacity:1"> + <rect + style="opacity:1;fill:url(#linearGradient2073);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect5041" + width="1" + height="4.5" + x="33" + y="34" + rx="0.5" + ry="0.5" /> + </g> + <g + transform="translate(-4,0)" + id="g5230" + style="fill:url(#linearGradient2075);fill-opacity:1"> + <rect + style="opacity:1;fill:url(#linearGradient2077);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" + id="rect5234" + width="1" + height="4.5" + x="33" + y="34" + rx="0.5" + ry="0.5" /> + </g> + </g> + <path + sodipodi:type="inkscape:offset" + inkscape:radius="-0.9722718" + inkscape:original="M 10.0625 22.5 C 10.047161 22.503014 10.013575 22.527184 10 22.53125 C 9.995651 22.532728 9.972934 22.529649 9.96875 22.53125 C 9.964867 22.533108 9.941248 22.560511 9.9375 22.5625 C 9.933992 22.564763 9.909653 22.560098 9.90625 22.5625 C 9.767276 22.669337 9.700627 22.921732 9.34375 23.375 L 7 30.1875 C 7.000193 30.194989 6.999616 30.211311 7 30.21875 C 6.989249 30.230871 7.010461 30.268869 7 30.28125 C 6.701861 30.6341 6.5 31.062279 6.5 31.5625 L 6.53125 38.5 C 6.53125 39.623303 7.439198 40.531251 8.5625 40.53125 L 39.5 40.53125 C 40.623303 40.53125 41.53125 39.623303 41.53125 38.5 L 41.5 31.5625 C 41.5 31.062279 41.298139 30.6341 41 30.28125 C 41.00076 30.273915 40.999427 30.257389 41 30.25 C 40.994697 30.243874 41.005375 30.224811 41 30.21875 C 41.000384 30.211311 40.999807 30.194989 41 30.1875 L 38.5 23.375 C 38.121224 22.906639 38.05898 22.664184 37.90625 22.5625 C 37.902538 22.560463 37.878847 22.533156 37.875 22.53125 C 37.871006 22.529474 37.8479 22.532897 37.84375 22.53125 C 37.785333 22.513087 37.694269 22.5 37.59375 22.5 L 10.25 22.5 C 10.172677 22.5 10.11363 22.489952 10.0625 22.5 z " + style="color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999994;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" + id="path2966" + d="M 10.4375,23.46875 C 10.380824,23.561866 10.312973,23.680306 10.21875,23.8125 L 7.96875,30.28125 C 7.9689174,30.291666 7.9689174,30.302084 7.96875,30.3125 C 7.9694197,30.333328 7.9694197,30.354172 7.96875,30.375 C 7.9660583,30.409592 7.9775483,30.424024 7.96875,30.46875 C 7.957019,30.528385 7.9399741,30.579404 7.90625,30.65625 C 7.896398,30.678699 7.8625816,30.687936 7.84375,30.71875 C 7.7981195,30.793414 7.7504628,30.905702 7.75,30.90625 C 7.5624892,31.128171 7.46875,31.323848 7.46875,31.5625 L 7.5,38.5 C 7.5,39.099388 7.9631135,39.562501 8.5625,39.5625 L 39.5,39.5625 C 40.099389,39.5625 40.5625,39.099389 40.5625,38.5 L 40.53125,31.5625 C 40.53125,31.323848 40.437511,31.128171 40.25,30.90625 C 40.249833,30.895834 40.249833,30.885416 40.25,30.875 C 40.215447,30.835916 40.184096,30.794114 40.15625,30.75 C 40.156083,30.739584 40.156083,30.729166 40.15625,30.71875 C 40.116161,30.649947 40.084675,30.57648 40.0625,30.5 C 40.059434,30.493727 40.064467,30.472788 40.0625,30.46875 C 40.05955,30.462693 40.031269,30.437596 40.03125,30.4375 C 40.031193,30.43722 40.033181,30.394681 40.03125,30.375 L 40.03125,30.34375 L 37.65625,23.84375 C 37.546063,23.695788 37.437051,23.566611 37.375,23.46875 L 10.4375,23.46875 z " /> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="phone"> + <g + id="g2366" + transform="matrix(1.000314,0,0,1,-2.355002e-3,-7.00001)"> + <path + sodipodi:nodetypes="ccczccccccccccz" + id="rect2276" + d="M 8.2474619,14.5 L 15.997332,11.500006 L 31.997332,11.500006 L 39.741876,14.5 C 39.998679,14.568832 40.489338,15.833368 40.489338,16.247462 L 40.489338,18.752538 C 40.489338,19.166632 40.15597,19.5 39.741876,19.5 L 33.989338,19.5 L 31.989338,15.5 L 16.489338,15.5 L 13.989338,19.5 L 8.2474619,19.5 C 7.833368,19.5 7.5,19.166632 7.5,18.752538 L 7.5,16.247462 C 7.5,15.833368 7.9909958,14.568741 8.2474619,14.5 z " + style="color:black;fill:url(#radialGradient4024);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3404);stroke-width:0.99984318;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" /> + </g> + <path + style="opacity:0.6;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4068);stroke-width:0.99984306;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" + d="M 16.1875,12.46875 L 8.8125,15.3125 C 8.7707065,15.388182 8.7403252,15.496831 8.6875,15.625 C 8.559965,15.934436 8.46875,16.429219 8.46875,16.25 L 8.46875,18.53125 L 13.46875,18.53125 C 14.327447,17.001869 14.597663,15.977358 16.5,16.53125 L 32,16.53125 C 32.859584,16.978721 33.469779,15.417049 34.625,18.53125 L 39.53125,18.53125 L 39.53125,16.25 C 39.53125,16.428953 39.439977,15.93437 39.3125,15.625 C 39.259699,15.496858 39.229269,15.388135 39.1875,15.3125 L 31.8125,12.46875 L 16.1875,12.46875 z " + id="path4056" + sodipodi:nodetypes="ccsccccccccsccc" + transform="matrix(1.000314,0,0,1,-2.355002e-3,-7.00001)" /> + <g + id="g4065" + transform="matrix(1,0,0,1.0625,0,-1.3125)" + style="opacity:0.8"> + <rect + y="21" + x="9.5" + height="8" + width="4" + id="rect4030" + style="opacity:1;fill:url(#radialGradient4070);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" /> + <rect + transform="scale(-1,-1)" + y="-29" + x="-38.5" + height="8" + width="4" + id="rect4041" + style="opacity:1;fill:url(#radialGradient4072);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" /> + <rect + y="21" + x="13.5" + height="8" + width="21" + id="rect4045" + style="opacity:1;fill:url(#linearGradient4074);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:0.17241378" /> + </g> + <path + style="color:black;fill:url(#linearGradient1614);fill-opacity:1.0;fill-rule:evenodd;stroke:url(#linearGradient1616);stroke-width:0.99999982;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" + d="M 17.509407,7.5 L 19.509407,7.5 L 20.009407,9.5 L 28.011919,9.5 L 28.509407,7.5 L 30.509407,7.5 C 31.633063,7.5 32.250126,8.4709838 32.542377,9.5 L 36.518513,23.499994 L 36.546145,25.499994 C 36.546145,26.56089 35.641541,27.499994 34.517885,27.499994 L 13.511291,27.499994 C 12.387635,27.499994 11.538295,26.56089 11.538295,25.499994 L 11.510663,23.499994 L 15.509407,9.5 C 15.803229,8.4713021 16.385751,7.5 17.509407,7.5 z " + id="rect2236" + sodipodi:nodetypes="ccccccsccccccsc" /> + <path + style="opacity:0.24324324;color:black;fill:url(#linearGradient1601);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;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" + d="M 30.504082,8 L 28.915223,8.022097 L 28.323223,10.022097 L 19.632583,9.955806 L 19.044665,8.022097 L 17.5,8 C 16.421291,8 16.073298,8.8189946 15.812953,9.789079 L 13.408753,18.747475 L 12.25157,22.499994 C 18.253454,15.294112 30.006751,26.499994 34.128045,16.768274 L 32.164603,9.789079 C 31.892547,8.8220351 31.582792,8 30.504082,8 z " + id="path2297" + sodipodi:nodetypes="ccccccscccsc" /> + <path + style="opacity:0.6;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1598);stroke-width:0.99999982;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" + d="M 17.500314,8.5 L 18.734835,8.5 L 19.232009,10.5 L 28.676777,10.477903 L 29.331456,8.5 L 30.504396,8.5 C 31.004553,8.5 31.244101,8.5887994 31.50471,9.5 L 35.508792,23.499994 L 35.508792,24.999994 C 35.508792,26.499994 35.508792,26.499994 34.008321,26.499994 L 14.002041,26.499994 C 12.50157,26.499994 12.50157,26.499994 12.50157,24.999994 L 12.50157,23.499994 L 16.5,9.5 C 16.760325,8.588505 17.000157,8.5 17.500314,8.5 z " + id="path2279" + sodipodi:nodetypes="ccccccsccccccsc" /> + <path + style="opacity:1;fill:url(#linearGradient2960);fill-opacity:1.0;stroke:none;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 18.67949,9.4999962 L 29.32127,9.4999962 C 29.918929,9.4999962 30.400075,9.9882196 30.400075,10.594668 L 32,21.40532 C 32,22.011768 31.518853,22.499992 30.921193,22.499992 L 17.067378,22.487622 C 16.469718,22.487622 15.988571,21.999399 15.988571,21.392951 L 17.600685,10.594668 C 17.600685,9.9882196 18.081832,9.4999962 18.67949,9.4999962 z " + id="rect4094" + sodipodi:nodetypes="ccccccccc" /> + <g + id="g3067" + transform="translate(0,0.5)" + style="fill:url(#linearGradient4967);fill-opacity:1.0"> + <path + sodipodi:nodetypes="ccccccccc" + id="path3043" + d="M 18.558806,13 L 20.780209,13.011049 C 21.089789,13.011049 21.354642,13.239508 21.339017,13.52329 L 21.296163,14.487759 C 21.280538,14.771541 21.046935,15 20.737355,15 L 18.415175,15 C 18.105596,15 17.809492,14.771541 17.856367,14.487759 L 17.999998,13.512241 C 18.031248,13.236272 18.249227,13 18.558806,13 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3045" + d="M 22.891192,13 L 25.100991,13 C 25.410571,13 25.659799,13.228459 25.659799,13.512241 L 25.698861,14.487759 C 25.698861,14.771541 25.449633,15 25.140053,15 L 22.852129,15 C 22.54255,15 22.293321,14.771541 22.293321,14.487759 L 22.332384,13.512241 C 22.332384,13.228459 22.581613,13 22.891192,13 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3047" + d="M 27.223578,13 L 29.441189,13 C 29.750769,13 29.960934,13.244084 29.999997,13.512241 L 30.140622,14.487759 C 30.187497,14.775447 29.891394,15 29.581814,15 L 27.266547,15 C 26.956968,15 26.719457,14.771541 26.707739,14.487759 L 26.66477,13.512241 C 26.649145,13.228459 26.913999,13 27.223578,13 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3049" + d="M 19.012241,10 L 20.954613,10 C 21.238395,10 21.490292,10.228459 21.466854,10.512241 L 21.42266,11.487759 C 21.42266,11.771541 21.194201,12 20.910419,12 L 18.835464,12 C 18.551682,12 18.323223,11.771541 18.323223,11.487759 L 18.5,10.512241 C 18.5,10.228459 18.728459,10 19.012241,10 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3051" + d="M 22.980991,10 L 25.011197,10 C 25.294979,10 25.523438,10.228459 25.523438,10.512241 L 25.554688,11.487759 C 25.554688,11.771541 25.326229,12 25.042447,12 L 22.941928,12 C 22.658146,12 22.429687,11.771541 22.429687,11.487759 L 22.46875,10.512241 C 22.46875,10.228459 22.697209,10 22.980991,10 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3053" + d="M 27.035679,10 L 29.011197,10 C 29.294979,10 29.480469,10.224553 29.523438,10.512241 L 29.683594,11.487759 C 29.722656,11.771541 29.455135,12 29.171353,12 L 27.078647,12 C 26.794865,12 26.582031,11.771541 26.566406,11.487759 L 26.523438,10.512241 C 26.507813,10.228459 26.751897,10 27.035679,10 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3055" + d="M 18.140535,16 L 20.596332,16 C 20.93171,16 21.221239,16.232365 21.201708,16.512241 L 21.158739,17.487759 C 21.143114,17.767635 20.888741,18 20.553363,18 L 17.992098,18 C 17.65672,18 17.343754,17.771541 17.386723,17.487759 L 17.53516,16.512241 C 17.578129,16.232365 17.805157,16 18.140535,16 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3057" + d="M 22.801401,16 L 25.190792,16 C 25.52617,16 25.796168,16.228459 25.796168,16.512241 L 25.83523,17.487759 C 25.83523,17.771541 25.565232,18 25.229854,18 L 22.770151,18 C 22.434773,18 22.164776,17.771541 22.164776,17.487759 L 22.196026,16.512241 C 22.196026,16.228459 22.466023,16 22.801401,16 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3059" + d="M 27.399767,16 L 29.847751,16 C 30.183129,16 30.414064,16.228459 30.453127,16.512241 L 30.597658,17.487759 C 30.64844,17.775447 30.32766,18 29.992282,18 L 27.442735,18 C 27.107357,18 26.852985,17.767635 26.83736,17.487759 L 26.794392,16.512241 C 26.782673,16.228459 27.064389,16 27.399767,16 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3061" + d="M 17.730073,19 L 20.408432,19 C 20.769608,19 21.076,19.236272 21.060375,19.512241 L 21.029125,20.487759 C 21.0135,20.763728 20.738358,21 20.377182,21 L 17.573823,21 C 17.212647,21 16.890631,20.771541 16.921881,20.487759 L 17.078131,19.512241 C 17.109381,19.232365 17.368897,19 17.730073,19 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3063" + d="M 22.723326,19 L 25.276683,19 C 25.637859,19 25.928626,19.228459 25.928626,19.512241 L 25.971595,20.487759 C 25.971595,20.771541 25.680828,21 25.319652,21 L 22.676451,21 C 22.315274,21 22.024508,20.771541 22.024508,20.487759 L 22.071383,19.512241 C 22.071383,19.228459 22.362149,19 22.723326,19 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path3065" + d="M 27.583765,19 L 30.258216,19 C 30.619392,19 30.875003,19.228459 30.910159,19.512241 L 31.066409,20.487759 C 31.109378,20.767635 30.775642,21 30.414466,21 L 27.63064,21 C 27.269463,21 26.986509,20.771541 26.978697,20.487759 L 26.931822,19.512241 C 26.920103,19.228459 27.222588,19 27.583765,19 z " + style="fill:url(#linearGradient4967);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" /> + </g> + <path + style="fill:url(#radialGradient2987);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 18.558806,13 L 20.780209,13.011049 C 21.089789,13.011049 21.354642,13.239508 21.339017,13.52329 L 21.296163,14.487759 C 21.280538,14.771541 21.046935,15 20.737355,15 L 18.415175,15 C 18.105596,15 17.809492,14.771541 17.856367,14.487759 L 17.999998,13.512241 C 18.031248,13.236272 18.249227,13 18.558806,13 z " + id="use6266" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient2983);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 22.891192,13 L 25.100991,13 C 25.410571,13 25.659799,13.228459 25.659799,13.512241 L 25.698861,14.487759 C 25.698861,14.771541 25.449633,15 25.140053,15 L 22.852129,15 C 22.54255,15 22.293321,14.771541 22.293321,14.487759 L 22.332384,13.512241 C 22.332384,13.228459 22.581613,13 22.891192,13 z " + id="use6268" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient2979);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 27.223578,13 L 29.441189,13 C 29.750769,13 29.960934,13.244084 29.999997,13.512241 L 30.140622,14.487759 C 30.187497,14.775447 29.891394,15 29.581814,15 L 27.266547,15 C 26.956968,15 26.719457,14.771541 26.707739,14.487759 L 26.66477,13.512241 C 26.649145,13.228459 26.913999,13 27.223578,13 z " + id="use6270" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient6264);fill-opacity:1.0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 19.012241,10 L 20.954613,10 C 21.238395,10 21.490292,10.228459 21.466854,10.512241 L 21.42266,11.487759 C 21.42266,11.771541 21.194201,12 20.910419,12 L 18.835464,12 C 18.551682,12 18.323223,11.771541 18.323223,11.487759 L 18.5,10.512241 C 18.5,10.228459 18.728459,10 19.012241,10 z " + id="rect5016" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient2968);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 22.980991,10 L 25.011197,10 C 25.294979,10 25.523438,10.228459 25.523438,10.512241 L 25.554688,11.487759 C 25.554688,11.771541 25.326229,12 25.042447,12 L 22.941928,12 C 22.658146,12 22.429687,11.771541 22.429687,11.487759 L 22.46875,10.512241 C 22.46875,10.228459 22.697209,10 22.980991,10 z " + id="use6252" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient2972);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 27.035679,10 L 29.011197,10 C 29.294979,10 29.480469,10.224553 29.523438,10.512241 L 29.683594,11.487759 C 29.722656,11.771541 29.455135,12 29.171353,12 L 27.078647,12 C 26.794865,12 26.582031,11.771541 26.566406,11.487759 L 26.523438,10.512241 C 26.507813,10.228459 26.751897,10 27.035679,10 z " + id="use6254" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient3002);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 18.140535,16 L 20.596332,16 C 20.93171,16 21.221239,16.232365 21.201708,16.512241 L 21.158739,17.487759 C 21.143114,17.767635 20.888741,18 20.553363,18 L 17.992098,18 C 17.65672,18 17.343754,17.771541 17.386723,17.487759 L 17.53516,16.512241 C 17.578129,16.232365 17.805157,16 18.140535,16 z " + id="use6279" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient2998);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 22.801401,16 L 25.190792,16 C 25.52617,16 25.796168,16.228459 25.796168,16.512241 L 25.83523,17.487759 C 25.83523,17.771541 25.565232,18 25.229854,18 L 22.770151,18 C 22.434773,18 22.164776,17.771541 22.164776,17.487759 L 22.196026,16.512241 C 22.196026,16.228459 22.466023,16 22.801401,16 z " + id="use6281" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient2994);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 27.399767,16 L 29.847751,16 C 30.183129,16 30.414064,16.228459 30.453127,16.512241 L 30.597658,17.487759 C 30.64844,17.775447 30.32766,18 29.992282,18 L 27.442735,18 C 27.107357,18 26.852985,17.767635 26.83736,17.487759 L 26.794392,16.512241 C 26.782673,16.228459 27.064389,16 27.399767,16 z " + id="use6283" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient3017);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 17.730073,19 L 20.408432,19 C 20.769608,19 21.076,19.236272 21.060375,19.512241 L 21.029125,20.487759 C 21.0135,20.763728 20.738358,21 20.377182,21 L 17.573823,21 C 17.212647,21 16.890631,20.771541 16.921881,20.487759 L 17.078131,19.512241 C 17.109381,19.232365 17.368897,19 17.730073,19 z " + id="use6287" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient3013);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 22.723326,19 L 25.276683,19 C 25.637859,19 25.928626,19.228459 25.928626,19.512241 L 25.971595,20.487759 C 25.971595,20.771541 25.680828,21 25.319652,21 L 22.676451,21 C 22.315274,21 22.024508,20.771541 22.024508,20.487759 L 22.071383,19.512241 C 22.071383,19.228459 22.362149,19 22.723326,19 z " + id="use6289" + sodipodi:nodetypes="ccccccccc" /> + <path + style="fill:url(#radialGradient3009);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.20000057;stroke-opacity:1" + d="M 27.583765,19 L 30.258216,19 C 30.619392,19 30.875003,19.228459 30.910159,19.512241 L 31.066409,20.487759 C 31.109378,20.767635 30.775642,21 30.414466,21 L 27.63064,21 C 27.269463,21 26.986509,20.771541 26.978697,20.487759 L 26.931822,19.512241 C 26.920103,19.228459 27.222588,19 27.583765,19 z " + id="use6291" + sodipodi:nodetypes="ccccccccc" /> + <g + id="g3105" + style="opacity:1;fill:#ccc;fill-opacity:1" + transform="translate(1,0.370117)"> + <text + id="text6117" + y="11.364014" + x="19.609175" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="11.364014" + x="19.609175" + id="tspan6119" + sodipodi:role="line">1</tspan></text> + <text + id="text6121" + y="11.364014" + x="23.675293" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="11.364014" + x="23.675293" + id="tspan6123" + sodipodi:role="line">2</tspan></text> + <text + id="text6125" + y="11.35791" + x="27.774256" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="11.35791" + x="27.774256" + id="tspan6127" + sodipodi:role="line">3</tspan></text> + <text + id="text6129" + y="14.364014" + x="19.262312" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="14.364014" + x="19.262312" + id="tspan6131" + sodipodi:role="line">4</tspan></text> + <text + id="text6133" + y="14.364014" + x="23.675293" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="14.364014" + x="23.675293" + id="tspan6135" + sodipodi:role="line">5</tspan></text> + <text + id="text6137" + y="14.35791" + x="28.067911" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="14.35791" + x="28.067911" + id="tspan6139" + sodipodi:role="line">6</tspan></text> + <text + id="text6141" + y="17.35791" + x="18.957983" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="17.35791" + x="18.957983" + id="tspan6143" + sodipodi:role="line">7</tspan></text> + <text + id="text6145" + y="17.364014" + x="23.675293" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="17.364014" + x="23.675293" + id="tspan6147" + sodipodi:role="line">8</tspan></text> + <text + id="text6149" + y="17.35791" + x="28.368921" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="17.35791" + x="28.368921" + id="tspan6151" + sodipodi:role="line">9</tspan></text> + <text + id="text6153" + y="20.358154" + x="18.661995" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="20.358154" + x="18.661995" + id="tspan6155" + sodipodi:role="line">#</tspan></text> + <text + id="text6157" + y="20.35791" + x="23.666496" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#ccc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:1px;fill:#ccc;fill-opacity:1;font-family:Arial Black" + y="20.35791" + x="23.666496" + id="tspan6159" + sodipodi:role="line">0</tspan></text> + <text + id="text6161" + y="20.88273" + x="28.54826" + style="font-size:1.73080969px;font-weight:bold;fill:#ccc;fill-opacity:1" + xml:space="preserve"><tspan + style="font-size:1.73080969px;font-weight:bold;fill:#ccc;fill-opacity:1" + y="20.88273" + x="28.54826" + id="tspan6163" + sodipodi:role="line">*</tspan></text> + </g> + </g> +</svg> diff --git a/modemlights/modem-applet-menu.xml b/modemlights/modem-applet-menu.xml new file mode 100644 index 00000000..7e1d0e0a --- /dev/null +++ b/modemlights/modem-applet-menu.xml @@ -0,0 +1,7 @@ +<menuitem name="Activate" action="Activate" /> +<menuitem name="Deactivate" action="Deactivate" /> +<separator/> +<menuitem name="Properties" action="Properties" /> +<menuitem name="Help" action="Help" /> +<menuitem name="About" action="About" /> + diff --git a/modemlights/modem-applet.c b/modemlights/modem-applet.c new file mode 100644 index 00000000..1e569bf5 --- /dev/null +++ b/modemlights/modem-applet.c @@ -0,0 +1,1080 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 2 -*- */ +/* Copyright (C) 2004 Carlos Garnacho + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * + * Authors: Carlos Garnacho Parro <[email protected]> + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <glib/gi18n.h> +#include <mate-panel-applet.h> +#include <fcntl.h> +#ifdef HAVE_PTY_H +#include <pty.h> +#endif +#include <sys/poll.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <libxml/tree.h> +#include <errno.h> + +#ifdef __FreeBSD__ +#include <sys/ioctl.h> +#include <termios.h> +#include <libutil.h> +#endif + +#include "modem-applet.h" + +#define MODEM_APPLET_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_MODEM_APPLET, ModemAppletPrivate)) +#define NETWORK_TOOL "network-admin" +#define END_OF_REQUEST "<!-- GST: end of request -->\n" +#define BUF_SIZE 1024 + +typedef void (*DirectiveCallback) (ModemApplet*, xmlDoc*); +typedef struct _BackendDirective BackendDirective; +typedef struct _ModemAppletPrivate ModemAppletPrivate; + +struct _ModemAppletPrivate +{ + /* applet UI stuff */ + GtkBuilder *builder; + GtkIconTheme *icon_theme; + GdkPixbuf *icon; + GtkWidget *image; + GtkActionGroup *action_group; + + /* auth dialog */ + GtkWidget *auth_dialog; + GtkWidget *auth_dialog_label; + GtkWidget *auth_dialog_entry; + + /* report window */ + GtkWidget *report_window; + GtkWidget *report_window_image; + GtkWidget *report_window_progress; + + guint directives_id; + guint progress_id; + guint tooltip_id; + guint info_id; + guint timeout_id; + + /* for communicating with the backend */ + gint config_id; + gint pid; + int read_fd; + int write_fd; + FILE *read_stream; + FILE *write_stream; + GSList *directives; + gboolean directive_running; + + /* interface data */ + gboolean configured; /* is configured? */ + gboolean enabled; /* is enabled? */ + gboolean is_isdn; /* is an isdn device? */ + gchar *dev; /* device name */ + gchar *lock_file; /* lock file */ + + gboolean has_root; +}; + +struct _BackendDirective +{ + DirectiveCallback callback; + GSList *directive; + gboolean show_report; +}; + +static void modem_applet_class_init (ModemAppletClass *class); +static void modem_applet_init (ModemApplet *applet); +static void modem_applet_finalize (GObject *object); + +static gboolean update_tooltip (ModemApplet *applet); +static gboolean dispatch_directives (ModemApplet *applet); +static gboolean update_info (ModemApplet *applet); + +static void modem_applet_change_size (MatePanelApplet *applet, guint size); + +static void modem_applet_change_background (MatePanelApplet *app, + MatePanelAppletBackgroundType type, + GdkColor *colour, + GdkPixmap *pixmap); + +static void on_modem_applet_about_clicked (GtkAction *action, + ModemApplet *applet); +static void on_modem_applet_activate (GtkAction *action, + ModemApplet *applet); +static void on_modem_applet_deactivate (GtkAction *action, + ModemApplet *applet); +static void on_modem_applet_properties_clicked (GtkAction *action, + ModemApplet *applet); +static void on_modem_applet_help_clicked (GtkAction *action, + ModemApplet *applet); + +static void launch_backend (ModemApplet *applet, + gboolean root_auth); +static void shutdown_backend (ModemApplet *applet, + gboolean backend_alive, + gboolean already_waiting); + +static gpointer parent_class; + +static const GtkActionEntry menu_actions[] = { + { "Activate", GTK_STOCK_EXECUTE, N_("_Activate"), + NULL, NULL, + G_CALLBACK (on_modem_applet_activate) }, + { "Deactivate", GTK_STOCK_STOP, N_("_Deactivate"), + NULL, NULL, + G_CALLBACK (on_modem_applet_deactivate) }, + { "Properties", GTK_STOCK_PROPERTIES, N_("_Properties"), + NULL, NULL, + G_CALLBACK (on_modem_applet_properties_clicked) }, + { "Help", GTK_STOCK_HELP, N_("_Help"), + NULL, NULL, + G_CALLBACK (on_modem_applet_help_clicked) }, + { "About", GTK_STOCK_ABOUT, N_("_About"), + NULL, NULL, + G_CALLBACK (on_modem_applet_about_clicked) } +}; + +G_DEFINE_TYPE (ModemApplet, modem_applet, PANEL_TYPE_APPLET) + +static void +modem_applet_class_init (ModemAppletClass *class) +{ + GObjectClass *object_class; + MatePanelAppletClass *applet_class; + + object_class = G_OBJECT_CLASS (class); + applet_class = MATE_PANEL_APPLET_CLASS (class); + parent_class = g_type_class_peek_parent (class); + + object_class->finalize = modem_applet_finalize; + applet_class->change_size = modem_applet_change_size; + applet_class->change_background = modem_applet_change_background; + + g_type_class_add_private (object_class, sizeof (ModemAppletPrivate)); +} + +static void +modem_applet_init (ModemApplet *applet) +{ + ModemAppletPrivate *priv; + GdkPixbuf *pixbuf; + + g_set_application_name ( _("Modem Monitor")); + + priv = MODEM_APPLET_GET_PRIVATE (applet); + + priv->builder = gtk_builder_new (); + gtk_builder_add_from_file (priv->builder, GTK_BUILDERDIR "/modemlights.ui", NULL); + priv->icon = NULL; + priv->icon_theme = gtk_icon_theme_get_default (); + priv->image = gtk_image_new (); + + priv->auth_dialog = GTK_WIDGET (gtk_builder_get_object (priv->builder, "auth_dialog")); + priv->auth_dialog_label = GTK_WIDGET (gtk_builder_get_object (priv->builder, "auth_dialog_label")); + priv->auth_dialog_entry = GTK_WIDGET (gtk_builder_get_object (priv->builder, "auth_dialog_entry")); + + priv->report_window = GTK_WIDGET (gtk_builder_get_object (priv->builder, "report_window")); + priv->report_window_image = GTK_WIDGET (gtk_builder_get_object (priv->builder, "report_window_image")); + priv->report_window_progress = GTK_WIDGET (gtk_builder_get_object (priv->builder, "report_window_progress")); + + g_signal_connect (G_OBJECT (priv->report_window), "delete-event", + G_CALLBACK (gtk_widget_hide), NULL); + + pixbuf = gtk_icon_theme_load_icon (priv->icon_theme, "mate-modem-monitor-applet", 48, 0, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (priv->report_window_image), pixbuf); + g_object_unref (pixbuf); + + priv->configured = FALSE; + priv->enabled = FALSE; + priv->dev = NULL; + priv->lock_file = NULL; + + priv->has_root = FALSE; + + priv->directives = NULL; + priv->directives_id = g_timeout_add (250, (GSourceFunc) dispatch_directives, applet); + priv->directive_running = FALSE; + priv->tooltip_id = g_timeout_add_seconds (1, (GSourceFunc) update_tooltip, applet); + + launch_backend (applet, FALSE); + gtk_container_add (GTK_CONTAINER (applet), priv->image); +} + +static void +modem_applet_finalize (GObject *object) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (object); + + if (priv) + { + shutdown_backend (MODEM_APPLET (object), TRUE, TRUE); + + gtk_widget_destroy (priv->auth_dialog); + gtk_widget_destroy (priv->report_window); + g_object_unref (priv->icon); + g_object_unref (priv->action_group); + + g_free (priv->dev); + g_free (priv->lock_file); + } + + if (G_OBJECT_CLASS (parent_class)->finalize) + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +static void +modem_applet_change_size (MatePanelApplet *applet, + guint size) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + + if (priv->icon) + g_object_unref (priv->icon); + + /* this might be too much overload, maybe should we get just one icon size and scale? */ + priv->icon = gtk_icon_theme_load_icon (priv->icon_theme, + "mate-modem", size, 0, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), priv->icon); +} + +static void +modem_applet_change_background (MatePanelApplet *app, + MatePanelAppletBackgroundType type, + GdkColor *colour, + GdkPixmap *pixmap) +{ + ModemApplet *applet = MODEM_APPLET (app); + GtkRcStyle *rc_style; + GtkStyle *style; + + /* reset style */ + gtk_widget_set_style (GTK_WIDGET (applet), NULL); + rc_style = gtk_rc_style_new (); + gtk_widget_modify_style (GTK_WIDGET (applet), rc_style); + g_object_unref (rc_style); + + switch (type) + { + case PANEL_NO_BACKGROUND: + break; + case PANEL_COLOR_BACKGROUND: + gtk_widget_modify_bg (GTK_WIDGET (applet), + GTK_STATE_NORMAL, colour); + break; + case PANEL_PIXMAP_BACKGROUND: + style = gtk_style_copy (GTK_WIDGET (applet)->style); + + if (style->bg_pixmap[GTK_STATE_NORMAL]) + g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]); + + style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap); + gtk_widget_set_style (GTK_WIDGET (applet), style); + g_object_unref (style); + break; + } +} + +static gboolean +pulse_progressbar (GtkWidget *progressbar) +{ + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progressbar)); + return TRUE; +} + +/* XML manipulation functions */ +static xmlNodePtr +get_root_node (xmlDoc *doc) +{ + return xmlDocGetRootElement (doc); +} + +static xmlNodePtr +find_first_element (xmlNodePtr node, const gchar *name) +{ + xmlNodePtr n; + + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + for (n = node->children; n; n = n->next) + if (n->name && (strcmp (name, (char *) n->name) == 0)) + break; + + return n; +} + +static xmlNodePtr +find_next_element (xmlNodePtr node, const gchar *name) +{ + xmlNodePtr n; + + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + for (n = node->next; n; n = n->next) + if (n->name && (strcmp (name, (char *) n->name) == 0)) + break; + + return n; +} + +static guchar * +element_get_attribute (xmlNodePtr node, const gchar *attribute) +{ + xmlAttrPtr a; + + g_return_val_if_fail (node != NULL, NULL); + a = node->properties; + + while (a) + { + if (a->name && (strcmp ((char *) a->name, attribute) == 0)) + return xmlNodeGetContent (a->children); + + a = a->next; + } + + return NULL; +} + +static guchar * +element_get_child_content (xmlNodePtr node, const gchar *tag) +{ + xmlNodePtr child, n; + + child = find_first_element (node, tag); + if (!child) + return NULL; + + for (n = child->children; n; n = n->next) + if (n->type == XML_TEXT_NODE) + return xmlNodeGetContent (n); + + return NULL; +} + +static xmlNodePtr +find_dialup_interface_node (xmlNodePtr root) +{ + xmlNodePtr node; + gchar *type; + + node = find_first_element (root, "interface"); + + while (node) + { + type = (char *) element_get_attribute (node, "type"); + + if (type && (strcmp (type, "modem") == 0 || strcmp (type, "isdn") == 0)) + { + g_free (type); + return node; + } + + g_free (type); + node = find_next_element (node, "interface"); + } + + return NULL; +} + +/* backend communication functions */ +static gchar * +compose_directive_string (GSList *directive) +{ + GString *dir; + gchar *arg, *s, *str; + GSList *elem; + + elem = directive; + dir = g_string_new (""); + + while (elem) + { + arg = elem->data; + + for (s = arg; *s; s++) + { + /* escape needed chars */ + if ((*s == '\\') || + ((*s == ':') && (* (s + 1) == ':'))) + g_string_append_c (dir, '\\'); + + g_string_append_c (dir, *s); + } + + g_string_append (dir, "::"); + elem = elem->next; + } + + g_string_append_c (dir, '\n'); + + str = dir->str; + g_string_free (dir, FALSE); + + return str; +} + +static void +poll_backend (ModemAppletPrivate *priv) +{ + struct pollfd fd; + + fd.fd = priv->read_fd; + fd.events = POLLIN || POLLPRI; + + while (poll (&fd, 1, 100) <= 0) + { + while (gtk_events_pending ()) + gtk_main_iteration (); + } +} + +static xmlDoc* +read_xml (ModemApplet *applet, gboolean show_report) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + gchar buffer[BUF_SIZE], *s; + GString *str; + xmlDoc *doc = NULL; + gboolean backend_alive; + + str = g_string_new (""); + backend_alive = (waitpid (priv->pid, NULL, WNOHANG) == 0); + + /* if show_report, create pulse timeout and show window */ + if (show_report) + { + priv->progress_id = g_timeout_add (200, (GSourceFunc) pulse_progressbar, priv->report_window_progress); + gtk_window_set_screen (GTK_WINDOW (priv->report_window), gtk_widget_get_screen (GTK_WIDGET (applet))); + gtk_widget_show (priv->report_window); + } + + while (backend_alive && !g_strrstr (str->str, END_OF_REQUEST)) + { + poll_backend (priv); + fgets (buffer, BUF_SIZE, priv->read_stream); + g_string_append (str, buffer); + + while (gtk_events_pending ()) + gtk_main_iteration (); + + backend_alive = (waitpid (priv->pid, NULL, WNOHANG) == 0); + } + + /* if show_report, hide window and so */ + if (show_report) + { + g_source_remove (priv->progress_id); + priv->progress_id = 0; + gtk_widget_hide (priv->report_window); + } + + s = str->str; + + while (*s && (*s != '<')) + s++; + + if (strcmp (s, END_OF_REQUEST) != 0) + doc = xmlParseDoc ((xmlChar *) s); + + g_string_free (str, TRUE); + + return doc; +} + +static void +queue_directive (ModemApplet *applet, + DirectiveCallback callback, + gboolean show_report, + const gchar *dir, + ...) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + BackendDirective *directive; + GSList *list = NULL; + va_list ap; + gchar *arg; + + list = g_slist_prepend (list, g_strdup (dir)); + va_start (ap, dir); + + while ((arg = va_arg (ap, gchar *)) != NULL) + list = g_slist_prepend (list, g_strdup (arg)); + + va_end (ap); + list = g_slist_reverse (list); + + directive = g_new0 (BackendDirective, 1); + directive->callback = callback; + directive->directive = list; + directive->show_report = show_report; + + priv->directives = g_slist_append (priv->directives, directive); +} + +static gboolean +dispatch_directives (ModemApplet *applet) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + BackendDirective *directive; + xmlDoc *doc; + gchar *dir; + GSList *elem; + + if (priv->directive_running) + return TRUE; + + priv->directive_running = TRUE; + elem = priv->directives; + + while (elem) + { + directive = elem->data; + + dir = compose_directive_string (directive->directive); + fputs (dir, priv->write_stream); + g_free (dir); + + doc = read_xml (applet, directive->show_report); + + if (directive->callback) + directive->callback (applet, doc); + + if (doc) + xmlFreeDoc (doc); + + g_slist_foreach (directive->directive, (GFunc) g_free, NULL); + g_slist_free (directive->directive); + + elem = elem->next; + } + + g_slist_foreach (priv->directives, (GFunc) g_free, NULL); + g_slist_free (priv->directives); + priv->directives = NULL; + priv->directive_running = FALSE; + + return TRUE; +} + +static void +shutdown_backend (ModemApplet *applet, gboolean backend_alive, gboolean already_waiting) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + + if (priv->info_id) + { + g_source_remove (priv->info_id); + priv->info_id = 0; + } + + if (priv->timeout_id) + { + g_source_remove (priv->timeout_id); + priv->timeout_id = 0; + } + + if (priv->tooltip_id) + { + g_source_remove (priv->tooltip_id); + priv->tooltip_id = 0; + } + + if (backend_alive) + kill (priv->pid, 9); + + if (!already_waiting) + { + /* don't leave zombies */ + while (waitpid (priv->pid, NULL, WNOHANG) <= 0) + { + usleep (2000); + + while (gtk_events_pending ()) + gtk_main_iteration (); + } + } + + /* close remaining streams and fds */ + fclose (priv->read_stream); + fclose (priv->write_stream); + close (priv->read_fd); + close (priv->write_fd); +} + +/* functions for extracting the interface information from the XML */ +static void +update_popup_buttons (ModemApplet *applet) +{ + GtkAction *action; + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + + action = gtk_action_group_get_action (priv->action_group, "Activate"); + gtk_action_set_sensitive (action, priv->configured && !priv->enabled); + + action = gtk_action_group_get_action (priv->action_group, "Deactivate"); + gtk_action_set_sensitive (action, priv->configured && priv->enabled); +} + +static void +get_interface_data (ModemApplet *applet, xmlNodePtr iface) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + xmlNodePtr configuration; + gchar *text, *device; + + g_return_if_fail (iface != NULL); + + text = (char *) element_get_child_content (iface, "enabled"); + priv->enabled = (*text == '1'); + g_free (text); + + g_free (priv->dev); + priv->dev = (char *) element_get_child_content (iface, "dev"); + + g_free (priv->lock_file); + configuration = find_first_element (iface, "configuration"); + + if (configuration) + { + priv->configured = TRUE; + text = (char *) element_get_child_content (configuration, "serial_port"); + + if (text) + { + /* Modem device */ + device = strrchr (text, '/'); + priv->lock_file = g_strdup_printf ("/var/lock/LCK..%s", device + 1); + g_free (text); + + priv->is_isdn = FALSE; + } + else + { + /* isdn device */ + priv->lock_file = g_strdup ("/var/lock/LCK..capi_0"); + priv->is_isdn = TRUE; + } + } + else + { + priv->lock_file = NULL; + priv->configured = FALSE; + } +} + +static gint +get_connection_time (const gchar *lock_file) +{ + struct stat st; + + if (stat (lock_file, &st) == 0) + return (gint) (time (NULL) - st.st_mtime); + + return 0; +} + +static gboolean +update_tooltip (ModemApplet *applet) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + gchar *text; + gint t, t1, t2; + + if (priv->enabled) + { + if (!priv->lock_file) + text = g_strdup (_("Connection active, but could not get connection time")); + else + { + t = get_connection_time (priv->lock_file); + + if (t < (60 * 60 * 24)) + { + t1 = t / 3600; /* hours */ + t2 = (t - (t1 * 3600)) / 60; /* minutes */ + } + else + { + t1 = t / (3600 * 24); /* days */ + t2 = (t - (t1 * 3600 * 24)) / 3600; /* hours */ + } + + text = g_strdup_printf (_("Time connected: %.1d:%.2d"), t1, t2); + } + } + else + text = g_strdup (_("Not connected")); + + gtk_widget_set_tooltip_text (GTK_WIDGET (applet), text); + g_free (text); + + return TRUE; +} + +static void +rerun_backend_callback (ModemApplet *applet, xmlDoc *doc) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + gchar *text, *password; + gint response; + gboolean enable; + + shutdown_backend (applet, FALSE, FALSE); + launch_backend (applet, TRUE); + + enable = !priv->enabled; + + text = (enable) ? + _("To connect to your Internet service provider, you need administrator privileges") : + _("To disconnect from your Internet service provider, you need administrator privileges"); + + gtk_label_set_text (GTK_LABEL (priv->auth_dialog_label), text); + gtk_window_set_screen (GTK_WINDOW (priv->auth_dialog), + gtk_widget_get_screen (GTK_WIDGET (applet))); + + gtk_widget_grab_focus (priv->auth_dialog_entry); + response = gtk_dialog_run (GTK_DIALOG (priv->auth_dialog)); + gtk_widget_hide (priv->auth_dialog); + password = (gchar *) gtk_entry_get_text (GTK_ENTRY (priv->auth_dialog_entry)); + + if (response == GTK_RESPONSE_OK) + { + + password = (gchar *) gtk_entry_get_text (GTK_ENTRY (priv->auth_dialog_entry)); + fputs (password, priv->write_stream); + fputs ("\n", priv->write_stream); + + while (fflush (priv->write_stream) != 0); + + queue_directive (applet, NULL, enable, + "enable_iface", priv->dev, (enable) ? "1" : "0", NULL); + } + else + { + shutdown_backend (applet, TRUE, FALSE); + launch_backend (applet, FALSE); + } + + /* stab the root password */ + memset (password, ' ', sizeof (password)); + gtk_entry_set_text (GTK_ENTRY (priv->auth_dialog_entry), ""); +} + +static void +update_info_callback (ModemApplet *applet, xmlDoc *doc) +{ + xmlNodePtr iface; + + if (!doc) + return; + + iface = find_dialup_interface_node (get_root_node (doc)); + if (!iface) + return; + + get_interface_data (applet, iface); + update_popup_buttons (applet); +} + +static gboolean +update_info (ModemApplet *applet) +{ + queue_directive (applet, update_info_callback, + FALSE, "get", NULL); + return TRUE; +} + +static gboolean +check_backend (ModemApplet *applet) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + gint status, pid = -1; + GtkWidget *dialog; + + pid = waitpid (priv->pid, &status, WNOHANG); + + if (pid != 0) + { + if (errno == ECHILD || ((WIFEXITED (status)) && (WEXITSTATUS (status)) && (WEXITSTATUS(status) < 255))) + { + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + _("The entered password is invalid")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("Check that you have typed it correctly and that " + "you haven't activated the \"caps lock\" key")); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } + + priv->timeout_id = 0; + shutdown_backend (applet, FALSE, TRUE); + launch_backend (applet, FALSE); + + return FALSE; + } + + return TRUE; +} + +static void +launch_backend (ModemApplet *applet, gboolean root_auth) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + gchar *non_auth_args[] = { STB_SCRIPTS_DIR "/network-conf", NULL }; + gchar *auth_args[] = { SU_PATH, "-c", STB_SCRIPTS_DIR "/network-conf", NULL }; + gchar **args; + int p[2]; + + pipe (p); + priv->pid = forkpty (&priv->write_fd, NULL, NULL, NULL); + args = (root_auth) ? auth_args : non_auth_args; + + if (priv->pid < 0) + g_warning ("Could not spawn GST backend"); + else + { + if (priv->pid == 0) + { + /* child process */ + unsetenv("LC_ALL"); + unsetenv("LC_MESSAGES"); + unsetenv("LANG"); + unsetenv("LANGUAGE"); + + dup2 (p[1], 1); + dup2 (p[1], 2); + close (p[0]); + + execv (args[0], args); + exit (255); + } + else + { + close (p[1]); + + priv->read_fd = p[0]; + priv->timeout_id = g_timeout_add_seconds (1, (GSourceFunc) check_backend, applet); + priv->info_id = g_timeout_add_seconds (3, (GSourceFunc) update_info, applet); + priv->read_stream = fdopen (priv->read_fd, "r"); + priv->write_stream = fdopen (priv->write_fd, "w"); + priv->has_root = root_auth; + + setvbuf (priv->read_stream, NULL, _IONBF, 0); + fcntl (priv->read_fd, F_SETFL, 0); + } + } +} + +static gboolean +launch_config_tool (GdkScreen *screen, gboolean is_isdn) +{ + gchar *argv[4], *application; + gboolean ret; + + application = g_find_program_in_path (NETWORK_TOOL); + + if (!application) + return FALSE; + + argv[0] = application; + argv[1] = "--configure-type"; + argv[2] = (is_isdn) ? "isdn" : "modem"; + argv[3] = NULL; + + ret = gdk_spawn_on_screen (screen, NULL, argv, NULL, 0, + NULL, NULL, NULL, NULL); + g_free (application); + return ret; +} + +static void +toggle_interface_non_root (ModemApplet *applet, gboolean enable) +{ + queue_directive (applet, rerun_backend_callback, + FALSE, "end", NULL); +} + +static void +toggle_interface_root (ModemApplet *applet, gboolean enable) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + GtkWidget *dialog; + gchar *text; + + text = (enable) ? + _("Do you want to connect?") : + _("Do you want to disconnect?"); + + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + text); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + (enable) ? _("C_onnect") : _("_Disconnect"), + GTK_RESPONSE_OK, NULL); + gtk_window_set_screen (GTK_WINDOW (dialog), + gtk_widget_get_screen (GTK_WIDGET (applet))); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) + queue_directive (applet, NULL, enable, + "enable_iface", priv->dev, (enable) ? "1" : "0", NULL); + + gtk_widget_destroy (dialog); +} + +static void +toggle_interface (ModemApplet *applet, gboolean enable) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + + if (priv->has_root) + toggle_interface_root (applet, enable); + else + toggle_interface_non_root (applet, enable); +} + +static void +on_modem_applet_activate (GtkAction *action, + ModemApplet *applet) +{ + toggle_interface (applet, TRUE); +} + +static void +on_modem_applet_deactivate (GtkAction *action, + ModemApplet *applet) +{ + toggle_interface (applet, FALSE); +} + +static void +on_modem_applet_properties_clicked (GtkAction *action, + ModemApplet *applet) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + GdkScreen *screen; + GtkWidget *dialog; + + screen = gtk_widget_get_screen (GTK_WIDGET (applet)); + + if (!launch_config_tool (screen, priv->is_isdn)) + { + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Could not launch network configuration tool")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("Check that it's installed in the correct path " + "and that it has the correct permissions")); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } +} + +static void +on_modem_applet_about_clicked (GtkAction *action, + ModemApplet *applet) +{ + const gchar *authors[] = { + "Carlos Garnacho Parro <[email protected]>", + NULL + }; +/* + const gchar *documenters[] = { + NULL + }; +*/ + gtk_show_about_dialog (NULL, + "version", VERSION, + "copyright", "Copyright \xC2\xA9 2004 Free Software Foundation. Inc.", + "comments", _("Applet for activating and monitoring a dial-up network connection."), + "authors", authors, + /* "documenters", documenters, */ + "translator-credits", _("translator-credits"), + "logo_icon_name", "mate-modem-monitor-applet", + NULL); +} + +static void +on_modem_applet_help_clicked (GtkAction *action, + ModemApplet *applet) +{ + gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (applet)), + "ghelp:modemlights", + gtk_get_current_event_time (), + NULL); +} + +static gboolean +modem_applet_fill (ModemApplet *applet) +{ + ModemAppletPrivate *priv = MODEM_APPLET_GET_PRIVATE (applet); + gchar *ui_path; + + g_return_val_if_fail (PANEL_IS_APPLET (applet), FALSE); + + gtk_widget_show_all (GTK_WIDGET (applet)); + + priv->action_group = gtk_action_group_new ("ModemLights Applet Actions"); + gtk_action_group_set_translation_domain (priv->action_group, GETTEXT_PACKAGE); + gtk_action_group_add_actions (priv->action_group, + menu_actions, + G_N_ELEMENTS (menu_actions), + applet); + update_popup_buttons (applet); + ui_path = g_build_filename (MODEM_MENU_UI_DIR, "modem-applet-menu.xml", NULL); + mate_panel_applet_setup_menu_from_file (MATE_PANEL_APPLET (applet), + ui_path, priv->action_group); + g_free (ui_path); + + return TRUE; +} + +static gboolean +modem_applet_factory (MatePanelApplet *applet, + const gchar *iid, + gpointer data) +{ + gboolean retval = FALSE; + + if (!strcmp (iid, "ModemLightsApplet")) + retval = modem_applet_fill (MODEM_APPLET (applet)); + + return retval; +} + +MATE_PANEL_APPLET_OUT_PROCESS_FACTORY ("ModemAppletFactory", + TYPE_MODEM_APPLET, + "modem", + modem_applet_factory, + NULL) diff --git a/modemlights/modem-applet.h b/modemlights/modem-applet.h new file mode 100644 index 00000000..b948f015 --- /dev/null +++ b/modemlights/modem-applet.h @@ -0,0 +1,52 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 2 -*- */ +/* Copyright (C) 2004 Carlos Garnacho + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * + * Authors: Carlos Garnacho Parro <[email protected]> + */ + +#ifndef __MODEM_APPLET_H +#define __MODEM_APPLET_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <mate-panel-applet.h> + +#define TYPE_MODEM_APPLET (modem_applet_get_type ()) +#define MODEM_APPLET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MODEM_APPLET, ModemApplet)) +#define MODEM_APPLET_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), TYPE_MODEM_APPLET, ModemAppletClass)) +#define IS_MODEM_APPLET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MODEM_APPLET)) +#define IS_MODEM_APPLET_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_MODEM_APPLET)) +#define MODEM_APPLET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MODEM_APPLET, ModemAppletClass)) + +typedef struct _ModemApplet ModemApplet; +typedef struct _ModemAppletClass ModemAppletClass; + +struct _ModemApplet { + MatePanelApplet parent; +}; + +struct _ModemAppletClass { + MatePanelAppletClass parent_class; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __MODEM_APPLET_H */ diff --git a/modemlights/modemlights.ui b/modemlights/modemlights.ui new file mode 100644 index 00000000..920050da --- /dev/null +++ b/modemlights/modemlights.ui @@ -0,0 +1,220 @@ +<?xml version="1.0"?> +<interface> + <requires lib="gtk+" version="2.16"/> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkDialog" id="auth_dialog"> + <property name="title" translatable="yes">Enter password</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="window_position">center</property> + <property name="type_hint">dialog</property> + <property name="has_separator">False</property> + <child internal-child="vbox"> + <object class="GtkVBox" id="dialog-vbox1"> + <property name="visible">True</property> + <child> + <object class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="border_width">7</property> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="stock">mate-stock-authentication</property> + <property name="icon-size">6</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Root password required</property> + <attributes> + <attribute name="weight" value="bold"/> + <attribute name="scale" value="1.300000"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="auth_dialog_label"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="xalign">0</property> + <property name="wrap">True</property> + <property name="selectable">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="label" translatable="yes">Password:</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="auth_dialog_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="visibility">False</property> + <property name="activates_default">True</property> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child internal-child="action_area"> + <object class="GtkHButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="cancelbutton1"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="okbutton1"> + <property name="label">gtk-ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-6">cancelbutton1</action-widget> + <action-widget response="-5">okbutton1</action-widget> + </action-widgets> + </object> + <object class="GtkWindow" id="report_window"> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="window_position">center</property> + <child> + <object class="GtkHBox" id="hbox3"> + <property name="visible">True</property> + <property name="border_width">12</property> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="report_window_image"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="label" translatable="yes">Connecting with Internet Service Provider</property> + <property name="wrap">True</property> + <attributes> + <attribute name="weight" value="bold"/> + <attribute name="scale" value="1.250000"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkProgressBar" id="report_window_progress"> + <property name="visible">True</property> + <property name="pulse_step">0.10000000149</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/modemlights/org.mate.applets.ModemApplet.mate-panel-applet.in.in b/modemlights/org.mate.applets.ModemApplet.mate-panel-applet.in.in new file mode 100644 index 00000000..1866fab5 --- /dev/null +++ b/modemlights/org.mate.applets.ModemApplet.mate-panel-applet.in.in @@ -0,0 +1,16 @@ +[Applet Factory] +Id=ModemAppletFactory +Location=@LIBEXECDIR@/modem_applet +Name=Modem Factory +Description=Modem Applet Factory + +[ModemLightsApplet] +_Name=Modem Monitor +_Description=Activate and monitor a dial-up network connection +Icon=mate-modem-monitor-applet +MateComponentId=OAFIID:MATE_ModemLightsApplet +X-MATE-Bugzilla-Bugzilla=MATE +X-MATE-Bugzilla-Product=mate-applets +X-MATE-Bugzilla-Component=modemlights +X-MATE-Bugzilla-Version=@VERSION@ +X-MATE-Bugzilla-OtherBinaries=modem_applet diff --git a/modemlights/org.mate.panel.applet.ModemAppletFactory.service.in b/modemlights/org.mate.panel.applet.ModemAppletFactory.service.in new file mode 100644 index 00000000..01c34fe2 --- /dev/null +++ b/modemlights/org.mate.panel.applet.ModemAppletFactory.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.mate.panel.applet.ModemAppletFactory +Exec=@LIBEXECDIR@/modem_applet |