-
This commit is contained in:
@@ -9,272 +9,250 @@
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QAbstractEventDispatcher>
|
||||
#include "command.h"
|
||||
|
||||
#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()
|
||||
void Rktwebview_qt::processCommand(Command *cmd)
|
||||
{
|
||||
while(!_command_queue.empty()) {
|
||||
Command *cmd = _command_queue.dequeue();
|
||||
switch(cmd->cmd) {
|
||||
case COMMAND_QUIT: {
|
||||
_app->quit();
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_CREATE: {
|
||||
int parent = cmd->args[0].toInt();
|
||||
|
||||
switch(cmd->cmd) {
|
||||
case COMMAND_QUIT: {
|
||||
_app->quit();
|
||||
void *f = cmd->args[1].value<void *>();
|
||||
event_cb_t js_event_cb = reinterpret_cast <event_cb_t>(f);
|
||||
|
||||
QWidget *p;
|
||||
if (_views.contains(parent)) {
|
||||
p = _views[parent];
|
||||
} else {
|
||||
p = nullptr;
|
||||
}
|
||||
|
||||
WebviewWindow *w = new WebviewWindow(p);
|
||||
WebViewQt *view = new WebViewQt(nextHandle(), w);
|
||||
w->addView(view, this);
|
||||
|
||||
int id = view->id();
|
||||
|
||||
_views[id] = w;
|
||||
_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];
|
||||
_views.remove(wv);
|
||||
w->closeView();
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_SET_URL: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString url = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
WebViewQt *v = w->view();
|
||||
QUrl u(url);
|
||||
v->setUrl(u);
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_SET_HTML: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString html = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
WebViewQt *v = w->view();
|
||||
v->setHtml(html);
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
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)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->runJs(js);
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_CALL_JS: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString js = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->callJs(js, cmd);
|
||||
} else {
|
||||
cmd->result = false;
|
||||
cmd->js_result_ok = false;
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_CREATE: {
|
||||
int parent = cmd->args[0].toInt();
|
||||
|
||||
void *f = cmd->args[1].value<void *>();
|
||||
event_cb_t js_event_cb = reinterpret_cast <event_cb_t>(f);
|
||||
|
||||
QWidget *p;
|
||||
if (_views.contains(parent)) {
|
||||
p = _views[parent];
|
||||
} else {
|
||||
p = nullptr;
|
||||
}
|
||||
break;
|
||||
case COMMAND_DEV_TOOLS: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->openDevTools();
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
WebviewWindow *w = new WebviewWindow(p);
|
||||
WebViewQt *view = new WebViewQt(nextHandle(), w);
|
||||
w->addView(view, this);
|
||||
|
||||
int id = view->id();
|
||||
|
||||
_views[id] = w;
|
||||
_view_js_callbacks[id] = js_event_cb;
|
||||
|
||||
w->show();
|
||||
while(!w->windowCreated()) {
|
||||
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 = id;
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_CLOSE: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w= _views[wv];
|
||||
_views.remove(wv);
|
||||
w->closeView();
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_SET_URL: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString url = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
WebViewQt *v = w->view();
|
||||
QUrl u(url);
|
||||
v->setUrl(u);
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_SET_HTML: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString html = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
WebViewQt *v = w->view();
|
||||
v->setHtml(html);
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
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)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->runJs(js);
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_CALL_JS: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString js = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->callJs(js, cmd);
|
||||
} else {
|
||||
cmd->result = false;
|
||||
cmd->js_result_ok = false;
|
||||
cmd->done = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case COMMAND_DEV_TOOLS: {
|
||||
doEvents();
|
||||
int wv = cmd->args[0].toInt();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->openDevTools();
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
}
|
||||
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;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
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;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
cmd->result = true;
|
||||
} else {
|
||||
cmd->result = false;
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
cmd->done = true;
|
||||
}
|
||||
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;
|
||||
}
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
cmd->result = false;
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -314,7 +292,7 @@ int Rktwebview_qt::rktWebViewCreate(int parent, event_cb_t js_evt_cb)
|
||||
QVariant f(QVariant::fromValue(function));
|
||||
c.args.push_back(f);
|
||||
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
|
||||
while(!c.done) { doEvents(); }
|
||||
|
||||
@@ -327,7 +305,7 @@ void Rktwebview_qt::rktWebViewClose(int wv)
|
||||
Command c(COMMAND_CLOSE);
|
||||
c.args.push_back(wv);
|
||||
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
|
||||
while(!c.done) { doEvents(); }
|
||||
}
|
||||
@@ -338,7 +316,7 @@ result_t Rktwebview_qt::rktSetUrl(rktwebview_t wv, const char *url)
|
||||
QString _url(url);
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(_url);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
|
||||
while(!c.done) { doEvents(); }
|
||||
|
||||
@@ -353,7 +331,7 @@ result_t Rktwebview_qt::rktSetHtml(rktwebview_t wv, const char *html)
|
||||
QString _html(html);
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(_html);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
|
||||
while(!c.done) { doEvents(); }
|
||||
|
||||
@@ -368,7 +346,7 @@ rkt_js_result_t *Rktwebview_qt::rktCallJs(rktwebview_t wv, const char *js)
|
||||
QString _js(js);
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(_js);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
|
||||
rkt_js_result_t *r = static_cast<rkt_js_result_t *>(malloc(sizeof(rkt_js_result_t)));
|
||||
@@ -384,7 +362,7 @@ result_t Rktwebview_qt::rktRunJs(rktwebview_t wv, const char *js)
|
||||
QString _js(js);
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(_js);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
bool r = c.result.toBool();
|
||||
return r ? result_t::oke : result_t::eval_js_failed;
|
||||
@@ -396,7 +374,7 @@ result_t Rktwebview_qt::rktMove(rktwebview_t wv, int x, int y)
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(x);
|
||||
c.args.push_back(y);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
bool r = c.result.toBool();
|
||||
return r ? result_t::oke : result_t::move_failed;
|
||||
@@ -408,7 +386,7 @@ result_t Rktwebview_qt::rktResize(rktwebview_t wv, int w, int h)
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(w);
|
||||
c.args.push_back(h);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
bool r = c.result.toBool();
|
||||
return r ? result_t::oke : result_t::resize_failed;
|
||||
@@ -448,7 +426,7 @@ window_state_t Rktwebview_qt::rktWindowState(rktwebview_t w)
|
||||
{
|
||||
Command c(COMMAND_WINDOW_STATUS);
|
||||
c.args.push_back(w);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
int r = c.result.toInt();
|
||||
window_state_t ws = static_cast<window_state_t>(r);
|
||||
@@ -460,7 +438,7 @@ 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);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
bool r = c.result.toBool();
|
||||
return r ? result_t::oke : result_t::resize_failed;
|
||||
@@ -470,7 +448,7 @@ result_t Rktwebview_qt::doWindow(rktwebview_t w, int cmd)
|
||||
{
|
||||
Command c(cmd);
|
||||
c.args.push_back(w);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
bool r = c.result.toBool();
|
||||
return r ? result_t::oke : result_t::resize_failed;
|
||||
@@ -485,7 +463,7 @@ result_t Rktwebview_qt::rktOpenDevtools(rktwebview_t wv)
|
||||
{
|
||||
Command c(COMMAND_DEV_TOOLS);
|
||||
c.args.push_back(wv);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
bool r = c.result.toBool();
|
||||
return r ? result_t::oke : result_t::eval_js_failed;
|
||||
@@ -544,7 +522,7 @@ void Rktwebview_qt::rktQuit()
|
||||
}
|
||||
|
||||
Command c(COMMAND_QUIT);
|
||||
_command_queue.enqueue(&c);
|
||||
postCommand(&c);
|
||||
|
||||
while(!c.done) { doEvents(); }
|
||||
}
|
||||
@@ -558,11 +536,46 @@ void Rktwebview_qt::runJs(rktwebview_t wv, const char *js)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Rktwebview_qt::postCommand(Command *cmd)
|
||||
{
|
||||
CommandEvent *e = new CommandEvent(cmd);
|
||||
QApplication::postEvent(this, e);
|
||||
}
|
||||
|
||||
void Rktwebview_qt::handleCommandEvent(CommandEvent *e)
|
||||
{
|
||||
Command *c = e->cmd();
|
||||
processCommand(c);
|
||||
}
|
||||
|
||||
void Rktwebview_qt::customEvent(QEvent *event)
|
||||
{
|
||||
if (event->type() == COMMAND_EVENT) {
|
||||
handleCommandEvent(static_cast<CommandEvent *>(event));
|
||||
}
|
||||
}
|
||||
|
||||
void Rktwebview_qt::doEvents()
|
||||
{
|
||||
_app->processEvents();
|
||||
//_app->processEvents();
|
||||
if (_evt_loop_depth == 0) {
|
||||
_evt_loop_depth += 1;
|
||||
_evt_loop_timer.setSingleShot(true);
|
||||
_evt_loop_timer.start(2);
|
||||
//_evt_loop.exec();
|
||||
_app->exec();
|
||||
}
|
||||
}
|
||||
|
||||
void Rktwebview_qt::stopEventloop()
|
||||
{
|
||||
//_evt_loop.exit(0);
|
||||
_app->exit(0);
|
||||
_evt_loop_depth -= 1;
|
||||
}
|
||||
|
||||
|
||||
Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) :
|
||||
QObject()
|
||||
{
|
||||
@@ -573,19 +586,21 @@ Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) :
|
||||
_current_handle = 0;
|
||||
_handler = handler;
|
||||
|
||||
_evt_loop_depth = 0;
|
||||
_app = new QApplication(_argc, _argv);
|
||||
connect(&_process_commands, &QTimer::timeout, this, &Rktwebview_qt::processCommands);
|
||||
_process_commands.start(10);
|
||||
|
||||
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);
|
||||
}
|
||||
);
|
||||
connect(&_evt_loop_timer, &QTimer::timeout, this, &Rktwebview_qt::stopEventloop);
|
||||
|
||||
//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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user