1
0
Fork 0

GUI: Gui(Un)RegisterScriptLanguage + normalize variable names

This commit is contained in:
Nukem 2016-01-05 21:23:03 -05:00
parent d078c80314
commit a6e658c61b
6 changed files with 88 additions and 57 deletions

View File

@ -1250,10 +1250,19 @@ BRIDGE_IMPEXP void GuiDumpAtN(duint va, int index)
_gui_sendmessage(GUI_DUMP_AT_N, (void*)va, (void*)index);
}
BRIDGE_IMPEXP void GuiDisplayWarning(const char* title, const char* text)
{
_gui_sendmessage(GUI_DISPLAY_WARNING, (void*) title, (void*) text);
_gui_sendmessage(GUI_DISPLAY_WARNING, (void*)title, (void*)text);
}
BRIDGE_IMPEXP void GuiRegisterScriptLanguage(SCRIPTTYPEINFO* info)
{
_gui_sendmessage(GUI_REGISTER_SCRIPT_LANG, (void*)info, nullptr);
}
BRIDGE_IMPEXP void GuiUnregisterScriptLanguage(int id)
{
_gui_sendmessage(GUI_UNREGISTER_SCRIPT_LANG, (void*)id, nullptr);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

View File

@ -789,11 +789,15 @@ typedef enum
GUI_SET_DEBUGGEE_NOTES, // param1=const char* text, param2=unused
GUI_GET_DEBUGGEE_NOTES, // param1=char** text, param2=unused
GUI_DUMP_AT_N, // param1=int index, param2=duint va
GUI_DISPLAY_WARNING // param1=const char *text, param2=unused
GUI_DISPLAY_WARNING, // param1=const char *text, param2=unused
GUI_REGISTER_SCRIPT_LANG, // param1=SCRIPTTYPEINFO* info, param2=unused
GUI_UNREGISTER_SCRIPT_LANG // param1=int id, param2=unused
} GUIMSG;
//GUI Typedefs
typedef void (*GUICALLBACK)();
typedef bool (*GUISCRIPTEXECUTE)(const char* text);
typedef void (*GUISCRIPTCOMPLETER)(const char* text, char** entries, int* entryCount);
//GUI structures
typedef struct
@ -815,6 +819,14 @@ typedef struct
duint size;
} ICONDATA;
typedef struct
{
char name[64];
int id;
GUISCRIPTEXECUTE execute;
GUISCRIPTCOMPLETER completeCommand;
} SCRIPTTYPEINFO;
//GUI functions
BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip);
BRIDGE_IMPEXP void GuiSetDebugState(DBGSTATE state);
@ -890,6 +902,8 @@ BRIDGE_IMPEXP void GuiSetDebuggeeNotes(const char* text);
BRIDGE_IMPEXP void GuiGetDebuggeeNotes(char** text);
BRIDGE_IMPEXP void GuiDumpAtN(duint va, int index);
BRIDGE_IMPEXP void GuiDisplayWarning(const char* title, const char* text);
BRIDGE_IMPEXP void GuiRegisterScriptLanguage(SCRIPTTYPEINFO* info);
BRIDGE_IMPEXP void GuiUnregisterScriptLanguage(int id);
#ifdef __cplusplus
}

View File

@ -524,10 +524,8 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
break;
case GUI_DUMP_AT_N:
{
emit dumpAtN((duint)param1, (int)param2);
}
break;
break;
case GUI_DISPLAY_WARNING:
{
@ -536,6 +534,18 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
emit displayWarning(title, text);
}
break;
case GUI_REGISTER_SCRIPT_LANG:
{
BridgeResult result;
emit registerScriptLang((SCRIPTTYPEINFO*)param1);
result.Wait();
}
break;
case GUI_UNREGISTER_SCRIPT_LANG:
emit unregisterScriptLang((int)param1);
break;
}
return nullptr;
}

View File

@ -116,6 +116,8 @@ signals:
void getDebuggeeNotes(void* text);
void dumpAtN(duint va, int index);
void displayWarning(QString title, QString text);
void registerScriptLang(SCRIPTTYPEINFO* info);
void unregisterScriptLang(int id);
private:
QMutex* mBridgeMutex;

View File

@ -14,11 +14,11 @@ CommandLineEdit::CommandLineEdit(QWidget* parent) : HistoryLineEdit(parent)
this->setCompleter(mCompleter);
// Initialize default script execute function
GUI_SCRIPT_INFO info;
info.DisplayName = "Default";
info.AssignedId = 0;
info.Execute = DbgCmdExec;
info.CompleteCommand = nullptr;
SCRIPTTYPEINFO info;
strcpy(info.name, "Default");
info.id = 0;
info.execute = DbgCmdExec;
info.completeCommand = nullptr;
registerScriptType(&info);
//Setup signals & slots
@ -27,6 +27,8 @@ CommandLineEdit::CommandLineEdit(QWidget* parent) : HistoryLineEdit(parent)
connect(Bridge::getBridge(), SIGNAL(autoCompleteAddCmd(QString)), this, SLOT(autoCompleteAddCmd(QString)));
connect(Bridge::getBridge(), SIGNAL(autoCompleteDelCmd(QString)), this, SLOT(autoCompleteDelCmd(QString)));
connect(Bridge::getBridge(), SIGNAL(autoCompleteClearAll()), this, SLOT(autoCompleteClearAll()));
connect(Bridge::getBridge(), SIGNAL(registerScriptLang(SCRIPTTYPEINFO*)), this, SLOT(registerScriptType(SCRIPTTYPEINFO*)));
connect(Bridge::getBridge(), SIGNAL(unregisterScriptLang(SCRIPTTYPEINFO*)), this, SLOT(unregisterScriptType(SCRIPTTYPEINFO*)));
connect(mCmdScriptType, SIGNAL(currentIndexChanged(int)), this, SLOT(scriptTypeChanged(int)));
}
@ -80,6 +82,27 @@ bool CommandLineEdit::focusNextPrevChild(bool next)
return false;
}
void CommandLineEdit::execute()
{
GUISCRIPTEXECUTE exec = mScriptInfo[mCurrentScriptIndex].execute;
const QString & cmd = text();
if(exec)
{
// Send this string directly to the user
exec(cmd.toUtf8().constData());
}
// Add this line to the history and clear text, regardless if it was executed
addLineToHistory(cmd);
setText("");
}
QWidget* CommandLineEdit::selectorWidget()
{
return mCmdScriptType;
}
void CommandLineEdit::autoCompleteUpdate(const QString text)
{
// No command, no completer
@ -93,7 +116,7 @@ void CommandLineEdit::autoCompleteUpdate(const QString text)
QModelIndex modelIndex = mCompleter->popup()->currentIndex();
// User supplied callback
SCRIPTCOMPLETER complete = mScriptInfo[mCurrentScriptIndex].CompleteCommand;
GUISCRIPTCOMPLETER complete = mScriptInfo[mCurrentScriptIndex].completeCommand;
if(complete)
{
@ -154,38 +177,38 @@ void CommandLineEdit::autoCompleteClearAll()
mDefaultCompletions.clear();
}
void CommandLineEdit::scriptTypeChanged(int index)
{
mCurrentScriptIndex = index;
}
void CommandLineEdit::registerScriptType(GUI_SCRIPT_INFO* info)
void CommandLineEdit::registerScriptType(SCRIPTTYPEINFO* info)
{
// Must be valid pointer
if(!info)
{
Bridge::getBridge()->setResult(0);
return;
}
// Insert
info->AssignedId = mScriptInfo.size();
info->id = mScriptInfo.size();
mScriptInfo.push_back(*info);
// Update
mCmdScriptType->addItem(info->DisplayName);
mCmdScriptType->addItem(info->name);
if(info->AssignedId == 0)
if(info->id == 0)
mCurrentScriptIndex = 0;
Bridge::getBridge()->setResult(1);
}
void CommandLineEdit::unregisterScriptType(int Id)
void CommandLineEdit::unregisterScriptType(int id)
{
// The default script type can't be unregistered
if(Id <= 0)
if(id <= 0)
return;
// Loop through the vector and invalidate entry (validate id)
for(int i = 0; i < mScriptInfo.size(); i++)
{
if(mScriptInfo[i].AssignedId == Id)
if(mScriptInfo[i].id == id)
{
mScriptInfo.removeAt(i);
mCmdScriptType->removeItem(i);
@ -200,23 +223,7 @@ void CommandLineEdit::unregisterScriptType(int Id)
mCmdScriptType->setCurrentIndex(mCurrentScriptIndex);
}
void CommandLineEdit::execute()
void CommandLineEdit::scriptTypeChanged(int index)
{
SCRIPTEXECUTE exec = mScriptInfo[mCurrentScriptIndex].Execute;
const QString & cmd = text();
if(exec)
{
// Send this string directly to the user
exec(cmd.toUtf8().constData());
}
// Add this line to the history and clear text, regardless if it was executed
addLineToHistory(cmd);
setText("");
}
QWidget* CommandLineEdit::selectorWidget()
{
return mCmdScriptType;
mCurrentScriptIndex = index;
}

View File

@ -1,23 +1,13 @@
#ifndef COMMANDLINEEDIT_H
#define COMMANDLINEEDIT_H
#include "Bridge/bridgemain.h"
#include "HistoryLineEdit.h"
#include <QAbstractItemView>
#include <QCompleter>
#include <QComboBox>
#include <QStringListModel>
typedef bool (* SCRIPTEXECUTE)(const char* Text);
typedef void (* SCRIPTCOMPLETER)(const char* Text, char** Entries, int* EntryCount);
struct GUI_SCRIPT_INFO
{
const char* DisplayName;
int AssignedId;
SCRIPTEXECUTE Execute;
SCRIPTCOMPLETER CompleteCommand;
};
class CommandLineEdit : public HistoryLineEdit
{
Q_OBJECT
@ -27,10 +17,7 @@ public:
void keyPressEvent(QKeyEvent* event);
bool focusNextPrevChild(bool next);
void registerScriptType(GUI_SCRIPT_INFO* info);
void unregisterScriptType(int Id);
void execute();
QWidget* selectorWidget();
public slots:
@ -38,13 +25,15 @@ public slots:
void autoCompleteAddCmd(const QString cmd);
void autoCompleteDelCmd(const QString cmd);
void autoCompleteClearAll();
void registerScriptType(SCRIPTTYPEINFO* info);
void unregisterScriptType(int id);
void scriptTypeChanged(int index);
private:
QComboBox* mCmdScriptType;
QCompleter* mCompleter;
QStringListModel* mCompleterModel;
QList<GUI_SCRIPT_INFO> mScriptInfo;
QList<SCRIPTTYPEINFO> mScriptInfo;
QStringList mDefaultCompletions;
int mCurrentScriptIndex;
};