#!/usr/bin/env python

import gobject
import pygtk
pygtk.require('2.0')
import gtk
from gtk import gdk
import cairo
import datetime
import math
import pickle

name = "koeur"
size = (256,256)

class Koeur(object):
	def __init__(self):
		self.weirdget = gtk.Window()					
		self.weirdget.set_colormap(self.weirdget.get_screen().get_rgba_colormap())	#if this fail , this mean no alpha , it will crash
		(self.w, self.h) = size
		self.weirdget.set_default_size(self.w, self.h)			#(200,200) if not set
		try:
			tmp = open("."+name+".pkl","rb")				#open file if present
			(self.x,self.y) = pickle.load(tmp)				#latest desktop position is serialized here
			self.weirdget.move(self.x,self.y)				#then always start at the same place
		except IOError:
			tmp = open("."+name+".pkl","wb")				#if not present , create it
			(self.x,self.y) = self.weirdget.get_position()			#set default value
			pickle.dump((self.x,self.y),tmp)				#then serialize them in new file
		self.weirdget.set_property("skip-taskbar-hint", True)		#weirdget shouldnt show in taskbar
		self.weirdget.set_property("skip-pager-hint", True)		#weirdget shouldnt show in pager
		self.weirdget.set_title(name)					#weirdget title
		self.weirdget.set_app_paintable(True)
		self.weirdget.set_decorated(False)				#a weirdget is do not use wm decoration
		self.weirdget.stick()						#a weirdget stay on all desktop
		self.weirdget.add_events(gdk.BUTTON_PRESS_MASK)			#allow mouse to click
		self.weirdget.connect('delete-event', gtk.main_quit)		#event quit
		self.weirdget.connect('expose-event', self.draw)		#event draw
		self.weirdget.connect('button-press-event', self.click)		#event click
		gobject.timeout_add(1000, self.update)	#refresh timer
		self.weirdget.show_all()
		gtk.main()

	def update(self):
		#remember position
		(x,y) = self.weirdget.get_position()			#check position		
		if self.x != x and self.y != y:
			self.x,self.y = x,y				#if not the same
			tmp = (x,y)					#replace it
			pickle.dump(tmp, open(".koeur.pkl","wb"))	#and reserialize
		#update draw
		self.weirdget.queue_draw()				#redraw
		return True

	def draw(self,widget, event):
		#(w,h) = widget.get_size()
		w,h = self.w, self.h				#get size for geometry
		toile = widget.window.cairo_create()		#build a cairo canvas
	    	#transparency
		toile.set_source_rgba(1.0, 1.0, 1.0, 0.0)	#set transparent white
		toile.set_operator(cairo.OPERATOR_SOURCE)	
		toile.paint()					#and fill the background
		#cairo draw
		if w < h:
			radius = w/2.0 - 0.8		#calculate radius with the shortest ratio
		else:
			radius = h/2.0 - 0.8
		#	red hearth
		toile.arc(w/4.0, w/4.0, radius/2, 0.9*3.14, 2*3.14)	#draw a hearth
		toile.arc(3*w/4.0, w/4.0, radius/2, 3.14, 2.1*3.14)
		toile.move_to(0.013*w, 0.327*h)
		toile.line_to(w/2.0, h)
		toile.line_to(0.987*w, 0.326*h)
		toile.set_source_rgba(1.0, 0.2, 0.2, 0.7)		#a red hearth
		toile.fill()
		toile.stroke()						#end of polygon
		#drawing line
		time = datetime.datetime.now()
		#	hours
		hour = 1.57+(time.hour*6.28/12.0)+(time.minute*6.28/720.0)
		toile.set_source_rgba(0.7, 0.7, 0.7, 1.0)
		toile.set_line_width(0.1 * radius)
		toile.move_to(w/2.0, h/2.0)
		toile.rel_line_to(-0.5 * radius * math.cos(hour), -0.5 * radius * math.sin(hour))
		toile.stroke()
		#	minutes
		minutes = 1.57+(time.minute*6.28/60.0)+(time.second*6.28/3600)
		toile.set_source_rgba(0.5, 0.5, 0.5, 1.0)
		toile.set_line_width(0.1 * radius)
		toile.move_to(w/2.0, h/2.0)
		toile.rel_line_to(-0.7 * radius * math.cos(minutes), -0.7 * radius * math.sin(minutes))
		toile.stroke()
		#	minutes
		seconds = 1.57+(time.second*6.28/60)
		toile.set_source_rgba(0.3, 0.3, 0.3, 1.0)
		toile.set_line_width(0.1 * radius)
		toile.move_to(w/2.0, h/2.0)
		toile.rel_line_to(-0.9 * radius * math.cos(seconds), -0.9 * radius * math.sin(seconds))
		toile.stroke()
		#	center dot
		toile.set_source_rgba(0.0, 0.0, 0.0, 1.0)
		toile.arc(w/2.0, w/2.0, radius/7, 0, 6.28)
		toile.fill()
		toile.stroke()
		#	telling my girlfriend i love her
		toile.set_source_rgba(1.0, 0.8, 0.8, 0.9)
		toile.select_font_face("Georgia",cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
		toile.set_font_size(0.2*radius)
		toile.move_to(0.25*w,0.4*h)
		toile.show_text("Je t'aime")
		toile.move_to(0.33*w,0.65*h)
		toile.show_text("Myelle")
		#click mask
		clickmask = gtk.gdk.Pixmap(None, w, h, 1)
		clickmaskcairo = clickmask.cairo_create()
		clickmaskcairo.arc(w/4.0, w/4.0, radius/2, 0.9*3.14, 2*3.14)
		clickmaskcairo.arc(3*w/4.0, w/4.0, radius/2, 3.14, 2.1*3.14)
		clickmaskcairo.move_to(0.013*w, 0.327*h)
		clickmaskcairo.line_to(w/2.0, h)
		clickmaskcairo.line_to(0.987*w, 0.326*h)
		clickmaskcairo.fill()
		clickmaskcairo.stroke()
		self.weirdget.input_shape_combine_mask(clickmask, 0, 0)
		return False

	def click(self,widget, event):
		#make it movable
		if event.state & gtk.gdk.SHIFT_MASK:
			self.weirdget.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time)


if __name__ == '__main__':
	koeur = Koeur()

