Initial commit. snett-0.0.1
authorTilman Sauerbeck <tilman@code-monkey.de>
Sat, 11 Mar 2006 19:44:09 +0000 (19:44 +0000)
committerTilman Sauerbeck <tilman@code-monkey.de>
Sat, 11 Mar 2006 19:44:09 +0000 (19:44 +0000)
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
Rakefile [new file with mode: 0644]
bin/snett [new file with mode: 0755]
data/logo.svg [new file with mode: 0644]
data/logo128.png [new file with mode: 0644]
data/logo32.png [new file with mode: 0644]
data/logo64.png [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..5864b3d
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Tilman Sauerbeck (tilman at code-monkey de)
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..77ff64a
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,20 @@
+Copyright (c) 2006 Tilman Sauerbeck (tilman at code-monkey de)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Rakefile b/Rakefile
new file mode 100644 (file)
index 0000000..7d06ba7
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,33 @@
+require "rake/packagetask"
+require "rake/contrib/sshpublisher"
+
+PKG_NAME = "snett"
+PKG_VERSION = File.read("bin/snett").
+              match(/^\s*VERSION = \"(.*)\"\s$/).captures.first
+
+task :install do
+       destdir = ENV["DESTDIR"] || ""
+       prefix = ENV["PREFIX"] || "/usr/local"
+
+       ddir = destdir + prefix + "/bin"
+
+       FileUtils::Verbose.mkdir_p(ddir) unless File.directory?(ddir)
+       FileUtils::Verbose.install("bin/snett", ddir, :mode => 0755)
+
+       ddir = destdir + prefix + "/share/snett"
+
+       FileUtils::Verbose.mkdir_p(ddir) unless File.directory?(ddir)
+       FileUtils::Verbose.install(Dir["data/*"], ddir, :mode => 0644)
+end
+
+Rake::PackageTask.new(PKG_NAME, PKG_VERSION) do |t|
+       t.need_tar_gz = true
+       t.package_files.include("[A-Z]*", "bin/snett", "data/logo*")
+end
+
+task :publish => [:package] do
+       Rake::SshFilePublisher.
+               new("code-monkey.de", ".",
+               "pkg", "#{PKG_NAME}-#{PKG_VERSION}.tar.gz").
+           upload
+end
diff --git a/bin/snett b/bin/snett
new file mode 100755 (executable)
index 0000000..ff053df
--- /dev/null
+++ b/bin/snett
@@ -0,0 +1,277 @@
+#!/usr/bin/env ruby
+
+# vim:syn=ruby
+#
+# Copyright (c) 2006 Tilman Sauerbeck (tilman at code-monkey de)
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+require "gtk2"
+require "xmmsclient"
+require "xmmsclient_glib"
+require "singleton"
+require "pp"
+
+PKG_NAME = "snett"
+DATADIR = "/usr/local/share/#{PKG_NAME}/"
+SIZE = 64
+
+class Gtk::MenuItem
+       def set_callback(meth, args = [])
+               args.unshift(meth)
+
+               signal_connect("button_release_event") do
+                       Snett::Snett.instance.xmms.send(*args)
+                       false
+               end
+       end
+end
+
+class XmmsClient::XmmsClient
+       def playback_next
+               playlist_set_next_rel(1).notifier { playback_tickle }
+       end
+
+       def playback_prev
+               playlist_set_next_rel(-1).notifier { playback_tickle }
+       end
+end
+
+module Snett
+       VERSION = "0.0.1"
+
+       class Snett < Gtk::Window
+               attr_reader :icon, :xmms
+
+               include Singleton
+
+               def initialize
+                       super(Gtk::Window::TOPLEVEL)
+
+                       @menu = nil
+                       @tooltips = Gtk::Tooltips.new
+
+                       @xmms = XmmsClient::XmmsClient.new(PKG_NAME)
+                       @xmms.connect(ENV["XMMS_PATH"])
+                       @xmms.add_to_glib_mainloop
+
+                       @broadcasts = []
+
+                       self.set_title(PKG_NAME)
+
+                       signal_connect("destroy") do
+                               @broadcasts.each { |bc| bc.disconnect }
+
+                               Gtk.main_quit
+                       end
+
+                       self.resizable = false
+                       self.decorated = false
+
+                       @icon = Gdk::Pixbuf.new(DATADIR + "logo#{SIZE}.png")
+
+                       self.resize(@icon.width, @icon.height)
+
+                       #self.colormap = self.screen.rgba_colormap
+
+                       pixmap, mask = @icon.render_pixmap_and_mask(self.colormap, 255)
+                       self.shape_combine_mask(mask, 0, 0)
+
+                       # load icon and put it in an eventbox
+                       event_box = Gtk::EventBox.new.add(Gtk::Image.new(@icon))
+                       event_box.events = Gdk::Event::BUTTON_PRESS_MASK |
+                                          Gdk::Event::BUTTON_RELEASE_MASK
+
+                       event_box.signal_connect("button_release_event") do |_, event|
+                               menu.popup(event) if event.button == 3
+                               false
+                       end
+
+                       event_box.signal_connect("button_press_event") do |_, event|
+                               if event.button == 1
+                                       x, y = Gdk::Display.default.pointer[1, 2]
+                                       self.begin_move_drag(event.button, x, y, event.time)
+                               end
+
+                               false
+                       end
+
+                       @broadcasts << @xmms.broadcast_playback_current_id
+                       @broadcasts.last.notifier(&method(:on_playback_current_id))
+
+                       @xmms.playback_current_id.
+                             notifier(&method(:on_playback_current_id))
+
+                       add(event_box)
+               end
+
+               private
+               def menu
+                       @menu ||= Menu.new
+               end
+
+               def on_playback_current_id(res)
+                       return if res.value.zero?
+
+                       @xmms.medialib_get_info(res.value).
+                             notifier(&method(:on_mlib_get_info))
+               end
+
+               def on_mlib_get_info(res)
+                       info = res.value[:server]
+
+                       s = "%s - %s" % [info[:artist], info[:title]]
+                       @tooltips.set_tip(self, s, nil)
+               end
+       end
+
+       class Menu < Gtk::Menu
+               def initialize
+                       super
+
+                       [
+                               [Gtk::Stock::MEDIA_PLAY, :playback_start],
+                               [Gtk::Stock::MEDIA_PAUSE, :playback_pause],
+                               [Gtk::Stock::MEDIA_STOP, :playback_stop]
+                       ].each do |(stock, meth)|
+                               item = Gtk::ImageMenuItem.new(stock)
+                               item.set_callback(meth)
+
+                               append(item)
+                       end
+
+                       append(Gtk::SeparatorMenuItem.new)
+
+                       [
+                               [Gtk::Stock::MEDIA_NEXT, :playback_next],
+                               [Gtk::Stock::MEDIA_PREVIOUS, :playback_prev]
+                       ].each do |(stock, meth)|
+                               item = Gtk::ImageMenuItem.new(stock)
+                               item.set_callback(meth)
+
+                               append(item)
+                       end
+
+                       append(Gtk::SeparatorMenuItem.new)
+
+                       [
+                               [Gtk::Stock::OPEN, "Load playlist...", :load],
+                               [Gtk::Stock::ADD, "Append playlist...", :append]
+                       ].each do |(stock, text, sym)|
+                               item = Gtk::ImageMenuItem.new(text)
+                               item.image = Gtk::Image.new(stock, Gtk::IconSize::MENU)
+
+                               item.signal_connect("button_release_event") do
+                                       PlaylistDialog.new(sym).show_all
+                                       false
+                               end
+
+                               append(item)
+                       end
+
+                       item = Gtk::ImageMenuItem.new(Gtk::Stock::CLEAR)
+                       item.set_callback(:playlist_clear)
+
+                       append(item)
+
+                       append(Gtk::SeparatorMenuItem.new)
+
+                       item = Gtk::ImageMenuItem.new(Gtk::Stock::ABOUT)
+                       item.signal_connect("button_release_event") do
+                               props = {
+                                       "name" => PKG_NAME,
+                                       "version" => VERSION,
+                                       "copyright" => "(c) 2006 Tilman Sauerbeck",
+                                       "logo" => Gdk::Pixbuf.new(DATADIR + "logo128.png")
+                               }
+
+                               Gtk::AboutDialog.show(Snett.instance, props)
+                               false
+                       end
+
+                       append(item)
+
+                       item = Gtk::ImageMenuItem.new(Gtk::Stock::QUIT)
+                       item.signal_connect("button_release_event") do
+                               Snett.instance.signal_emit("destroy")
+                               false
+                       end
+
+                       append(item)
+
+                       show_all
+               end
+
+               def popup(event)
+                       super(nil, nil, event.button, event.time)
+               end
+       end
+
+       class PlaylistDialog < Gtk::Dialog
+               def initialize(mode)
+                       super("Playlists", Snett.instance,
+                             Gtk::Dialog::DESTROY_WITH_PARENT | Gtk::Dialog::MODAL,
+                             [Gtk::Stock::OK, Gtk::Dialog::RESPONSE_ACCEPT],
+                                 [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_REJECT])
+
+                       @mode = mode
+
+                       signal_connect("response") do |_, id|
+                               on_ok if id == Gtk::Dialog::RESPONSE_ACCEPT
+                               destroy
+                       end
+
+                       @store = Gtk::ListStore.new(String)
+
+                       @view = Gtk::TreeView.new(@store)
+                       renderer = Gtk::CellRendererText.new
+
+                       col = Gtk::TreeViewColumn.new("Name", renderer, :text => 0)
+                       @view.append_column(col)
+
+                       vbox.add(@view)
+
+                       Snett.instance.xmms.medialib_playlists_list.
+                                           notifier(&method(:on_playlists_list))
+               end
+
+               private
+               def on_playlists_list(res)
+                       res.value.sort.each do |list|
+                               next if list[0, 1] == "_"
+
+                               @store.append[0] = list
+                       end
+               end
+
+               def on_ok
+                       selection = @view.selection
+                       iter = selection.selected
+                       return if iter.nil?
+
+                       Snett.instance.xmms.playlist_clear if @mode == :load
+                       Snett.instance.xmms.medialib_playlist_load(iter[0])
+               end
+       end
+end
+
+Gtk.init
+Snett::Snett.instance.show_all
+Gtk.main
diff --git a/data/logo.svg b/data/logo.svg
new file mode 100644 (file)
index 0000000..0bf779a
--- /dev/null
@@ -0,0 +1,262 @@
+<?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://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg1307"
+   sodipodi:version="0.32"
+   inkscape:version="0.43"
+   sodipodi:docbase="/home/cjay/Projects/affe"
+   sodipodi:docname="affen-icon.svg">
+  <defs
+     id="defs1309">
+    <linearGradient
+       id="linearGradient2202">
+      <stop
+         style="stop-color:#53fff6;stop-opacity:1;"
+         offset="0"
+         id="stop2204" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop2206" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2192">
+      <stop
+         style="stop-color:#3aff34;stop-opacity:1;"
+         offset="0"
+         id="stop2194" />
+      <stop
+         style="stop-color:#3aff34;stop-opacity:0;"
+         offset="1"
+         id="stop2196" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2192"
+       id="radialGradient2198"
+       cx="10.450541"
+       cy="10.613079"
+       fx="10.450541"
+       fy="10.613079"
+       r="7.412169"
+       gradientTransform="matrix(1,-5.507701e-8,-1.498259e-8,0.981927,1.069577,0.547813)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2202"
+       id="radialGradient2208"
+       cx="22.727674"
+       cy="13.916094"
+       fx="22.727674"
+       fy="13.916094"
+       r="2.9023552"
+       gradientTransform="matrix(1.276924,7.108063e-7,-2.394891e-6,4.30235,-6.293784,-45.95583)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2192"
+       id="radialGradient2237"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,-5.507701e-8,-1.498259e-8,0.981927,1.069577,0.547813)"
+       cx="10.450541"
+       cy="10.613079"
+       fx="10.450541"
+       fy="10.613079"
+       r="7.412169" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2202"
+       id="radialGradient2239"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.276924,7.108063e-7,-2.394891e-6,4.30235,-6.293784,-45.95583)"
+       cx="22.727674"
+       cy="13.916094"
+       fx="22.727674"
+       fy="13.916094"
+       r="2.9023552" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="13.156042"
+     inkscape:cx="16.470634"
+     inkscape:cy="15.737933"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="841"
+     inkscape:window-height="650"
+     inkscape:window-x="304"
+     inkscape:window-y="252" />
+  <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" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#5e3c20;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.47739285;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2228"
+       sodipodi:cx="24.960255"
+       sodipodi:cy="7.2183509"
+       sodipodi:rx="4.4205103"
+       sodipodi:ry="5.5814524"
+       d="M 29.380765 7.2183509 A 4.4205103 5.5814524 0 1 1  20.539744,7.2183509 A 4.4205103 5.5814524 0 1 1  29.380765 7.2183509 z"
+       transform="matrix(1.303761,0,0,0.841377,-8.578214,7.792)" />
+    <path
+       transform="matrix(1.23531,0,0,1.833793,-3.76074,-18.59641)"
+       d="M 24.379784 21.998037 A 7.99264 3.750736 0 1 1  8.3945041,21.998037 A 7.99264 3.750736 0 1 1  24.379784 21.998037 z"
+       sodipodi:ry="3.750736"
+       sodipodi:rx="7.99264"
+       sodipodi:cy="21.998037"
+       sodipodi:cx="16.387144"
+       id="path2249"
+       style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75327599;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       sodipodi:type="arc" />
+    <use
+       x="0"
+       y="0"
+       xlink:href="#path2228"
+       id="use2230"
+       transform="matrix(0.930519,0,0,0.999048,-13.73107,-1.919476)"
+       width="32"
+       height="32" />
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#5e3c20;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.61271989;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2226"
+       sodipodi:cx="16.297842"
+       sodipodi:cy="16.237978"
+       sodipodi:rx="9.6000986"
+       sodipodi:ry="13.797351"
+       d="M 25.897941 16.237978 A 9.6000986 13.797351 0 1 1  6.6977434,16.237978 A 9.6000986 13.797351 0 1 1  25.897941 16.237978 z"
+       transform="matrix(1,0,0,0.665911,0.113958,1.960509)" />
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#9c7658;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2232"
+       sodipodi:cx="15.002944"
+       sodipodi:cy="12.7105"
+       sodipodi:rx="3.0363102"
+       sodipodi:ry="4.9116783"
+       d="M 18.039254 12.7105 A 3.0363102 4.9116783 0 1 1  11.966634,12.7105 A 3.0363102 4.9116783 0 1 1  18.039254 12.7105 z"
+       transform="matrix(1.624864,0,0,1.34923,-10.48016,-4.657047)" />
+    <path
+       transform="matrix(1.320297,0,0,0.882114,0.694725,2.658306)"
+       d="M 18.039254 12.7105 A 3.0363102 4.9116783 0 1 1  11.966634,12.7105 A 3.0363102 4.9116783 0 1 1  18.039254 12.7105 z"
+       sodipodi:ry="4.9116783"
+       sodipodi:rx="3.0363102"
+       sodipodi:cy="12.7105"
+       sodipodi:cx="15.002944"
+       id="path2241"
+       style="color:#000000;fill:#9c7658;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#9c7658;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2243"
+       sodipodi:cx="16.387144"
+       sodipodi:cy="21.998037"
+       sodipodi:rx="7.99264"
+       sodipodi:ry="3.750736"
+       d="M 24.379784 21.998037 A 7.99264 3.750736 0 1 1  8.3945041,21.998037 A 7.99264 3.750736 0 1 1  24.379784 21.998037 z"
+       transform="matrix(1.23531,0,0,1.833793,-3.76074,-18.59641)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="mid">
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.43193111;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2264"
+       sodipodi:cx="17.624142"
+       sodipodi:cy="18.110775"
+       sodipodi:rx="2.2759655"
+       sodipodi:ry="1.342236"
+       d="M 19.900107 18.110775 A 2.2759655 1.342236 0 1 1  15.348176,18.110775 A 2.2759655 1.342236 0 1 1  19.900107 18.110775 z"
+       transform="matrix(1.187665,0,0,1.128281,-4.014511,-1.804267)" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750048;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 9.7938385,22.209107 L 23.335051,22.209107"
+       id="path2266" />
+    <rect
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.93749976;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="rect2270"
+       width="4.0936708"
+       height="4.3832722"
+       x="15.325839"
+       y="22.334106"
+       ry="0.6875"
+       rx="0.5" />
+    <rect
+       y="22.209106"
+       x="18.370232"
+       height="3.1937904"
+       width="3.1431065"
+       id="rect2272"
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.8125;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       ry="0.625"
+       rx="0.625" />
+    <rect
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.81250018;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="rect2274"
+       width="3.2454782"
+       height="3.53125"
+       x="11.751606"
+       y="22.271606"
+       ry="0.8125"
+       rx="0.86565632" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="eyes">
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:url(#radialGradient2237);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.58796048;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2190"
+       sodipodi:cx="11.520118"
+       sodipodi:cy="10.969087"
+       sodipodi:rx="3.5721297"
+       sodipodi:ry="5.7600589"
+       d="M 15.092247 10.969087 A 3.5721297 5.7600589 0 1 1  7.947988,10.969087 A 3.5721297 5.7600589 0 1 1  15.092247 10.969087 z"
+       transform="matrix(0.938372,0,0,0.770671,2.755812,3.72269)" />
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:url(#radialGradient2239);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.59321404;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.1101583;stroke-opacity:1"
+       id="path2200"
+       sodipodi:cx="22.727674"
+       sodipodi:cy="13.916094"
+       sodipodi:rx="2.7237489"
+       sodipodi:ry="3.0809617"
+       d="M 25.451423 13.916094 A 2.7237489 3.0809617 0 1 1  20.003926,13.916094 A 2.7237489 3.0809617 0 1 1  25.451423 13.916094 z"
+       transform="matrix(0.91526,0,0,0.776198,-5.879296e-2,2.543973)" />
+  </g>
+</svg>
diff --git a/data/logo128.png b/data/logo128.png
new file mode 100644 (file)
index 0000000..571a87f
Binary files /dev/null and b/data/logo128.png differ
diff --git a/data/logo32.png b/data/logo32.png
new file mode 100644 (file)
index 0000000..b0c5096
Binary files /dev/null and b/data/logo32.png differ
diff --git a/data/logo64.png b/data/logo64.png
new file mode 100644 (file)
index 0000000..80cea9c
Binary files /dev/null and b/data/logo64.png differ