diff --git a/gui/source.py b/gui/source.py index 848c0a3..49b1081 100644 --- a/gui/source.py +++ b/gui/source.py @@ -36,6 +36,9 @@ class BufferManager: self.lang_manager = None gui.params.source_theme.set_buffer_manager(self) gui.events.location_changed.connect(self._location_changed) + # FIXME - emit a warning if this isn't available. + if hasattr(gdb.events, 'clear_objfiles'): + gdb.events.clear_objfiles.connect(self._clear_objfiles) def release_buffer(self, buff): # FIXME: we should be smart about buffer caching. @@ -113,6 +116,16 @@ class BufferManager: gui.startup.send_to_gtk(lambda: self.update_breakpoint_location(loc, is_set)) + @in_gtk_thread + def _gtk_clear_objfiles(self): + for window in gui.toplevel.state.windows(): + window.clear_source() + self.buffers = {} + + @in_gdb_thread + def _clear_objfiles(self, ignore): + gui.startup.send_to_gtk(self._gtk_clear_objfiles) + buffer_manager = BufferManager() # Return (FRAME, SYMTAB, FILE, LINE) for the selected frame, or, if @@ -178,6 +191,8 @@ class LRUHandler: def _connect_events(self): gdb.events.stop.connect(self.on_event) gui.events.frame_changed.connect(self.on_event) + if hasattr(gdb.events, 'new_objfile'): + gdb.events.new_objfile.connect(self._new_objfile) @in_gdb_thread def _disconnect_events(self): @@ -231,6 +246,11 @@ class LRUHandler: filename, lineno)) + @in_gdb_thread + def _new_objfile(self, event): + if len(gdb.objfiles()) == 1: + self.on_event() + lru_handler = LRUHandler() BUTTON_NAMES = ["step", "next", "continue", "finish", "stop", "up", "down"] @@ -349,3 +369,9 @@ class SourceWindow(gui.updatewindow.UpdateWindow): @in_gtk_thread def set_tab_width(self, width): self.view.set_tab_width(width) + + @in_gtk_thread + def clear_source(self): + old_buffer = self.view.get_buffer() + self.view.set_buffer(None) + buffer_manager.release_buffer(old_buffer) diff --git a/gui/toplevel.py b/gui/toplevel.py index f33e4fa..f52d2f0 100644 --- a/gui/toplevel.py +++ b/gui/toplevel.py @@ -189,3 +189,7 @@ class Toplevel(object): @in_gtk_thread def set_tab_width(self, width): pass + + @in_gtk_thread + def clear_source(self): + pass