-
This commit is contained in:
@@ -21,7 +21,9 @@ int main(int argc, char *argv[])
|
||||
|
||||
rkt_webview_init();
|
||||
wv1 = rkt_webview_create(0, eventCb);
|
||||
rkt_webview_set_url(wv1, "https://wikipedia.org");
|
||||
rkt_webview_move(wv1, 200, 300);
|
||||
rkt_webview_resize(wv1, 800, 600);
|
||||
rkt_webview_set_url(wv1, "http://127.0.0.1:8083");
|
||||
|
||||
int i = 0;
|
||||
while(i < 60) {
|
||||
@@ -50,6 +52,9 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (i == 10) {
|
||||
wv2 = rkt_webview_create(0, eventCb);
|
||||
rkt_webview_move(wv2, 400, 200);
|
||||
rkt_webview_resize(wv2, 800, 600);
|
||||
rkt_webview_set_url(wv2, "https://127.0.0.1");
|
||||
}
|
||||
|
||||
if (i > 10) {
|
||||
|
||||
@@ -29,6 +29,7 @@ void rkt_webview_init()
|
||||
{
|
||||
if (handler == nullptr) {
|
||||
handler = new Rktwebview_qt(&handler);
|
||||
handler->doEvents();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,4 +136,51 @@ bool rkt_webview_valid(rktwebview_t wv)
|
||||
return handler->rktValid(wv);
|
||||
}
|
||||
|
||||
result_t rkt_webview_hide(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktHideWindow(w);
|
||||
|
||||
}
|
||||
|
||||
result_t rkt_webview_show(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktShowWindow(w);
|
||||
}
|
||||
|
||||
result_t rkt_webview_present(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktPresentWindow(w);
|
||||
}
|
||||
|
||||
result_t rkt_webview_maximize(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktMaximizeWindow(w);
|
||||
}
|
||||
|
||||
result_t rkt_webview_minimize(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktMinimizeWindow(w);
|
||||
}
|
||||
|
||||
result_t rkt_webview_show_normal(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktShowNormalWindow(w);
|
||||
}
|
||||
|
||||
window_state_t rkt_webview_window_state(rktwebview_t w)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktWindowState(w);
|
||||
}
|
||||
|
||||
result_t rkt_webview_set_title(rktwebview_t wv, const char *title)
|
||||
{
|
||||
rkt_webview_init();
|
||||
return handler->rktWindowSetTitle(wv, title);
|
||||
}
|
||||
|
||||
@@ -37,7 +37,15 @@ typedef struct {
|
||||
char *value;
|
||||
} rkt_js_result_t;
|
||||
|
||||
|
||||
typedef enum {
|
||||
invalid = -1,
|
||||
normal = 0,
|
||||
minimized = 1,
|
||||
maximized = 2,
|
||||
hidden = 3,
|
||||
normal_active = 16,
|
||||
maximized_active = 18
|
||||
} window_state_t;
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_init();
|
||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
||||
@@ -45,6 +53,7 @@ RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
||||
RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rktwebview_t parent, event_cb_t js_event_cb);
|
||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_close(rktwebview_t wv);
|
||||
RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title);
|
||||
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_url(rktwebview_t wv, const char *url);
|
||||
@@ -60,6 +69,13 @@ RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t *e);
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_move(rktwebview_t w, int x, int y);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_resize(rktwebview_t w, int width, int height);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_hide(rktwebview_t w);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show(rktwebview_t w);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show_normal(rktwebview_t w);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_present(rktwebview_t w);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_maximize(rktwebview_t w);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_minimize(rktwebview_t w);
|
||||
RKTWEBVIEW_QT_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ private:
|
||||
|
||||
private:
|
||||
void runJs(rktwebview_t wv, const char *js);
|
||||
result_t doWindow(rktwebview_t w, int cmd);
|
||||
|
||||
public slots:
|
||||
void processCommands();
|
||||
@@ -58,8 +59,19 @@ public:
|
||||
result_t rktSetHtml(rktwebview_t wv, const char *html);
|
||||
result_t rktRunJs(rktwebview_t wv, const char *js);
|
||||
rkt_js_result_t *rktCallJs(rktwebview_t wv, const char *js);
|
||||
|
||||
result_t rktMove(rktwebview_t wv, int x, int y);
|
||||
result_t rktResize(rktwebview_t wv, int w, int h);
|
||||
result_t rktHideWindow(rktwebview_t w);
|
||||
result_t rktShowWindow(rktwebview_t w);
|
||||
result_t rktPresentWindow(rktwebview_t w);
|
||||
result_t rktMaximizeWindow(rktwebview_t w);
|
||||
result_t rktMinimizeWindow(rktwebview_t w);
|
||||
result_t rktShowNormalWindow(rktwebview_t w);
|
||||
window_state_t rktWindowState(rktwebview_t w);
|
||||
|
||||
result_t rktWindowSetTitle(rktwebview_t wv, const char *title);
|
||||
|
||||
bool rktValid(rktwebview_t wv);
|
||||
|
||||
public:
|
||||
|
||||
@@ -20,6 +20,10 @@ WebviewWindow::WebviewWindow(QWidget *parent)
|
||||
|
||||
_devtools = nullptr;
|
||||
|
||||
_window_created = false;
|
||||
_moved = 0;
|
||||
_resized = 0;
|
||||
|
||||
connect(&_resize_timer, &QTimer::timeout, this, &WebviewWindow::triggerResize);
|
||||
connect(&_move_timer, &QTimer::timeout, this, &WebviewWindow::triggerMove);
|
||||
}
|
||||
@@ -74,6 +78,21 @@ void WebviewWindow::closeView()
|
||||
close();
|
||||
}
|
||||
|
||||
bool WebviewWindow::windowCreated()
|
||||
{
|
||||
return _window_created;
|
||||
}
|
||||
|
||||
int WebviewWindow::moveCount()
|
||||
{
|
||||
return _moved;
|
||||
}
|
||||
|
||||
int WebviewWindow::resizeCount()
|
||||
{
|
||||
return _resized;
|
||||
}
|
||||
|
||||
void WebviewWindow::addView(WebViewQt *v, Rktwebview_qt *c)
|
||||
{
|
||||
_container = c;
|
||||
@@ -174,6 +193,7 @@ void WebviewWindow::moveEvent(QMoveEvent *event)
|
||||
_y = event->pos().y();
|
||||
_move_timer.setSingleShot(true);
|
||||
_move_timer.start(500);
|
||||
_moved += 1;
|
||||
}
|
||||
|
||||
void WebviewWindow::triggerMove()
|
||||
@@ -190,6 +210,7 @@ void WebviewWindow::resizeEvent(QResizeEvent *event)
|
||||
_h = event->size().height();
|
||||
_resize_timer.setSingleShot(true);
|
||||
_resize_timer.start(500);
|
||||
_resized += 1;
|
||||
}
|
||||
|
||||
void WebviewWindow::triggerResize()
|
||||
@@ -202,6 +223,7 @@ void WebviewWindow::triggerResize()
|
||||
|
||||
void WebviewWindow::showEvent(QShowEvent *event)
|
||||
{
|
||||
_window_created = true;
|
||||
EventContainer show("show");
|
||||
_container->triggerEvent(_view->id(), show);
|
||||
}
|
||||
|
||||
@@ -25,6 +25,10 @@ private:
|
||||
int _h;
|
||||
bool _must_close;
|
||||
|
||||
bool _window_created;
|
||||
int _moved;
|
||||
int _resized;
|
||||
|
||||
public slots:
|
||||
void processJsEvents();
|
||||
|
||||
@@ -33,6 +37,9 @@ protected:
|
||||
|
||||
public:
|
||||
void closeView();
|
||||
bool windowCreated();
|
||||
int moveCount();
|
||||
int resizeCount();
|
||||
|
||||
public:
|
||||
void addView(WebViewQt *v, Rktwebview_qt *c);
|
||||
|
||||
Reference in New Issue
Block a user