aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-22 00:51:46 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-22 00:51:50 +0530
commitf09f1aa704f06472ec134b40e2f69bf3279c3f06 (patch)
treef292716c90d16ade8d31b2b2d70da8481d1e8294 /src
parent498135054a168bd839f2ee8ebb1ba245d72a8f3b (diff)
downloadnull-browser-f09f1aa704f06472ec134b40e2f69bf3279c3f06.tar.gz
null-browser-f09f1aa704f06472ec134b40e2f69bf3279c3f06.zip
Add web.keymap.set + test keymaps config.lua
Diffstat (limited to 'src')
-rw-r--r--src/InputMediator.cpp10
-rw-r--r--src/InputMediator.hpp3
-rw-r--r--src/LuaRuntime.cpp47
-rw-r--r--src/LuaRuntime.hpp6
-rw-r--r--src/keymap/KeymapEvaluator.cpp10
-rw-r--r--src/keymap/KeymapEvaluator.hpp1
-rw-r--r--src/main.cpp4
-rw-r--r--src/widgets/MainWindow.cpp4
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);