diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-01-18 11:40:45 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-01-18 11:40:45 +0100 |
commit | 11c6ca71ac76e57e68fe334cb2a9effd6c6d444d (patch) | |
tree | 9146a030dd094f317cf777c6a1c6ed6b8376f8eb /src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp | |
parent | a471f54240c1eff7931b7c0c79d8d6da3816ce0b (diff) | |
download | qt-creator-11c6ca71ac76e57e68fe334cb2a9effd6c6d444d.tar.gz |
Debugger[New CDB]: Add support for "Select Widget to Watch".
in stopped state. Add helper for executing calls
to ExtensionContext including recording of output in
OutputCallback. Extend symbol resolution to return addresses
as well since QApplication::widgetAt() is ambiguous and needs
to be called by address. Add 'widgetat' extension command
to return the widget.
Diffstat (limited to 'src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp')
-rw-r--r-- | src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index 706bb055ac..ef3fd00ec0 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -100,6 +100,7 @@ enum Command { CmdStack, CmdShutdownex, CmdAddWatch, + CmdWidgetAt, CmdTest }; @@ -155,6 +156,7 @@ static const CommandDescription commandDescriptions[] = { {"stack","Prints stack in GDBMI format.","[-t token] [max-frames]"}, {"shutdownex","Unhooks output callbacks.\nNeeds to be called explicitly only in case of remote debugging.",""}, {"addwatch","Add watch expression","<iname> <expression>"}, +{"widgetat","Return address of widget at position","<x> <y>"}, {"test","Testing command","-T type | -w watch-expression"} }; @@ -943,6 +945,38 @@ extern "C" HRESULT CALLBACK shutdownex(CIDebugClient *, PCSTR) return S_OK; } +extern "C" HRESULT CALLBACK widgetat(CIDebugClient *client, PCSTR argsIn) +{ + ExtensionCommandContext exc(client); + int token = 0; + std::string widgetAddress; + std::string errorMessage; + + do { + int x = -1; + int y = -1; + + const StringVector tokens = commandTokens<StringVector>(argsIn, &token); + if (tokens.size() != 2) { + errorMessage = singleLineUsage(commandDescriptions[CmdWidgetAt]); + break; + } + if (!integerFromString(tokens.front(), &x) || !integerFromString(tokens.at(1), &y)) { + errorMessage = singleLineUsage(commandDescriptions[CmdWidgetAt]); + break; + } + widgetAddress = widgetAt(SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()), + x, y, &errorMessage); + } while (false); + + if (widgetAddress.empty()) { + ExtensionContext::instance().report('N', token, 0, "widgetat", errorMessage.c_str()); + } else { + ExtensionContext::instance().reportLong('R', token, "widgetat", widgetAddress); + } + return S_OK; +} + extern "C" HRESULT CALLBACK test(CIDebugClient *client, PCSTR argsIn) { enum Mode { Invalid, TestType, TestFixWatchExpression }; |