From 2d1ea6f90c704ea5ffea28cf3f1d3cef2a215bea Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 29 Apr 2015 11:16:35 -0600 Subject: [PATCH] use before_prompt hook to notify the frame_changed event --- gui/__init__.py | 3 ++- gui/commands.py | 7 +++++-- gui/framecache.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 gui/framecache.py 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)