diff --git a/gui/__init__.py b/gui/__init__.py index 909265c..ecd60d1 100644 --- a/gui/__init__.py +++ b/gui/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2013 Tom Tromey +# Copyright (C) 2013, 2015 Tom Tromey # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,3 +20,4 @@ self_dir = os.path.abspath(os.path.dirname(__file__)) # Import anything that defines a command or parameter. import gui.commands import gui.toplevel +import gui.framecache diff --git a/gui/commands.py b/gui/commands.py index 5aa89e3..6538516 100644 --- a/gui/commands.py +++ b/gui/commands.py @@ -1,4 +1,4 @@ -# Copyright (C) 2012, 2013 Tom Tromey +# Copyright (C) 2012, 2013, 2015 Tom Tromey # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -206,7 +206,10 @@ class TestCommand(gdb.Command): TestCommand(True) TestCommand(False).invoke('', 0) -if _can_override: +# See framecache.py - we prefer the before_prompt event if it exists; +# but otherwise try the overriding approach. Both of these rely on a +# hacked gdb :-( +if _can_override and not hasattr(gdb.events, 'before_prompt'): class Overrider(gdb.Command): def __init__(self, name, event): super(Overrider, self).__init__(name, gdb.COMMAND_DATA) diff --git a/gui/framecache.py b/gui/framecache.py new file mode 100644 index 0000000..faa8d4f --- /dev/null +++ b/gui/framecache.py @@ -0,0 +1,34 @@ +# Copyright (C) 2015 Tom Tromey + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import gdb +import gui.events + +_last_selected_frame = None + +def check_frame(): + global _last_selected_frame + sel = None + try: + sel = gdb.selected_frame() + except: + pass + if _last_selected_frame is not sel: + _last_selected_frame = sel + gui.events.frame_changed.post() + +# See my gdb branch on github. +if hasattr(gdb.events, 'before_prompt'): + gdb.events.before_prompt.connect(check_frame)