This commit is contained in:
2026-03-04 18:15:45 +01:00
parent afa3778103
commit 3a2abf90f6
16 changed files with 1563 additions and 93 deletions

View File

@@ -8,17 +8,26 @@
#include <QSemaphore>
#include <QJsonDocument>
#include <QJsonObject>
#include <QAbstractEventDispatcher>
#define COMMAND_QUIT 1
#define COMMAND_CLOSE 2
#define COMMAND_CREATE 3
#define COMMAND_SET_URL 4
#define COMMAND_SET_HTML 5
#define COMMAND_RUN_JS 6
#define COMMAND_DEV_TOOLS 7
#define COMMAND_MOVE 8
#define COMMAND_RESIZE 9
#define COMMAND_CALL_JS 10
#define COMMAND_QUIT 1
#define COMMAND_CLOSE 2
#define COMMAND_CREATE 3
#define COMMAND_SET_URL 4
#define COMMAND_SET_HTML 5
#define COMMAND_RUN_JS 6
#define COMMAND_DEV_TOOLS 7
#define COMMAND_MOVE 8
#define COMMAND_RESIZE 9
#define COMMAND_CALL_JS 10
#define COMMAND_HIDE_WIN 11
#define COMMAND_SHOW_WIN 12
#define COMMAND_MAX_WIN 13
#define COMMAND_MIN_WIN 14
#define COMMAND_PRESENT_WIN 15
#define COMMAND_SHOW_NORMAL_WIN 16
#define COMMAND_WINDOW_STATUS 17
#define COMMAND_SET_TITLE 18
void Rktwebview_qt::processCommands()
{
@@ -54,12 +63,16 @@ void Rktwebview_qt::processCommands()
_view_js_callbacks[id] = js_event_cb;
w->show();
while(!w->windowCreated()) {
doEvents();
}
cmd->result = id;
cmd->done = true;
}
break;
case COMMAND_CLOSE: {
doEvents();
int wv = cmd->args[0].toInt();
if (_views.contains(wv)) {
WebviewWindow *w= _views[wv];
@@ -73,6 +86,7 @@ void Rktwebview_qt::processCommands()
}
break;
case COMMAND_SET_URL: {
doEvents();
int wv = cmd->args[0].toInt();
QString url = cmd->args[1].toString();
if (_views.contains(wv)) {
@@ -88,6 +102,7 @@ void Rktwebview_qt::processCommands()
}
break;
case COMMAND_SET_HTML: {
doEvents();
int wv = cmd->args[0].toInt();
QString html = cmd->args[1].toString();
if (_views.contains(wv)) {
@@ -101,7 +116,22 @@ void Rktwebview_qt::processCommands()
cmd->done = true;
}
break;
case COMMAND_SET_TITLE: {
doEvents();
int wv = cmd->args[0].toInt();
QString title = cmd->args[1].toString();
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
w->setWindowTitle(title);
cmd->result = true;
} else {
cmd->result = false;
}
cmd->done = true;
}
break;
case COMMAND_RUN_JS: {
doEvents();
int wv = cmd->args[0].toInt();
QString js = cmd->args[1].toString();
if (_views.contains(wv)) {
@@ -115,6 +145,7 @@ void Rktwebview_qt::processCommands()
}
break;
case COMMAND_CALL_JS: {
doEvents();
int wv = cmd->args[0].toInt();
QString js = cmd->args[1].toString();
if (_views.contains(wv)) {
@@ -128,6 +159,7 @@ void Rktwebview_qt::processCommands()
}
break;
case COMMAND_DEV_TOOLS: {
doEvents();
int wv = cmd->args[0].toInt();
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
@@ -139,13 +171,78 @@ void Rktwebview_qt::processCommands()
cmd->done = true;
}
break;
case COMMAND_SHOW_WIN:
case COMMAND_HIDE_WIN:
case COMMAND_PRESENT_WIN:
case COMMAND_MAX_WIN:
case COMMAND_MIN_WIN:
case COMMAND_SHOW_NORMAL_WIN:
{
doEvents();
int wv = cmd->args[0].toInt();
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
int c = cmd->cmd;
if (c == COMMAND_SHOW_WIN) w->show();
else if (c == COMMAND_HIDE_WIN) w->hide();
else if (c == COMMAND_MAX_WIN) w->showMaximized();
else if (c == COMMAND_MIN_WIN) {
w->showMinimized();
}
else if (c == COMMAND_SHOW_NORMAL_WIN) w->showNormal();
else if (c == COMMAND_PRESENT_WIN) {
w->show();
w->raise();
w->activateWindow();
}
cmd->result = true;
} else {
cmd->result = false;
}
cmd->done = true;
}
break;
case COMMAND_WINDOW_STATUS:
{
doEvents();
int wv = cmd->args[0].toInt();
window_state_t ws = window_state_t::invalid;
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
if (w->isHidden()) {
ws = window_state_t::hidden;
} else if (w->isMinimized()) {
ws = window_state_t::minimized;
} else if (w->isMaximized()) {
if (w->isActiveWindow()) {
ws = window_state_t::maximized_active;
} else {
ws = window_state_t::maximized;
}
} else if (w->isVisible()) {
if (w->isActiveWindow()) {
ws = window_state_t::normal_active;
} else {
ws = window_state_t::normal;
}
}
}
cmd->result = static_cast<int>(ws);
cmd->done = true;
}
break;
case COMMAND_MOVE: {
doEvents();
int wv = cmd->args[0].toInt();
int x = cmd->args[1].toInt();
int y = cmd->args[2].toInt();
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
int move_count = w->moveCount();
w->move(x, y);
while (w->moveCount() == move_count) {
doEvents();
}
cmd->result = true;
} else {
cmd->result = false;
@@ -154,12 +251,17 @@ void Rktwebview_qt::processCommands()
}
break;
case COMMAND_RESIZE: {
doEvents();
int wv = cmd->args[0].toInt();
int width = cmd->args[1].toInt();
int height = cmd->args[2].toInt();
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
int resize_count = w->resizeCount();
w->resize(width, height);
while (w->resizeCount() == resize_count) {
doEvents();
}
cmd->result = true;
} else {
cmd->result = false;
@@ -312,6 +414,68 @@ result_t Rktwebview_qt::rktResize(rktwebview_t wv, int w, int h)
return r ? result_t::oke : result_t::resize_failed;
}
result_t Rktwebview_qt::rktHideWindow(rktwebview_t w)
{
return doWindow(w, COMMAND_HIDE_WIN);
}
result_t Rktwebview_qt::rktShowWindow(rktwebview_t w)
{
return doWindow(w, COMMAND_SHOW_WIN);
}
result_t Rktwebview_qt::rktPresentWindow(rktwebview_t w)
{
return doWindow(w, COMMAND_PRESENT_WIN);
}
result_t Rktwebview_qt::rktMaximizeWindow(rktwebview_t w)
{
return doWindow(w, COMMAND_MAX_WIN);
}
result_t Rktwebview_qt::rktMinimizeWindow(rktwebview_t w)
{
return doWindow(w, COMMAND_MIN_WIN);
}
result_t Rktwebview_qt::rktShowNormalWindow(rktwebview_t w)
{
return doWindow(w, COMMAND_SHOW_NORMAL_WIN);
}
window_state_t Rktwebview_qt::rktWindowState(rktwebview_t w)
{
Command c(COMMAND_WINDOW_STATUS);
c.args.push_back(w);
_command_queue.enqueue(&c);
while(!c.done) { doEvents(); }
int r = c.result.toInt();
window_state_t ws = static_cast<window_state_t>(r);
return ws;
}
result_t Rktwebview_qt::rktWindowSetTitle(rktwebview_t wv, const char *title)
{
Command c(COMMAND_SET_TITLE);
c.args.push_back(wv);
c.args.push_back(title);
_command_queue.enqueue(&c);
while(!c.done) { doEvents(); }
bool r = c.result.toBool();
return r ? result_t::oke : result_t::resize_failed;
}
result_t Rktwebview_qt::doWindow(rktwebview_t w, int cmd)
{
Command c(cmd);
c.args.push_back(w);
_command_queue.enqueue(&c);
while(!c.done) { doEvents(); }
bool r = c.result.toBool();
return r ? result_t::oke : result_t::resize_failed;
}
bool Rktwebview_qt::rktValid(rktwebview_t wv)
{
return _views.contains(wv);
@@ -415,5 +579,13 @@ Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) :
connect(&_process_events, &QTimer::timeout, this, &Rktwebview_qt::processJsEventQueues);
_process_events.start(5);
const auto *eventDispatcher = QThread::currentThread()->eventDispatcher();
QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock,
QThread::currentThread(), []{
if (QThread::currentThread()->loopLevel() == 0)
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
}
);
*_handler = nullptr;
}