14 class XKCDha(hildondesktop.HomeItem):
16 image_dir = "/home/user/MyDocs/.images/xkcdha/"
17 icons_dir = "/usr/share/xkcdha/icons/"
18 connection_required_img = "/usr/share/xkcdha/img/connection_required.png"
20 def __init__(self, max_height, max_width):
23 hbox.pack_start(gtk.Alignment())
24 for name in ("prev", "random", "next"):
27 image.set_from_file(self.icons_dir + "%s.png" % name)
29 box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
30 box.connect("button-press-event", getattr(self, "cb_%s" % name))
31 hbox.pack_start(box, False, False)
32 hbox.pack_start(gtk.Alignment(), False, False, 5)
33 hbox.pack_start(gtk.Alignment())
36 hildondesktop.HomeItem.__init__(self)
37 self.max_height, self.max_width = max_height, max_width
41 self.image = gtk.Image()
45 image_box = gtk.EventBox()
46 image_box.add(self.image)
47 image_box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
48 image_box.connect("button-press-event", self.cb_random)
51 vbox.pack_start(controls())
52 vbox.pack_start(image_box)
53 vbox.pack_start(controls())
58 def set_image(self, number=""):
59 def get_image(number=""):
61 if self.number and number != "random":
64 elif number == "next" and self.next:
66 if number == "prev" and self.prev:
69 print 'number=', number, self.number
71 url = "http://xkcd.com/"
72 if number == 'random':
73 url = "http://dynamic.xkcd.com/comic/random/"
75 url = "http://xkcd.com/%s/" % number
80 content = urllib.urlopen(url).read()
83 filename = os.path.join(self.image_dir, self.number + '.png')
84 if os.path.exists(filename):
86 return self.connection_required_img
88 img_url = re.search('(http://imgs.xkcd.com/comics/[^"]+)" title="[^"]+"',
90 next = re.search('<a href="([^"]+)" accesskey="n">Next', content).group(1)
91 prev = re.search('<a href="([^"]+)" accesskey="p">< Prev', content).group(1)
92 self.number = re.search(\
93 '<h3>Permanent link to this comic: http://xkcd.com/([^/]+)/</h3>',
95 self.next = self.number
97 self.next = next[1:-1]
99 self.prev = self.number
101 self.prev = prev[1:-1]
103 filename = os.path.join(self.image_dir, self.number + '.png')
104 if not os.path.exists(filename):
105 print 'getting url', img_url, 'to', filename
106 urllib.urlretrieve(img_url, filename)
108 print 'already exists', filename
110 print 'filename:', filename, 'img_url:', img_url
111 print 'next:', next, self.next
112 print 'prev:', prev, self.prev
113 print 'number:', self.number
116 pixbuf = gtk.gdk.pixbuf_new_from_file(get_image(number))
117 scale_y = self.max_height / pixbuf.props.height
118 scale_x = self.max_width / pixbuf.props.width
119 if scale_x > scale_y:
120 newx = int(pixbuf.props.width * scale_y)
121 newy = int(self.max_height)
123 newx = int(self.max_width)
124 newy = int(pixbuf.props.height * scale_x)
126 self.image.set_from_pixbuf(pixbuf.scale_simple(newx, newy, gtk.gdk.INTERP_BILINEAR))
129 def cb_random(self, widget, data = None):
130 self.set_image('random')
132 def cb_next(self, widget, data = None):
133 self.set_image('next')
135 def cb_prev(self, widget, data = None):
136 self.set_image('prev')
138 def hd_plugin_get_objects():
139 return [XKCDha(MAX_HEIGHT, MAX_WIDTH)]
142 main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
143 main_window.set_title("XKCD Home Applet")
144 main_window.connect("destroy", gtk.main_quit)
145 main_window.add(XKCDha(MAX_HEIGHT, MAX_WIDTH))
146 main_window.show_all()
149 if __name__ == "__main__":