summaryrefslogtreecommitdiff
path: root/modemlights
diff options
context:
space:
mode:
Diffstat (limited to 'modemlights')
-rw-r--r--modemlights/AUTHORS4
-rw-r--r--modemlights/Makefile.am103
-rw-r--r--modemlights/mate-modem-monitor-applet.16.pngbin0 -> 719 bytes
-rw-r--r--modemlights/mate-modem-monitor-applet.22.pngbin0 -> 1168 bytes
-rw-r--r--modemlights/mate-modem-monitor-applet.24.pngbin0 -> 1221 bytes
-rw-r--r--modemlights/mate-modem-monitor-applet.32.pngbin0 -> 2148 bytes
-rw-r--r--modemlights/mate-modem-monitor-applet.svg1377
-rw-r--r--modemlights/modem-applet-menu.xml7
-rw-r--r--modemlights/modem-applet.c1080
-rw-r--r--modemlights/modem-applet.h52
-rw-r--r--modemlights/modemlights.ui220
-rw-r--r--modemlights/org.mate.applets.ModemApplet.mate-panel-applet.in.in16
-rw-r--r--modemlights/org.mate.panel.applet.ModemAppletFactory.service.in3
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
new file mode 100644
index 00000000..17bd8f36
--- /dev/null
+++ b/modemlights/mate-modem-monitor-applet.16.png
Binary files differ
diff --git a/modemlights/mate-modem-monitor-applet.22.png b/modemlights/mate-modem-monitor-applet.22.png
new file mode 100644
index 00000000..455bbeb0
--- /dev/null
+++ b/modemlights/mate-modem-monitor-applet.22.png
Binary files differ
diff --git a/modemlights/mate-modem-monitor-applet.24.png b/modemlights/mate-modem-monitor-applet.24.png
new file mode 100644
index 00000000..a1d39a3a
--- /dev/null
+++ b/modemlights/mate-modem-monitor-applet.24.png
Binary files differ
diff --git a/modemlights/mate-modem-monitor-applet.32.png b/modemlights/mate-modem-monitor-applet.32.png
new file mode 100644
index 00000000..11714f6c
--- /dev/null
+++ b/modemlights/mate-modem-monitor-applet.32.png
Binary files differ
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