14 class XKCDha(hildondesktop.HomeItem):
16 image_dir = "/home/user/MyDocs/.images/xkcdha/"
17 icons_dir = "/usr/share/xkcdha/icons/"
19 def __init__(self, max_height, max_width):
22 hbox.pack_start(gtk.Alignment())
23 for name in ("prev", "random", "next"):
26 image.set_from_file(self.icons_dir + "%s.png" % name)
28 box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
29 box.connect("button-press-event", getattr(self, "cb_%s" % name))
30 hbox.pack_start(box, False, False)
31 hbox.pack_start(gtk.Alignment(), False, False, 5)
32 hbox.pack_start(gtk.Alignment())
35 hildondesktop.HomeItem.__init__(self)
36 self.max_height, self.max_width = max_height, max_width
40 self.image = gtk.Image()
44 image_box = gtk.EventBox()
45 image_box.add(self.image)
46 image_box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
47 image_box.connect("button-press-event", self.cb_random)
50 vbox.pack_start(controls())
51 vbox.pack_start(image_box)
52 vbox.pack_start(controls())
57 def set_image(self, number=""):
58 def get_image(number=""):
60 if self.number and number != "random":
63 elif number == "next" and self.next:
65 if number == "prev" and self.prev:
68 print 'number=', number, self.number
70 url = "http://xkcd.com/"
71 if number == 'random':
72 url = "http://dynamic.xkcd.com/comic/random/"
74 url = "http://xkcd.com/%s/" % number
78 content = urllib.urlopen(url).read()
79 img_url = re.search('(http://imgs.xkcd.com/comics/[^"]+)" title="[^"]+"',
81 next = re.search('<a href="([^"]+)" accesskey="n">Next', content).group(1)
82 prev = re.search('<a href="([^"]+)" accesskey="p">< Prev', content).group(1)
83 self.number = re.search(\
84 '<h3>Permanent link to this comic: http://xkcd.com/([^/]+)/</h3>',
86 self.next = self.number
88 self.next = next[1:-1]
90 self.prev = self.number
92 self.prev = prev[1:-1]
94 filename = os.path.join(self.image_dir, self.number + '.png')
95 if not os.path.exists(filename):
96 print 'getting url', img_url, 'to', filename
97 urllib.urlretrieve(img_url, filename)
99 print 'already exists', filename
101 print 'filename:', filename, 'img_url:', img_url
102 print 'next:', next, self.next
103 print 'prev:', prev, self.prev
104 print 'number:', self.number
107 pixbuf = gtk.gdk.pixbuf_new_from_file(get_image(number))
108 scale_y = self.max_height / pixbuf.props.height
109 scale_x = self.max_width / pixbuf.props.width
110 if scale_x > scale_y:
111 newx = int(pixbuf.props.width * scale_y)
112 newy = int(self.max_height)
114 newx = int(self.max_width)
115 newy = int(pixbuf.props.height * scale_x)
117 self.image.set_from_pixbuf(pixbuf.scale_simple(newx, newy, gtk.gdk.INTERP_BILINEAR))
120 def cb_random(self, widget, data = None):
121 self.set_image('random')
123 def cb_next(self, widget, data = None):
124 self.set_image('next')
126 def cb_prev(self, widget, data = None):
127 self.set_image('prev')
129 def hd_plugin_get_objects():
130 return [XKCDha(MAX_HEIGHT, MAX_WIDTH)]
133 main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
134 main_window.set_title("XKCD Home Applet")
135 main_window.connect("destroy", gtk.main_quit)
136 main_window.add(XKCDha(MAX_HEIGHT, MAX_WIDTH))
137 main_window.show_all()
140 if __name__ == "__main__":