diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-03-22 00:51:46 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-03-22 00:51:50 +0530 |
| commit | f09f1aa704f06472ec134b40e2f69bf3279c3f06 (patch) | |
| tree | f292716c90d16ade8d31b2b2d70da8481d1e8294 /src | |
| parent | 498135054a168bd839f2ee8ebb1ba245d72a8f3b (diff) | |
| download | null-browser-f09f1aa704f06472ec134b40e2f69bf3279c3f06.tar.gz null-browser-f09f1aa704f06472ec134b40e2f69bf3279c3f06.zip | |
Add web.keymap.set + test keymaps config.lua
Diffstat (limited to '')
| -rw-r--r-- | src/InputMediator.cpp | 10 | ||||
| -rw-r--r-- | src/InputMediator.hpp | 3 | ||||
| -rw-r--r-- | src/LuaRuntime.cpp | 47 | ||||
| -rw-r--r-- | src/LuaRuntime.hpp | 6 | ||||
| -rw-r--r-- | src/keymap/KeymapEvaluator.cpp | 10 | ||||
| -rw-r--r-- | src/keymap/KeymapEvaluator.hpp | 1 | ||||
| -rw-r--r-- | src/main.cpp | 4 | ||||
| -rw-r--r-- | src/widgets/MainWindow.cpp | 4 |
8 files changed, 83 insertions, 2 deletions
diff --git a/src/InputMediator.cpp b/src/InputMediator.cpp index f935ad2..61ef125 100644 --- a/src/InputMediator.cpp +++ b/src/InputMediator.cpp @@ -5,14 +5,24 @@ #include "CommandParser.hpp" #include "InputMediator.hpp" #include "LuaRuntime.hpp" +#include "keymap/KeymapEvaluator.hpp" #include "widgets/WebViewStack.hpp" +// TODO: Rename this InputMediator::InputMediator(WebViewStack *webViewStack, LuaRuntime *luaRuntime, KeymapEvaluator *keymapEvaluator) : QObject(), webViewStack(webViewStack), luaRuntime(luaRuntime), keymapEvaluator(keymapEvaluator) { connect(luaRuntime, &LuaRuntime::urlOpened, webViewStack, &WebViewStack::openUrl); + connect(luaRuntime, &LuaRuntime::keymapAddRequested, this, + &InputMediator::addKeymap); +} + +void InputMediator::addKeymap(QString modeString, QString keyseq, + std::function<void()> action) { + KeyMode mode = keymapEvaluator->modeFromString(modeString); + keymapEvaluator->addKeymap(mode, keyseq, action); } void InputMediator::evaluateCommand(QString command) { diff --git a/src/InputMediator.hpp b/src/InputMediator.hpp index 7194ff9..87395d5 100644 --- a/src/InputMediator.hpp +++ b/src/InputMediator.hpp @@ -23,8 +23,9 @@ public: DELEGATE(webViewStack, closeCurrent, closeCurrentWebView) DELEGATE(keymapEvaluator, evaluate, evaluateKeymap) -private: +protected: void evaluateCommand(QString command); + void addKeymap(QString mode, QString keyseq, std::function<void()> action); private: WebViewStack *webViewStack; diff --git a/src/LuaRuntime.cpp b/src/LuaRuntime.cpp index e9a30b1..f83ee48 100644 --- a/src/LuaRuntime.cpp +++ b/src/LuaRuntime.cpp @@ -22,6 +22,14 @@ LuaRuntime::LuaRuntime() { }; luaL_newlib(state, weblib); lua_setglobal(state, web_global_name); + + lua_getglobal(state, web_global_name); + luaL_Reg keymaplib[] = { + {"set", &LuaRuntime::lua_addKeymap}, + }; + luaL_newlib(state, keymaplib); + lua_setfield(state, -2, "keymap"); + lua_pop(state, 1); } void LuaRuntime::startEventLoop() { @@ -51,7 +59,7 @@ void LuaRuntime::stopEventLoop() { void LuaRuntime::evaluate(QString code) { eventLoop->queueTask([this, code]() { - if (luaL_dostring(state, code.toStdString().c_str())) { + if (luaL_dostring(state, code.toStdString().c_str()) != LUA_OK) { auto value = lua_tostring(state, -1); lua_pop(state, 1); @@ -102,6 +110,43 @@ int LuaRuntime::lua_onUrlTabOpen(lua_State *state) { return 1; } +int LuaRuntime::lua_addKeymap(lua_State *state) { + const char *mode = lua_tostring(state, 1); + const char *keyseq = lua_tostring(state, 2); + qDebug() << "Adduing" << mode << keyseq; + + qDebug() << "---" << lua_isfunction(state, 3); + + lua_pushvalue(state, 3); + int functionRef = luaL_ref(state, LUA_REGISTRYINDEX); + auto action = [state, functionRef]() { + qDebug() << "Hello"; + + lua_rawgeti(state, LUA_REGISTRYINDEX, functionRef); + if (lua_pcall(state, 0, 0, 0) != LUA_OK) { + const char *error = lua_tostring(state, -1); + qDebug() << "Error calling Lua function:" << error; + lua_pop(state, 1); + } else { + qDebug() << "Done"; + } + lua_pop(state, 1); + }; + + auto runtime = LuaRuntime::instance(); + emit runtime->keymapAddRequested(mode, keyseq, action); + + return 1; +} + +void LuaRuntime::loadFile(QString path) { + qDebug() << "Loading: " << path; + if (luaL_dofile(state, path.toStdString().c_str()) != LUA_OK) { + qDebug() << "Load file error:" << lua_tostring(state, -1); + lua_pop(state, 1); + } +} + LuaRuntime::~LuaRuntime() { stopEventLoop(); lua_close(state); diff --git a/src/LuaRuntime.hpp b/src/LuaRuntime.hpp index dd5c0ec..6c45ca5 100644 --- a/src/LuaRuntime.hpp +++ b/src/LuaRuntime.hpp @@ -1,6 +1,7 @@ #pragma once #include <QtCore> +#include <functional> #include <lua.hpp> #include "AsyncEventLoop.hpp" @@ -18,17 +19,21 @@ public: void evaluate(QString code); QVariant evaluateSync(QString code); + void loadFile(QString code); + void stopEventLoop(); void startEventLoop(); QVariant getValue(int idx); DELEGATE(eventLoop, queueTask, queueTask) + DEFINE_GETTER(getState, state) signals: void urlOpened(QString url, OpenType openType); void evaluationCompleted(QVariant value); void evaluationFailed(QString value); + void keymapAddRequested(QString mode, QString keyseq, std::function<void()>); // void outputProduced(QVariant value); protected: @@ -36,6 +41,7 @@ protected: ~LuaRuntime(); static int lua_onUrlOpen(lua_State *state); static int lua_onUrlTabOpen(lua_State *state); + static int lua_addKeymap(lua_State *state); private: lua_State *state; diff --git a/src/keymap/KeymapEvaluator.cpp b/src/keymap/KeymapEvaluator.cpp index baae819..b20aeda 100644 --- a/src/keymap/KeymapEvaluator.cpp +++ b/src/keymap/KeymapEvaluator.cpp @@ -11,6 +11,8 @@ void KeymapEvaluator::addKeymap(KeyMode mode, QString key, KeyAction action) { if (!modalKeys.contains(mode)) modalKeys.insert(mode, {}); + qDebug() << " " << mode << key; + auto keySeq = keySeqParser.parse(key); modalKeys[mode].append((KeyMap){.keySequence = keySeq, .action = action}); } @@ -57,3 +59,11 @@ const QList<KeyMap> *KeymapEvaluator::currentModeKeys() { return &modalKeys[currentMode]; } + +KeyMode KeymapEvaluator::modeFromString(QString modeString) { + if (modeString == "n") + return KeyMode::Normal; + if (modeString == "i") + return KeyMode::Insert; + return KeyMode::Normal; +} diff --git a/src/keymap/KeymapEvaluator.hpp b/src/keymap/KeymapEvaluator.hpp index db93900..b98a881 100644 --- a/src/keymap/KeymapEvaluator.hpp +++ b/src/keymap/KeymapEvaluator.hpp @@ -26,6 +26,7 @@ public: void addKeymap(KeyMode mode, QString key, KeyAction action); bool evaluate(Qt::KeyboardModifiers modifiers, Qt::Key key); + KeyMode modeFromString(QString modeString); DEFINE_SETTER(setCurrentMode, currentMode) DEFINE_GETTER(getCurrentMode, currentMode) diff --git a/src/main.cpp b/src/main.cpp index a83408c..d86b484 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,15 @@ #include <QApplication> #include <QMainWindow> +#include "LuaRuntime.hpp" #include "widgets/MainWindow.hpp" int main(int argc, char *argv[]) { QApplication app(argc, argv); + auto lua = LuaRuntime::instance(); + lua->startEventLoop(); + MainWindow mainWindow; mainWindow.setWindowTitle("null-browser"); mainWindow.show(); diff --git a/src/widgets/MainWindow.cpp b/src/widgets/MainWindow.cpp index 32bde30..ca572e7 100644 --- a/src/widgets/MainWindow.cpp +++ b/src/widgets/MainWindow.cpp @@ -14,6 +14,7 @@ MainWindow::MainWindow() { setStyleSheet("background-color: #000; color: #fff;"); setCentralWidget(new QWidget()); // TODO: manage widget memory + // Global event filter qApp->installEventFilter(this); // Root stacked layout @@ -40,6 +41,9 @@ MainWindow::MainWindow() { inputMediator = new InputMediator(webViewStack, LuaRuntime::instance(), keymapEvaluator); + // NOTE: TMP + LuaRuntime::instance()->loadFile("./config.lua"); + // TODO: remove keymapEvaluator->addKeymap(KeyMode::Normal, "i", [keymapEvaluator]() { keymapEvaluator->setCurrentMode(KeyMode::Insert); |
