diff --git a/gui/display.py b/gui/display.py index 1325cca..00b0cc5 100644 --- a/gui/display.py +++ b/gui/display.py @@ -56,9 +56,6 @@ class DisplayWindow(gui.updatewindow.UpdateWindow): if self.diff: self.tag = self.buffer.create_tag('new', foreground = 'red') - self.update_title() - self.window.show() - def _update(self, text): self.buffer.delete(self.buffer.get_start_iter(), self.buffer.get_end_iter()) diff --git a/gui/logwindow.py b/gui/logwindow.py index 9a74ce0..43ea1c2 100644 --- a/gui/logwindow.py +++ b/gui/logwindow.py @@ -27,16 +27,16 @@ default_log_window = None class LogWindow(gui.toplevel.Toplevel): def __init__(self): - super(LogWindow, self).__init__('log') global default_log_window if default_log_window is not None: default_log_window.default = '' default_log_window = self # For the window title. self.default = ' [Default]' - gui.startup.send_to_gtk(self._initialize) + super(LogWindow, self).__init__('log') - def _initialize(self): + @in_gtk_thread + def gtk_initialize(self): builder = gui.startup.create_builder('logwindow.xml') builder.connect_signals(self) @@ -45,9 +45,6 @@ class LogWindow(gui.toplevel.Toplevel): self.view.modify_font(gui.params.font_manager.get_font()) self.buffer = builder.get_object('buffer') - self.update_title() - self.window.show() - @in_gtk_thread def set_font(self, font): self.view.modify_font(Pango.FontDescription(font_name)) diff --git a/gui/source.py b/gui/source.py index ce14d41..7a488ee 100644 --- a/gui/source.py +++ b/gui/source.py @@ -66,7 +66,8 @@ class BufferManager: self.lang_manager = GtkSource.LanguageManager.get_default() buff = GtkSource.Buffer() - buff.set_language(self.lang_manager.guess_language(filename)) + if filename: + buff.set_language(self.lang_manager.guess_language(filename)) buff.set_style_scheme(gui.params.source_theme.get_scheme()) buff.begin_not_undoable_action() try: @@ -161,10 +162,8 @@ class LRUHandler: @in_gdb_thread def new_source_window(self): - loc = get_current_location() - if loc[2] is not None: - self.work_location = loc - SourceWindow() + self.work_location = get_current_location() + SourceWindow() @in_gdb_thread def on_event(self, *args): @@ -283,9 +282,6 @@ class SourceWindow(gui.updatewindow.UpdateWindow): lru_handler.add(self) - self.update_title() - self.window.show() - @in_gtk_thread def _update_buttons(self, running): for button in BUTTON_NAMES: diff --git a/gui/toplevel.py b/gui/toplevel.py index b5c9d3a..d08eb35 100644 --- a/gui/toplevel.py +++ b/gui/toplevel.py @@ -19,6 +19,7 @@ import gdb import gui.gdbutil import gui.params import gui.startup +import gui.storage import threading from gi.repository import Pango @@ -31,16 +32,33 @@ class _ToplevelState(object): self.toplevel_lock = threading.Lock() self.next_toplevel = 1 self.toplevels = {} + self.byclass = {} - def add(self, obj): + def add(self, obj, window_type): with self.toplevel_lock: obj.number = self.next_toplevel self.next_toplevel = self.next_toplevel + 1 self.toplevels[obj.number] = obj + # Each window also has a window number specific to its + # type. Compute this here. + if window_type not in self.toplevels: + self.byclass[window_type] = [] + found = None + for num in range(len(self.byclass[window_type])): + if self.byclass[window_type][num] is None: + found = num + break + if found is None: + self.byclass[window_type].append(obj) + found = len(self.byclass[window_type]) + else: + self.byclass[found] = obj + obj.type_number = found def remove(self, obj): with self.toplevel_lock: del self.toplevels[obj.number] + self.byclass[obj.type_number] = None def get(self, winno): window = None @@ -111,10 +129,38 @@ state = _ToplevelState() class Toplevel(object): def __init__(self, window_type): - state.add(self) + state.add(self, window_type) # The subclass must set this. self.window = None self.window_type = window_type + self.storage_name = window_type + '-' + str(self.type_number) + '-geom' + gui.startup.send_to_gtk(self._do_gtk_initialize) + + @in_gtk_thread + def gtk_initialize(self): + """Subclasses should implement this method to do initialization + in the Gtk thread.""" + pass + + @in_gtk_thread + def _do_gtk_initialize(self): + self.gtk_initialize() + self.window.connect('configure-event', self._on_resize) + geom = gui.storage.storage_manager.get(self.storage_name) + if geom: + self.window.parse_geometry(geom) + self.update_title() + self.window.show() + + @in_gdb_thread + def _save_size(self, geom): + gui.storage.storage_manager.set(self.storage_name, geom) + + @in_gtk_thread + def _on_resize(self, widget, event): + geom = '%dx%d+%d+%d' % (event.width, event.height, event.x, event.y) + gdb.post_event(lambda: self._save_size(geom)) + return False def destroy(self): state.remove(self) diff --git a/gui/updatewindow.py b/gui/updatewindow.py index e420bdc..5a07e77 100644 --- a/gui/updatewindow.py +++ b/gui/updatewindow.py @@ -29,17 +29,10 @@ class UpdateWindow(Toplevel): def __init__(self, window_type): super(UpdateWindow, self).__init__(window_type) - gui.startup.send_to_gtk(self.gtk_initialize) self._connect_events() # Display the data now. self.on_event() - @in_gtk_thread - def gtk_initialize(self): - """Subclasses should implement this method to do initialization - in the Gtk thread.""" - pass - # FIXME: really ought to be passing in an event here. @in_gdb_thread def on_event(self):