OSDN Git Service

Window managing auxiliary is added. It shows only same board windows. (#16374)
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / session.py
1 # Copyright (C) 2006 by Aiwota Programmer
2 # aiwotaprog@tetteke.tk
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 import pygtk
19 pygtk.require('2.0')
20 import gtk
21 import gobject
22 import gconf
23 import traceback
24
25 import uri_opener
26 from BbsType import bbs_type_judge_uri
27 from BbsType import bbs_type_exception
28 import config
29 import status_icon
30
31 # key: /bbs/board/thread value: toplevel window widget
32 _windows = {}
33
34
35 class Gconf:
36
37     def __init__(self):
38         self._enable = False
39
40     def _is_enable_to_save(self):
41         return self._enable
42
43     def set_enable(self, enable):
44         self._enable = enable
45
46     def restore(self):
47         self.set_enable(False)
48
49         gconf_client = gconf.client_get_default()
50
51         gconf_key_windows = config.gconf_app_key_base() + "/windows"
52         uris = gconf_client.get_list(gconf_key_windows, gconf.VALUE_STRING)
53         for uri in uris:
54             try:
55                 uri_opener.open_uri(uri)
56             except bbs_type_exception.BbsTypeError, msg:
57                 print msg
58         self.set_enable(True)
59
60     def save(self):
61         if not self._is_enable_to_save():
62             print "save to gconf not enable"
63             return
64         uris = _windows.keys()
65         try:
66             gconf_client = gconf.client_get_default()
67             gconf_key_windows = config.gconf_app_key_base() + "/windows"
68             if uris:
69                 gconf_client.set_list(
70                     gconf_key_windows, gconf.VALUE_STRING, uris)
71                 print "save windows", uris
72             else:
73                 gconf_client.unset(gconf_key_windows)
74                 print "save no window"
75         except:
76             pass
77
78
79 _gconf = Gconf()
80
81
82 def show_window(uri):
83     if uri in _windows:
84         _windows[uri].show()
85
86 def hide_window(uri):
87     if uri in _windows:
88         _windows[uri].hide()
89
90 def get_windows_uris():
91     return _windows.keys()
92
93 def get_window(key):
94     if key in _windows:
95         return _windows[key]
96     else:
97         return None
98
99 def regist(winwrap):
100     if not winwrap:
101         raise ValueError, "parameter must not be empty"
102
103     key = winwrap.get_uri()
104     if not key:
105         raise ValueError, "uri must not be empty"
106
107     if key in _windows:
108         return False
109
110     _windows[key] = winwrap
111     print "regist to _windows", key
112     _gconf.save()
113     return True
114
115 def unregist(winwrap):
116     key = winwrap.get_uri()
117     if key not in _windows:
118         print key, "is not found in _windows"
119         return
120
121     del _windows[key]
122     print "unregist from _windows", key
123
124     if not _windows:
125         print "all window unregist"
126         on_all_window_destroy()
127     else:
128         _gconf.save()
129
130 def on_all_window_destroy():
131     gtk.main_quit()
132
133 def thread_idx_updated(thread_uri, idx_dic):
134     if not thread_uri or not idx_dic:
135         raise ValueError, "parameter must not be empty"
136
137     gobject.idle_add(on_thread_idx_updated, thread_uri, idx_dic)
138
139 def on_thread_idx_updated(thread_uri, idx_dic):
140     bbs_type = bbs_type_judge_uri.get_type(thread_uri)
141     winwrap = get_window(bbs_type.get_uri_base())
142     if winwrap:
143         winwrap.on_thread_idx_updated(thread_uri, idx_dic)
144
145 def main_quit():
146     print "session main quit"
147
148     _gconf.save()
149     _gconf.set_enable(False)
150     temp = dict(_windows)
151     for uri, winwrap in temp.iteritems():
152         try:
153             winwrap.destroy()
154         except:
155             traceback.print_exc()
156
157     # not reach here.
158     gtk.main_quit()
159
160 def start():
161     _gconf.restore()
162     if not _windows:
163         uri_opener.open_uri("http://dubai.2ch.net/morningcoffee/")
164     icon = gtk.status_icon_new_from_icon_name("")
165     icon.connect("popup-menu", status_icon.on_icon_popup_menu)
166     gtk.gdk.threads_enter()
167     gtk.main()
168     gtk.gdk.threads_leave()