summaryrefslogtreecommitdiff
path: root/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2011-01-18 11:40:45 +0100
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>2011-01-18 11:40:45 +0100
commit11c6ca71ac76e57e68fe334cb2a9effd6c6d444d (patch)
tree9146a030dd094f317cf777c6a1c6ed6b8376f8eb /src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
parenta471f54240c1eff7931b7c0c79d8d6da3816ce0b (diff)
downloadqt-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.cpp34
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 };