add example "web-kit-engine" (for the fun of it)
This commit is contained in:
parent
fa08b5b1a7
commit
2a9f6ce95c
10 changed files with 366 additions and 0 deletions
15
examples/M-modules/web-kit-engine/README-GLUE-CODE.txt
Normal file
15
examples/M-modules/web-kit-engine/README-GLUE-CODE.txt
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
GENERATION OF C++ GLUE CODE
|
||||
===========================
|
||||
|
||||
|
||||
1) Add a special documentation string (first line) in the functions you want
|
||||
to call from JavaScript (optionally defining default values):
|
||||
|
||||
(defun my-function (web-element arguments)
|
||||
"Qt: void myFunction(QWebElement, QVariantList = 0)"
|
||||
...)
|
||||
|
||||
2) Run: eql qt.lisp (the first time just type :c for :continue on "break"/debugger)
|
||||
|
||||
3) Build library in "lib/".
|
||||
|
||||
123
examples/M-modules/web-kit-engine/README.txt
Normal file
123
examples/M-modules/web-kit-engine/README.txt
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
BUILD
|
||||
=====
|
||||
|
||||
You'll need:
|
||||
Qt 5.5 (for module :webkit)
|
||||
Qt 5.7+ (for module :webengine)
|
||||
|
||||
- compile module :webkit with Qt 5.5
|
||||
- compile lib/* with Qt 5.5
|
||||
- compile EQL (including module :webengine) with Qt 5.7+
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NOTE
|
||||
====
|
||||
|
||||
Made for April (not the girl).
|
||||
11
examples/M-modules/web-kit-engine/lib/_invokables.h
Normal file
11
examples/M-modules/web-kit-engine/lib/_invokables.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// THIS FILE IS GENERATED (see "invokables.lisp" in sources)
|
||||
|
||||
Q_INVOKABLE void setParams(const QStringList& x1, const QStringList& x2) {
|
||||
eql_fun("eql-user:set-params",
|
||||
Q_ARG(QStringList, x1),
|
||||
Q_ARG(QStringList, x2)); }
|
||||
|
||||
Q_INVOKABLE void setUrl(const QString& x1) {
|
||||
eql_fun("eql-user:set-url",
|
||||
Q_ARG(QString, x1)); }
|
||||
|
||||
1
examples/M-modules/web-kit-engine/lib/webkit_bridge.cpp
Normal file
1
examples/M-modules/web-kit-engine/lib/webkit_bridge.cpp
Normal file
|
|
@ -0,0 +1 @@
|
|||
// current file bug count: 00.00
|
||||
31
examples/M-modules/web-kit-engine/lib/webkit_bridge.h
Normal file
31
examples/M-modules/web-kit-engine/lib/webkit_bridge.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef LIB_H
|
||||
#define LIB_H
|
||||
|
||||
#include <QtWidgets>
|
||||
#include <QtWebKitWidgets>
|
||||
#include <eql_fun.h>
|
||||
|
||||
#ifdef Q_CC_MSVC
|
||||
#define LIB_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define LIB_EXPORT
|
||||
#endif
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class CPP : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
#include "_invokables.h"
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
LIB_EXPORT QObject* ini() {
|
||||
static QObject* cpp = 0;
|
||||
if(!cpp) {
|
||||
cpp = new CPP; }
|
||||
return cpp; }}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
||||
20
examples/M-modules/web-kit-engine/lib/webkit_bridge.pro
Normal file
20
examples/M-modules/web-kit-engine/lib/webkit_bridge.pro
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
QT += webkitwidgets
|
||||
TEMPLATE = lib
|
||||
CONFIG += plugin release
|
||||
INCLUDEPATH += ../../../../src
|
||||
LIBS += -L../../../.. -leql5
|
||||
DESTDIR = ./
|
||||
TARGET = webkit_bridge
|
||||
OBJECTS_DIR = ./tmp/
|
||||
MOC_DIR = ./tmp/
|
||||
|
||||
macx:QT += network
|
||||
|
||||
win32 {
|
||||
include(../../../../src/windows.pri)
|
||||
}
|
||||
|
||||
HEADERS += _invokables.h \
|
||||
webkit_bridge.h
|
||||
SOURCES += webkit_bridge.cpp
|
||||
|
||||
9
examples/M-modules/web-kit-engine/qt.lisp
Normal file
9
examples/M-modules/web-kit-engine/qt.lisp
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
;;; generate C++ glue code
|
||||
;;; (see "invokables.lisp" in sources)
|
||||
|
||||
(progn
|
||||
(load (in-home "src/lisp/invokables"))
|
||||
(load "web-kit-engine")
|
||||
(generate-invokables "lib/")
|
||||
(qq))
|
||||
|
||||
BIN
examples/M-modules/web-kit-engine/screenshot/web-kit-engine.png
Normal file
BIN
examples/M-modules/web-kit-engine/screenshot/web-kit-engine.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 144 KiB |
33
examples/M-modules/web-kit-engine/web-kit-engine.htm
Normal file
33
examples/M-modules/web-kit-engine/web-kit-engine.htm
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
h3 { color: white; background-color: steelblue; }
|
||||
.lab1 { position: absolute; top: 4%; width: 98%; }
|
||||
.lab2 { position: absolute; top: 50%; width: 98%; }
|
||||
.web1 { position: absolute; top: 11%; width: 98%; height: 40%; }
|
||||
.web2 { position: absolute; top: 58%; width: 98%; height: 40%; }
|
||||
</style>
|
||||
</head>
|
||||
<body style="font-family: sans-serif; font-size: 14px;">
|
||||
<input id="url" type="text" size="75" onkeypress="keyPressed(event, this.value)">
|
||||
<label>
|
||||
<input type="checkbox" checked onclick="Lisp.setParams('parallel-browsing', this.checked)">
|
||||
parallel browsing
|
||||
</label>
|
||||
<label>
|
||||
<input type="checkbox" checked onclick="Lisp.setParams('parallel-scrolling', this.checked)">
|
||||
parallel scrolling
|
||||
</label>
|
||||
<!-- WebKit -->
|
||||
<h3 class="lab1"> WebKit</h3><br>
|
||||
<object type="application/x-web-kit" id="web-kit" class="web1">
|
||||
</object>
|
||||
<!-- WebEngine -->
|
||||
<h3 class="lab2"> WebEngine</h3><br>
|
||||
<object type="application/x-web-engine" id="web-engine" class="web2">
|
||||
</object>
|
||||
<script> function keyPressed(event, text) { if(event.keyCode == 13) Lisp.setUrl(text); } </script>
|
||||
</body>
|
||||
</html>
|
||||
123
examples/M-modules/web-kit-engine/web-kit-engine.lisp
Normal file
123
examples/M-modules/web-kit-engine/web-kit-engine.lisp
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
;;; WebKit & WebEngine as plugin widgets in WebKit
|
||||
;;;
|
||||
;;; "Just For Fun"
|
||||
|
||||
#-qt-wrapper-functions ; see README-OPTIONAL.txt
|
||||
(load (in-home "src/lisp/all-wrappers"))
|
||||
|
||||
(qrequire :webkit)
|
||||
(qrequire :webengine)
|
||||
|
||||
(in-package :eql-user)
|
||||
|
||||
(defvar *web-view* (qnew "QWebView")) ; browser 1
|
||||
(defvar *web-engine-view* (qnew "QWebEngineView")) ; browser 2
|
||||
(defvar *main-view* (qnew "QWebView")) ; container
|
||||
(defvar *webkit-bridge* (qload-c++ "lib/webkit_bridge"))
|
||||
|
||||
(defparameter *parallel-browsing* t)
|
||||
(defparameter *parallel-scrolling* t)
|
||||
(defparameter *scroll-position-1* 0)
|
||||
(defparameter *scroll-position-2* 0)
|
||||
(defparameter *scroll-max-1* nil)
|
||||
(defparameter *scroll-max-2* nil)
|
||||
(defparameter *scrollbar-to-sync* nil)
|
||||
|
||||
(defun frame ()
|
||||
(|mainFrame| (|page| *main-view*)))
|
||||
|
||||
(defun js-webkit (expression view)
|
||||
(qvariant-value (|evaluateJavaScript| (|mainFrame| (|page| view)) expression)))
|
||||
|
||||
(defun js-webengine (expression view &optional function)
|
||||
(if function
|
||||
(|runJavaScript| (|page| view) expression function)
|
||||
(|runJavaScript| (|page| view) expression)))
|
||||
|
||||
(defun set-params (arg-names arg-values)
|
||||
"Qt: void setParams(QStringList, QStringList)" ; for JS
|
||||
(mapc (lambda (name value)
|
||||
(cond ((string= "parallel-browsing" name)
|
||||
(setf *parallel-browsing* (string= "true" value)))
|
||||
((string= "parallel-scrolling" name)
|
||||
(setf *parallel-scrolling* (string= "true" value)))))
|
||||
arg-names arg-values))
|
||||
|
||||
(defun set-url (name)
|
||||
"Qt: void setUrl(QString)" ; for JS
|
||||
(setf *scroll-position-1* 0
|
||||
*scroll-position-2* 0
|
||||
*scroll-max-1* nil
|
||||
*scroll-max-2* nil)
|
||||
(js-webkit (format nil "document.getElementById('url').value = ~S" name)
|
||||
*main-view*)
|
||||
(qlet ((url (qnew "QUrl(QString)" name)))
|
||||
(dolist (view (list *web-view* *web-engine-view*))
|
||||
(unless (string= name (|toString| (|url| view)))
|
||||
(|setUrl| view url)))))
|
||||
|
||||
(defun get-scroll-max (view)
|
||||
(let ((exp "document.body.scrollHeight - window.innerHeight"))
|
||||
(cond ((qeql *web-view* view)
|
||||
(setf *scroll-max-1* (js-webkit exp *web-view*)))
|
||||
((qeql *web-engine-view* view)
|
||||
(js-webengine exp *web-engine-view*
|
||||
(lambda (max) (setf *scroll-max-2* max)))))))
|
||||
|
||||
(defun sync-scrollbar (other)
|
||||
(when *parallel-scrolling*
|
||||
(qsingle-shot 500 (lambda () (setf *scrollbar-to-sync* nil))) ; prevent recursion loops
|
||||
(unless *scrollbar-to-sync*
|
||||
(setf *scrollbar-to-sync* other))
|
||||
(when (eql other *scrollbar-to-sync*) ; see above
|
||||
(get-scroll-max *web-view*)
|
||||
(get-scroll-max *web-engine-view*) ; async
|
||||
(let ((f (if (and *scroll-max-1* *scroll-max-2* (plusp *scroll-max-2*))
|
||||
(/ *scroll-max-1* *scroll-max-2*)
|
||||
1)))
|
||||
(case other
|
||||
(1 (js-webkit
|
||||
(format nil "window.scrollTo(0, ~D)" (truncate (* *scroll-position-2* f)))
|
||||
*web-view*))
|
||||
(2 (js-webengine
|
||||
(format nil "window.scrollTo(0, ~D)" (truncate (/ *scroll-position-1* f)))
|
||||
*web-engine-view*)))))))
|
||||
|
||||
(defun ini-container ()
|
||||
(let ((web-plugin (qnew "QWebPluginFactory(QObject*)" *main-view*))
|
||||
(settings (|settings| *main-view*)))
|
||||
(|setAttribute| settings |QWebSettings.PluginsEnabled| t)
|
||||
(qoverride web-plugin "create(QString,QUrl,QStringList,QStringList)"
|
||||
(lambda (mime-type url arg-names arg-values)
|
||||
(cond ((string= "application/x-web-kit" mime-type)
|
||||
(set-params arg-names arg-values)
|
||||
*web-view*)
|
||||
((string= "application/x-web-engine" mime-type)
|
||||
(set-params arg-names arg-values)
|
||||
*web-engine-view*))))
|
||||
(|setPluginFactory| (|page| *main-view*) web-plugin))
|
||||
(qconnect (frame) "javaScriptWindowObjectCleared()"
|
||||
(lambda ()
|
||||
(|addToJavaScriptWindowObject| (frame) "Lisp" *webkit-bridge*)))
|
||||
(|setUrl| *main-view* (|fromUserInput.QUrl| (namestring (probe-file "web-kit-engine.htm"))))
|
||||
(|showMaximized| *main-view*))
|
||||
|
||||
(defun ini-browsers ()
|
||||
(dolist (view (list *web-view* *web-engine-view*))
|
||||
(qconnect view "urlChanged(QUrl)"
|
||||
(lambda (url)
|
||||
(when *parallel-browsing*
|
||||
(set-url (|toString| url))))))
|
||||
(qconnect (|page| *web-view*) "scrollRequested(int,int,QRect)"
|
||||
(lambda (x y rect)
|
||||
(decf *scroll-position-1* y)
|
||||
(sync-scrollbar 2)))
|
||||
(qconnect (|page| *web-engine-view*) "scrollPositionChanged(QPointF)"
|
||||
(lambda (pos)
|
||||
(setf *scroll-position-2* (truncate (second pos)))
|
||||
(sync-scrollbar 1))))
|
||||
|
||||
(progn
|
||||
(ini-container)
|
||||
(ini-browsers)
|
||||
(set-url "http://planet.lisp.org/"))
|
||||
Loading…
Add table
Reference in a new issue