OSDN Git Service

not visible at initializing top level window. set default size before showing.
[fukui-no-namari/fukui-no-namari.git] / src / Hage1 / 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
24 import uri_opener
25 from BbsType import bbs_type_judge_uri
26 from BbsType import bbs_type_exception
27 import config
28
29 _gconf_key_windows = "/apps/" + config.APPNAME + "/windows"
30
31 # key: /bbs/board/thread value: toplevel window widget
32 _windows = {}
33
34 def get_window(key):
35     if key in _windows:
36         return _windows[key]["winwrap"]
37     else:
38         return None
39
40 def window_created(key, winwrap):
41     if not key or not winwrap:
42         raise ValueError, "parameter must not be empty"
43
44     if key in _windows:
45         return False
46     handler_id = winwrap.window.connect("destroy", on_window_destroy, key)
47     _windows[key] = {"winwrap": winwrap, "handler_id": handler_id}
48     print "regist to _windows", key
49     return True
50
51 def on_window_destroy(widget, key):
52     if key not in _windows:
53         return
54
55     do_on_window_destroy(key, get_window(key))
56
57     del _windows[key]
58     print "unregist from _windows", key
59
60     if not _windows:
61         print "all window unregist"
62         on_all_window_destroy()
63
64 def on_all_window_destroy():
65     main_quit()
66
67 def thread_idx_updated(thread_uri, idx_dic):
68     if not thread_uri or not idx_dic:
69         raise ValueError, "parameter must not be empty"
70
71     gobject.idle_add(on_thread_idx_updated, thread_uri, idx_dic)
72
73 def on_thread_idx_updated(thread_uri, idx_dic):
74     bbs_type = bbs_type_judge_uri.get_type(thread_uri)
75     winwrap = get_window(bbs_type.get_uri_base())
76     if winwrap:
77         winwrap.on_thread_idx_updated(thread_uri, idx_dic)
78
79 def do_on_window_destroy(uri, winwrap):
80     print "window destroyed:", uri
81     
82 def main_quit():
83     print "session main quit"
84
85     uris = _windows.keys()
86     try:
87         gconf_client = gconf.client_get_default()
88         if uris:
89             gconf_client.set_list(
90                 _gconf_key_windows, gconf.VALUE_STRING, uris)
91             print "save windows", uris
92         else:
93             gconf_client.unset(_gconf_key_windows)
94             print "save no window"
95     except:
96         pass
97
98     for uri, value in _windows.iteritems():
99         value["winwrap"].window.disconnect(value["handler_id"])
100         value["winwrap"].window.destroy()
101         do_on_window_destroy(uri, value["winwrap"])
102
103     gtk.main_quit()
104
105 def restore():
106     gconf_client = gconf.client_get_default()
107
108     uris = gconf_client.get_list(_gconf_key_windows, gconf.VALUE_STRING)
109     for uri in uris:
110         try:
111             uri_opener.open_uri(uri)
112         except bbs_type_exception.BbsTypeError, msg:
113             print msg
114
115 def start():
116     restore()
117     if not _windows:
118         uri_opener.open_uri("http://ex11.2ch.net/morningcoffee/")
119     gtk.main()