びんじょうしてみました

Pygameを使ってFeedタイトルを電光掲示板っぽく
http://d.hatena.ne.jp/hakobe932/20061103/1162574853

に、タイトルクリックでウェブブラウザで表示する機能を追加しました。
追加部分はかなりかっこわるいソースですが....

以下、パッチ。

--- pygamefeed.py.org   2006-11-16 00:29:32.000000000 +0900
+++ pygamefeed.py       2006-11-16 00:31:22.000000000 +0900
@@ -4,6 +4,7 @@
 import sys
 import feedparser
 import random
+import webbrowser
 import pygame
 from pygame.locals import *
 
@@ -14,7 +15,7 @@
 FEED_LIMIT   = 10
 
 class ScrollText(pygame.sprite.Sprite):
-    def __init__(self, text, position = (0,0)):
+    def __init__(self, text, url, position = (0,0)):
         pygame.sprite.Sprite.__init__(self)
 
         font = pygame.font.Font(FONT_PATH, 32)
@@ -28,6 +29,7 @@
         self.speed = random.choice([-1, 1]) * random.randint(1,5)
 
         self.rect.topleft = position
+        self.url = url
 
     def update(self):
         self.rect = self.rect.move(self.speed, 0)
@@ -45,6 +47,12 @@
         titles.append(entry.title)
     return titles;
 
+def get_urls_from(url):
+    feed = feedparser.parse(url)
+    urls = []
+    for entry in feed['entries']:
+        urls.append(entry.link)
+    return urls
 
 def main():
     pygame.init()
@@ -57,15 +65,18 @@
         feed_url = 'http://b.hatena.ne.jp/hotentry?mode=rss'
         
     feed_titles = get_titles_from(feed_url)
+    feed_urls   = get_urls_from(feed_url)
 
     text_group = pygame.sprite.Group()
     count = 0
+    texts = []
     for feed_title in feed_titles:
         text = ScrollText(
-            feed_title,
+            feed_title, feed_urls[count],
             (random.randint(0,SCREEN_WIDTH), 10 + 40 * count)
         )
         text_group.add(text)
+        texts.append(text)
 
         count += 1
         if count > FEED_LIMIT:
@@ -80,6 +91,12 @@
             if (event.type == QUIT
                or (event.type == KEYDOWN and event.key == K_ESCAPE)):
                 return
+            if event.type == MOUSEBUTTONDOWN:
+                for t in texts:
+                    mouse_pos = pygame.mouse.get_pos()
+                    p = pygame.Rect(mouse_pos[0], mouse_pos[1], 1, 1)
+                    if t.rect.colliderect(p):
+                        webbrowser.open(t.url)
 
         screen.fill( (0,0,0) )

以下のコマンドでパッチ適応できます。

 $ patch orignalfile patchfile