initial commit
authorPaul Philippov <paul@ppds.ws>
Wed, 4 Feb 2009 12:33:31 +0000 (14:33 +0200)
committerPaul Philippov <paul@ppds.ws>
Wed, 4 Feb 2009 12:33:31 +0000 (14:33 +0200)
src/Makefile [new file with mode: 0644]
src/beats-applet.desktop [new file with mode: 0644]
src/beats-applet.py [new file with mode: 0644]
src/beats.svg [new file with mode: 0644]
src/beats128.png [new file with mode: 0644]
src/beats26.png [new file with mode: 0644]
src/description.txt [new file with mode: 0644]
src/prefs.glade [new file with mode: 0644]

diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..71bf810
--- /dev/null
@@ -0,0 +1,100 @@
+# Example custom makefile for creating .deb without using dpkg tools.
+#
+# Author: Tim Wegener <twegener@madabar.com>
+#
+# This requires deb_hand.mak
+
+# Sources:
+# SOURCE_DIR - directory containing files to be packaged
+# ICON_SOURCE - 26x26 icon file for maemo
+# description.txt - description with summary on first line
+# preinst, postinst, prerm, postrm - optional control shell scripts
+
+PACKAGE = beats-applet
+VERSION = 0.1
+SECTION = user/other
+PRIORITY = optional
+ARCH = armel
+DEPENDS = python2.5, python2.5-gobject, python2.5-gtk2, python2.5-osso, python2.5-hildon, python2.5-mutagen
+MAINTAINER = Paul Philippov <paul@ppds.ws>
+
+SOURCE_DIR = .
+PACKAGE_DIR ?= ..
+ICON_SOURCE = ${SOURCE_DIR}/beats26.png
+CTRL_EXTRAS ?= ${wildcard preinst postinst prerm postrm}
+
+${PACKAGE_DIR}/data: ${SOURCE_DIR}
+       rm -rf $@
+       mkdir -p $@
+       mkdir -p $@/usr/lib/hildon-desktop
+       cp ${SOURCE_DIR}/beats-applet.py $@/usr/lib/hildon-desktop/
+       mkdir -p ${PACKAGE_DIR}/data/usr/share/applications/hildon-home
+       cp ${SOURCE_DIR}/beats-applet.desktop $@/usr/share/applications/hildon-home/
+       mkdir -p ${PACKAGE_DIR}/data/usr/share/pixmaps
+       cp ${SOURCE_DIR}/beats26.png $@/usr/share/pixmaps/beats.png
+       mkdir -p ${PACKAGE_DIR}/data/usr/share/icons/hicolor/26x26/apps
+       cp ${SOURCE_DIR}/beats26.png $@/usr/share/icons/hicolor/26x26/apps/beats.png
+       mkdir -p ${PACKAGE_DIR}/data/usr/share/icons/hicolor/128x128/apps
+       cp ${SOURCE_DIR}/beats128.png $@/usr/share/icons/hicolor/128x128/apps/beats.png
+       mkdir -p ${PACKAGE_DIR}/data/usr/share/icons/hicolor/scalable/apps
+       cp ${SOURCE_DIR}/beats.svg $@/usr/share/icons/hicolor/scalable/apps
+       mkdir -p ${PACKAGE_DIR}/data/usr/share/beats
+       cp ${SOURCE_DIR}/prefs.glade $@/usr/share/beats/
+
+${PACKAGE_DIR}/control: ${PACKAGE_DIR}/data ${CTRL_EXTRAS} description.txt ${ICON_SOURCE}
+       rm -rf $@
+       mkdir -p $@
+
+ifneq (${CTRL_EXTRAS},)
+       cp ${CTRL_EXTRAS} $@
+endif
+
+       echo "Package: ${PACKAGE}" > $@/control
+       echo "Version: ${VERSION}" >> $@/control
+       echo "Section: ${SECTION}" >> $@/control
+       echo "Priority: ${PRIORITY}" >> $@/control
+       echo "Architecture: ${ARCH}" >> $@/control
+       echo "Depends: ${DEPENDS}" >> $@/control
+       echo "Installed-Size: ${shell du -s ${PACKAGE_DIR}/data | cut -f1}" >> $@/control
+       echo "Maintainer: ${MAINTAINER}" >> $@/control
+       echo -n "Description:" >> $@/control
+       cat description.txt | gawk '{print " "$$0;}' >> $@/control
+
+ifneq (${ICON_SOURCE},)
+       echo "Maemo-Icon-26:" >> $@/control
+       base64 ${ICON_SOURCE} | gawk '{print " "$$0;}' >> $@/control
+endif
+
+       cd ${PACKAGE_DIR}/data && find . -type f -exec md5sum {} \; | sed -e 's| \./||' > $@/md5sums
+
+${PACKAGE_DIR}/debian-binary:
+       echo "2.0" > $@
+
+${PACKAGE_DIR}/build: ${PACKAGE_DIR}/debian-binary ${PACKAGE_DIR}/control
+       rm -rf $@
+       mkdir -p $@
+
+       cp ${PACKAGE_DIR}/debian-binary $@/
+       cd ${PACKAGE_DIR}/control && tar czvf $@/control.tar.gz ./*
+       cd ${PACKAGE_DIR}/data    && tar czvf $@/data.tar.gz ./*
+
+${PACKAGE_DIR}/${PACKAGE}_${VERSION}_${ARCH}.deb: ${PACKAGE_DIR}/build
+       ar -rc $@tmp $</debian-binary $</control.tar.gz $</data.tar.gz
+       sed -e 's|^\([^/]\+\)/ \(.*\)|\1  \2|g' $@tmp > $@fail
+       rm -f $@tmp
+       mv $@fail $@
+
+.PHONY: data
+data: ${PACKAGE_DIR}/data
+
+.PHONY: control
+control: ${PACKAGE_DIR}/control
+
+.PHONY: build
+build: ${PACKAGE_DIR}/build
+
+.PHONY: deb
+deb: ${PACKAGE_DIR}/${PACKAGE}_${VERSION}_${ARCH}.deb
+
+clobber:
+       rm -rf ${PACKAGE_DIR}/debian_binary ${PACKAGE_DIR}/control ${PACKAGE_DIR}/data ${PACKAGE_DIR}/build
diff --git a/src/beats-applet.desktop b/src/beats-applet.desktop
new file mode 100644 (file)
index 0000000..ee76976
--- /dev/null
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Beats (Swatch Internet Time)
+Comment=Swatch Internet Time applet
+Type=python
+X-Path=beats-applet
diff --git a/src/beats-applet.py b/src/beats-applet.py
new file mode 100644 (file)
index 0000000..0dbbc7d
--- /dev/null
@@ -0,0 +1,200 @@
+'''
+Beats
+2009 (c) Paul Philippov <paul@ppds.ws>
+Swatch Internet Time applet for Hildon
+'''
+import gtk
+from gtk import gdk
+import hildondesktop
+import cairo
+import gobject
+import pango
+import time
+from datetime import timedelta, datetime, tzinfo
+from ConfigParser import *
+
+Pi = 3.14
+Beat = 86.4
+
+class BeatsApplet(hildondesktop.HomeItem):
+
+   def __init__(self):
+      hildondesktop.HomeItem.__init__(self)
+
+      self.timer = None
+
+      self.connect("settings", self._DoSettings)
+      self.connect("expose-event", self.expose)
+      self.connect("screen-changed", self.screen_changed)
+      self.connect("unrealize", self.unrealize)
+      self.connect("background", self.set_timer, False)
+      self.connect("foreground", self.set_timer, True)
+
+      self.label = gtk.Label()
+      self.label.set_use_markup(True)
+      self.label.set_markup('@---.-')
+      self.add(self.label)
+      self.set_size_request(-1, -1)
+
+      self.redraw()
+
+      self.inbackground = False
+      self.set_timer(self, True)
+      self.show_all()
+
+   def redraw(self):
+      self.set_resize_type(hildondesktop.HOME_ITEM_RESIZE_NONE)
+      self.label.modify_font(pango.FontDescription(self._prefRead('font')))
+#      self.label.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._prefRead('background')))
+      self.label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._prefRead('foreground')))
+      self.label.set_padding(15, 20)
+      self.label.set_size_request(-1, -1)
+      self.set_size_request(-1, -1)
+
+   def expose(self, widget, event):
+      width, height = self.allocation[2], self.allocation[3]
+      radius = min(15, width/2, height/2)
+      x0 = 0; x1 = x0 + width
+      y0 = 0; y1 = y0 + height
+
+      cr = widget.window.cairo_create()
+      cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)
+      cr.set_operator(cairo.OPERATOR_SOURCE)
+      cr.paint()
+
+      cr.move_to(x0, y0 + radius); cr.arc(x0 + radius, y0 + radius, radius, Pi, 1.5 * Pi)
+      cr.line_to(x1 - radius, y0); cr.arc(x1 - radius, y0 + radius, radius, 1.5 * Pi, 0.0)
+      cr.line_to(x1, y1 - radius); cr.arc(x1 - radius, y1 - radius, radius, 0.0, 0.5 * Pi)
+      cr.line_to(x0 + radius, y1); cr.arc(x0 + radius, y1 - radius, radius, 0.5 * Pi, Pi)
+      cr.close_path()
+      bg_color = gtk.gdk.color_parse(self._prefRead('background'))
+      cr.set_source_rgba(
+         bg_color.red   / 65535.0,
+         bg_color.green / 65535.0,
+         bg_color.blue  / 65535.0,
+         float(self._prefRead('background_alpha')) / 65535.0
+      )
+      cr.fill()
+      return False
+
+   def screen_changed(self, widget, old_screen=None):
+      screen = self.get_screen()
+      self.set_colormap(screen.get_rgba_colormap())
+      return False
+
+   def unrealize(self, widget, date=None):
+      self._prefSave('pos_x', self.allocation[0])
+      self._prefSave('pos_y', self.allocation[1])
+      if self.timer:
+         v = gobject.source_remove(self.timer)
+         self.timer = None
+
+   def set_timer(self, widget, on):
+      if self.timer != None:
+         gobject.source_remove(self.timer)
+      if on:
+         self.timer = gobject.timeout_add(Beat * 100, self.update)
+         self.update()
+
+   def update(self):
+      btm_now = datetime.utcnow() + timedelta(hours=1)
+      delta = timedelta(
+         hours = btm_now.hour,
+         minutes = btm_now.minute,
+         seconds = btm_now.second,
+         microseconds = btm_now.microsecond
+      )
+      beats = (delta.seconds + delta.microseconds / 1000000.0) / Beat
+      self.label.set_markup("@%05.1f" % beats)
+      self.label.set_size_request(-1, -1)
+      self.set_size_request(-1, -1)
+      return not self.inbackground
+
+   def _DoSettings(self, widget, data=None):
+      menuitem = gtk.MenuItem("Beats (Swatch Internet Time)")
+      menuitem.connect_object("activate", self._ShowSettings, None)
+      return menuitem
+
+   def _ShowSettings(self, widget, data=None):
+      import gtk.glade
+      self._widgetTree = gtk.glade.XML('/usr/lib/beats-applet/prefs.glade')
+      self._window = self._widgetTree.get_widget("prefs")
+      self._widgetTree.get_widget("color_background").set_current_color(gtk.gdk.color_parse(self._prefRead('background')))
+      self._widgetTree.get_widget("color_background").set_has_opacity_control(True)
+      self._widgetTree.get_widget("color_background").set_current_alpha(int(self._prefRead('background_alpha')))
+      self._widgetTree.get_widget("color_foreground").set_current_color(gtk.gdk.color_parse(self._prefRead('foreground')))
+      self._widgetTree.get_widget("color_foreground").set_current_alpha(int(self._prefRead('foreground_alpha')))
+      self._widgetTree.get_widget("color_foreground").set_has_opacity_control(True)
+      self._widgetTree.get_widget("fontselection").set_font_name(self._prefRead('font'))
+      callbackMapping = {
+         "on_bCancel_clicked": self._cancel,
+         "on_bValidate_clicked": self._validate,
+      }
+      self._widgetTree.signal_autoconnect(callbackMapping)
+      self._window.connect("delete-event", self._closebox)
+      self._window.show()
+      return True
+
+   def _color_to_string(self, c):
+      t = "#"
+      if len(hex(c.red)[2:4])==1:
+         t = t+'0'+hex(c.red)[2:4]
+      else:
+         t = t+hex(c.red)[2:4]
+      if len(hex(c.green)[2:4])==1:
+         t = t+'0'+hex(c.green)[2:4]
+      else:
+         t = t+hex(c.green)[2:4]
+      if len(hex(c.blue)[2:4])==1:
+         t = t+'0'+hex(c.blue)[2:4]
+      else:
+         t = t+hex(c.blue)[2:4]
+      return t
+
+   def _validate(self, widget, *data):
+      self._prefSave('background', self._color_to_string(self._widgetTree.get_widget("color_background").get_current_color()))
+      self._prefSave('foreground', self._color_to_string(self._widgetTree.get_widget("color_foreground").get_current_color()))
+      self._prefSave('background_alpha', str(self._widgetTree.get_widget("color_background").get_current_alpha()))
+      self._prefSave('foreground_alpha', str(self._widgetTree.get_widget("color_foreground").get_current_alpha()))
+      self._prefSave('font', self._widgetTree.get_widget("fontselection").get_font_name())
+      self._window.destroy()
+
+   def _cancel(self, widget, *data):
+      self._window.destroy()
+
+   def _closebox(self, widget, *data):
+      self._window.destroy()
+
+   def _prefRead(self, key):
+      default = {
+         'background':'#000000',
+         'background_alpha':'32767',
+         'foreground':'#FFFFFF',
+         'foreground_alpha':'65535',
+         'font':'Sans 16',
+         'pos_x':'0',
+         'pos_y':'0'
+      }
+      c = ConfigParser(default)
+      c.read('/home/user/.beats')
+      return c.get("DEFAULT", key)
+
+   def _prefSave(self, key, value):
+      default = {
+         'background':'#000000',
+         'background_alpha':'32767',
+         'foreground':'#FFFFFF',
+         'foreground_alpha':'65535',
+         'font':'Sans 16',
+      }
+      c = ConfigParser(default)
+      c.read('/home/user/.beats')
+      c.set('DEFAULT', key, value)
+      fp = open('/home/user/.beats', 'w')
+      c.write(fp)
+      fp.close()
+      self.redraw()
+
+def hd_plugin_get_objects():
+   plugin = BeatsApplet()
+   return [plugin]
diff --git a/src/beats.svg b/src/beats.svg
new file mode 100644 (file)
index 0000000..500315e
--- /dev/null
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="256"
+   height="256"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="beats-applet.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0"
+   inkscape:export-filename="beats-applet.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="55.849243"
+     inkscape:cy="128"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1440"
+     inkscape:window-height="824"
+     inkscape:window-x="0"
+     inkscape:window-y="30">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2393"
+       visible="true"
+       enabled="true" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="300,437.14286"
+       id="guide2395" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="362.85714,560"
+       id="guide2397" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <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
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-22.079616,-21.32743)">
+    <g
+       id="g2434"
+       transform="matrix(1.6269966,0,0,1.6269966,-798.22694,939.58294)">
+      <text
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/paul/path2406.png"
+         id="text2383"
+         y="-435.71429"
+         x="582.90137"
+         style="font-size:50.34415054px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#999999;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:181.23893738px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#999999;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+           y="-435.71429"
+           x="582.90137"
+           id="tspan2385"
+           sodipodi:role="line">@</tspan></text>
+      <rect
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/paul/path2406.png"
+         inkscape:transform-center-x="18.435848"
+         inkscape:transform-center-y="-10.462183"
+         transform="matrix(0.8697152,0.4935539,-0.4935539,0.8697152,0,0)"
+         y="-713.30994"
+         x="213.21997"
+         height="10"
+         width="67.588791"
+         id="rect2402"
+         style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <rect
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/paul/path2406.png"
+         transform="matrix(0.7071068,-0.7071068,0.7071068,0.7071068,0,0)"
+         y="63.740677"
+         x="674.27686"
+         height="10"
+         width="95"
+         id="rect2404"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         transform="matrix(0.6,0,0,0.7500011,408.25714,-851.98646)"
+         d="M 296,488.36218 A 5,4 0 1 1 286,488.36218 A 5,4 0 1 1 296,488.36218 z"
+         sodipodi:ry="4"
+         sodipodi:rx="5"
+         sodipodi:cy="488.36218"
+         sodipodi:cx="291"
+         id="path2406"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+    </g>
+  </g>
+</svg>
diff --git a/src/beats128.png b/src/beats128.png
new file mode 100644 (file)
index 0000000..935da04
Binary files /dev/null and b/src/beats128.png differ
diff --git a/src/beats26.png b/src/beats26.png
new file mode 100644 (file)
index 0000000..b0cf02c
Binary files /dev/null and b/src/beats26.png differ
diff --git a/src/description.txt b/src/description.txt
new file mode 100644 (file)
index 0000000..eb1f4c8
--- /dev/null
@@ -0,0 +1,7 @@
+Swatch beats plugin for Hildon Desktop
+A small cairo Swatch Internet Time applet for Hildon Desktop.
+Swatch Internet Time was a decimal time concept introduced
+in 1998 by the Swatch corporation as an alternative, decimal
+measure of time. The goals was to simplify the way people in
+different time zones communicate about time, by eliminating
+time zones altogether.
diff --git a/src/prefs.glade b/src/prefs.glade
new file mode 100644 (file)
index 0000000..3f50cd0
--- /dev/null
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.5 on Tue Feb  3 05:33:11 2009 -->
+<glade-interface>
+  <widget class="GtkWindow" id="prefs">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="resizable">False</property>
+    <property name="modal">True</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ALWAYS</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <widget class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <child>
+          <widget class="GtkNotebook" id="notebook1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="scrollable">True</property>
+            <child>
+              <widget class="GtkHBox" id="hbColorBG">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <widget class="GtkColorSelection" id="color_background">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="homogeneous">True</property>
+                    <property name="has_palette">True</property>
+                    <property name="has_opacity_control">True</property>
+                    <property name="current_color">#000000000000</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">Background</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbColorFG">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <widget class="GtkColorSelection" id="color_foreground">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="homogeneous">True</property>
+                    <property name="has_palette">True</property>
+                    <property name="has_opacity_control">True</property>
+                    <property name="current_color">#000000000000</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">Foreground</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbFonts">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <widget class="GtkFontSelection" id="fontselection">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="spacing">8</property>
+                    <property name="preview_text">@931.42</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">Font</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="vbAbout">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkImage" id="image1">
+                    <property name="visible">True</property>
+                    <property name="ypad">40</property>
+                    <property name="pixbuf">beats.png</property>
+                    <property name="icon_size">0</property>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label8">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Beats v0.1&lt;/b&gt;
+Swatch Internet Time</property>
+                    <property name="use_markup">True</property>
+                    <property name="justify">GTK_JUSTIFY_CENTER</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLinkButton" id="linkbutton1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="has_tooltip">True</property>
+                    <property name="label" translatable="yes">beatswatch-maemo.googlecode.com</property>
+                    <property name="relief">GTK_RELIEF_NONE</property>
+                    <property name="response_id">0</property>
+                    <property name="uri">http://beatswatch-maemo.googlecode.com/</property>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label7">
+                    <property name="visible">True</property>
+                    <property name="ypad">8</property>
+                    <property name="label" translatable="yes">2009 Paul Philippov</property>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="blAbout">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">About</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="position">3</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="hbox9">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkButton" id="bCancel1">
+                <property name="visible">True</property>
+                <property name="response_id">0</property>
+                <signal name="clicked" handler="on_bCancel_clicked"/>
+                <child>
+                  <widget class="GtkImage" id="image9">
+                    <property name="width_request">128</property>
+                    <property name="height_request">42</property>
+                    <property name="visible">True</property>
+                    <property name="stock">gtk-go-back</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkButton" id="bOK1">
+                <property name="visible">True</property>
+                <property name="response_id">0</property>
+                <signal name="clicked" handler="on_bValidate_clicked"/>
+                <child>
+                  <widget class="GtkImage" id="imgApply">
+                    <property name="width_request">128</property>
+                    <property name="height_request">42</property>
+                    <property name="visible">True</property>
+                    <property name="stock">gtk-apply</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>