Une petite bibliothèque de vues Web multiplateforme pour C/C++ permettant de créer des interfaces graphiques multiplateformes modernes.
L'objectif du projet est de créer une couche d'abstraction d'interface utilisateur HTML5 commune pour les plateformes les plus utilisées.
Il prend en charge les liaisons JavaScript bidirectionnelles (pour appeler JavaScript à partir de C/C++ et pour appeler C/C++ à partir de JavaScript).
Note
La liaison linguistique pour Go a été déplacée. Les versions <= 0.1.1 sont disponibles dans ce référentiel.
Plate-forme | Technologies |
---|---|
Linux | GTK, WebKitGTK |
macOS | Cacao, WebKit |
Fenêtres | API Windows, WebView2 |
La documentation la plus à jour se trouve directement dans le code source. L'amélioration de la documentation est un effort continu et vous êtes plus que bienvenu pour contribuer.
Votre compilateur doit prendre en charge au minimum C++11, sauf pour les plateformes qui nécessitent une version plus moderne.
Ce projet utilise CMake et Ninja et, bien que recommandés pour votre commodité, ces outils ne sont pas requis pour utiliser la bibliothèque.
Les bibliothèques GTK et WebKitGTK sont requises pour le développement et la distribution. Vous devez vérifier vos référentiels de packages pour connaître les packages à installer.
apt install libgtk-4-dev libwebkitgtk-6.0-dev
apt install libgtk-4-1 libwebkitgtk-6.0-4
apt install libgtk-3-dev libwebkit2gtk-4.1-dev
apt install libgtk-3-0 libwebkit2gtk-4.1-0
apt install libgtk-3-dev libwebkit2gtk-4.0-dev
apt install libgtk-3-0 libwebkit2gtk-4.0-37
dnf install gtk4-devel webkitgtk6.0-devel
dnf install gtk4 webkitgtk6.0
dnf install gtk3-devel webkit2gtk4.1-devel
dnf install gtk3 webkit2gtk4.1
dnf install gtk3-devel webkit2gtk4.0-devel
dnf install gtk3 webkit2gtk4.0
pkg install webkit2-gtk4
pkg install webkit2-gtk3
pkg-config
avec --cflags
et --libs
pour obtenir les options du compilateur/éditeur de liens pour l'un de ces ensembles de modules :gtk4 webkitgtk-6.0
gtk+-3.0 webkit2gtk-4.1
gtk+-3.0 webkit2gtk-4.0
dl
WebKit
dl
advapi32 ole32 shell32 shlwapi user32 version
wxallowed
(voir mount(8)) à votre fstab pour contourner la protection mémoire W^X pour votre exécutable. Veuillez voir si cela fonctionne sans désactiver au préalable cette fonctionnalité de sécurité.Votre compilateur doit prendre en charge C++14 et nous vous recommandons de le coupler avec un SDK Windows 10 à jour.
Pour Visual C++, nous recommandons Visual Studio 2022 ou version ultérieure. Il existe certaines exigences lors de l'utilisation de MinGW-w64.
Les développeurs et les utilisateurs finaux doivent avoir le runtime WebView2 installé sur leur système pour toute version de Windows antérieure à Windows 11.
Si vous êtes un développeur de ce projet, veuillez vous rendre dans la section développement.
Vous disposerez d’une application fonctionnelle, mais nous vous encourageons à explorer les exemples disponibles.
Créez les fichiers suivants dans un nouveau répertoire :
.gitignore
:
# Build artifacts
/build
CMakeLists.txt
:
cmake_minimum_required ( VERSION 3.16)
project (example LANGUAGES CXX)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /bin" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
include (FetchContent)
FetchContent_Declare(
webview
GIT_REPOSITORY https://github.com/webview/webview
GIT_TAG 0.12.0)
FetchContent_MakeAvailable(webview)
add_executable (example WIN32 )
target_sources (example PRIVATE main.cc)
target_link_libraries (example PRIVATE webview::core)
main.cc
:
# include " webview/webview.h "
# include < iostream >
# ifdef _WIN32
int WINAPI WinMain (HINSTANCE /* hInst */ , HINSTANCE /* hPrevInst */ ,
LPSTR /* lpCmdLine */ , int /* nCmdShow */ ) {
# else
int main () {
#endif
try {
webview::webview w ( false , nullptr );
w. set_title ( " Basic Example " );
w. set_size ( 480 , 320 , WEBVIEW_HINT_NONE);
w. set_html ( " Thanks for using webview! " );
w. run ();
} catch ( const webview:: exception &e) {
std::cerr << e. what () << ' n ' ;
return 1 ;
}
return 0 ;
}
CMakeLists.txt
:
cmake_minimum_required ( VERSION 3.16)
project (example LANGUAGES C CXX)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /bin" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
include (FetchContent)
FetchContent_Declare(
webview
GIT_REPOSITORY https://github.com/webview/webview
GIT_TAG 0.12.0)
FetchContent_MakeAvailable(webview)
add_executable (example WIN32 )
target_sources (example PRIVATE main.c)
target_link_libraries (example PRIVATE webview::core_static)
main.c
:
# include " webview/webview.h "
# include < stddef.h >
# ifdef _WIN32
# include < windows.h >
# endif
# ifdef _WIN32
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine,
int nCmdShow) {
( void )hInst;
( void )hPrevInst;
( void )lpCmdLine;
( void )nCmdShow;
# else
int main ( void ) {
#endif
webview_t w = webview_create ( 0 , NULL );
webview_set_title (w, " Basic Example " );
webview_set_size (w, 480 , 320 , WEBVIEW_HINT_NONE);
webview_set_html (w, " Thanks for using webview! " );
webview_run (w);
webview_destroy (w);
return 0 ;
}
Construisez le projet :
cmake -G Ninja -B build -S . -D CMAKE_BUILD_TYPE=Release
cmake --build build
Recherchez l'exécutable dans le répertoire build/bin
.
Une bibliothèque fusionnée peut être créée lors de la construction du projet à l'aide de CMake, ou le script amalgamate.py
peut être invoqué directement.
Ce dernier est décrit ci-dessous.
python3 scripts/amalgamate.py --output webview_amalgamation.h core/include/webview/webview.h
Voir python3 scripts/amalgamate.py --help
pour l'utilisation des scripts.
Voici un exemple pour appeler directement des compilateurs de type GCC/Clang. Utilisez le fichier main.cc
de l'exemple précédent.
Placez soit l'en-tête webview.h
fusionné, soit tous les fichiers individuels dans libs/webview
, et WebView2.h
de MS WebView2 dans libs
.
Construisez le projet sur la plateforme de votre choix.
c++ main.cc -O2 --std=c++11 -Ilibs -framework WebKit -ldl -o example
c++ main.cc -O2 --std=c++11 -Ilibs $(pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.1) -ldl -o example
c++ main.cc -O2 --std=c++14 -static -mwindows -Ilibs -ladvapi32 -lole32 -lshell32 -lshlwapi -luser32 -lversion -o example
Les cibles CMake suivantes sont disponibles :
Nom | Description |
---|---|
webview::core | En-têtes pour C++. |
webview::core_shared | Bibliothèque partagée pour C. |
webview::core_static | Bibliothèque statique pour C. |
Cibles spéciales pour les contrôles à la demande et les tâches associées :
Nom | Description |
---|---|
webview_format_check | Vérifiez les fichiers au format clang. |
webview_reformat | Reformater les fichiers au format clang. |
Les options booléennes suivantes peuvent être utilisées lors de la construction du projet WebView de manière autonome ou lors de sa construction dans le cadre de votre projet (par exemple avec FetchContent).
Option | Description |
---|---|
WEBVIEW_BUILD | Activer la construction |
WEBVIEW_BUILD_AMALGAMATION | Construire une bibliothèque fusionnée |
WEBVIEW_BUILD_DOCS | Construire la documentation |
WEBVIEW_BUILD_EXAMPLES | Créer des exemples |
WEBVIEW_BUILD_SHARED_LIBRARY | Créer des bibliothèques partagées |
WEBVIEW_BUILD_STATIC_LIBRARY | Créer des bibliothèques statiques |
WEBVIEW_BUILD_TESTS | Construire des tests |
WEBVIEW_ENABLE_CHECKS | Activer les contrôles |
WEBVIEW_ENABLE_CLANG_FORMAT | Activer le format Clang |
WEBVIEW_ENABLE_CLANG_TIDY | Activer clang-tidy |
WEBVIEW_ENABLE_PACKAGING | Activer l'emballage |
WEBVIEW_INSTALL_DOCS | Installer la documentation |
WEBVIEW_INSTALL_TARGETS | Installer des cibles |
WEBVIEW_IS_CI | Initialisé par la variable d'environnement CI |
WEBVIEW_PACKAGE_AMALGAMATION | Bibliothèque fusionnée de packages |
WEBVIEW_PACKAGE_DOCS | Documentation du paquet |
WEBVIEW_PACKAGE_HEADERS | En-têtes de packages |
WEBVIEW_PACKAGE_LIB | Bibliothèques compilées de packages |
WEBVIEW_STRICT_CHECKS | Rendre les contrôles stricts |
WEBVIEW_STRICT_CLANG_FORMAT | Rendre la vérification du format Clang stricte |
WEBVIEW_STRICT_CLANG_TIDY | Rendre le contrôle clang-tidy strict |
WEBVIEW_USE_COMPAT_MINGW | Utiliser l'assistant de compatibilité pour MinGW |
WEBVIEW_USE_STATIC_MSVC_RUNTIME | Utiliser la bibliothèque d'exécution statique (MSVC) |
Note
Les vérifications sont activées par défaut, mais ne sont pas appliquées par défaut pour le développement local (contrôlé par l'option WEBVIEW_IS_CI
).
Options non booléennes :
Option | Description |
---|---|
WEBVIEW_CLANG_FORMAT_EXE | Chemin de l'exécutable clang-format . |
WEBVIEW_CLANG_TIDY_EXE | Chemin de l'exécutable clang-tidy . |
Ces options peuvent être utilisées lors de l’utilisation du package webview CMake.
Option | Description |
---|---|
WEBVIEW_WEBKITGTK_API | API WebKitGTK pour s'interfacer avec, par exemple 6.0 , 4.1 (recommandé) ou 4.0 . Cela décidera également automatiquement de la version GTK. Utilise par défaut la dernière API recommandée si disponible, ou la dernière API connue et disponible. Notez qu'il peut exister des différences majeures entre les versions d'API qui peuvent affecter la disponibilité des fonctionnalités. Consultez la documentation de l'API WebView pour plus de détails sur la disponibilité des fonctionnalités. |
Option | Description |
---|---|
WEBVIEW_MSWEBVIEW2_VERSION | Version MS WebView2, par exemple 1.0.1150.38 . |
WEBVIEW_USE_BUILTIN_MSWEBVIEW2 | Utilisez MS WebView2 intégré. |
Ces options peuvent être spécifiées en tant que macros de préprocesseur pour modifier la construction, mais ne sont pas nécessaires lors de l'utilisation de CMake.
Nom | Description |
---|---|
WEBVIEW_API | Contrôle la liaison de l'API C, la visibilité des symboles et s'il s'agit d'une bibliothèque partagée. Par défaut, c'est inline pour C++ et extern pour C. |
WEBVIEW_BUILD_SHARED | Modifie WEBVIEW_API pour créer une bibliothèque partagée. |
WEBVIEW_SHARED | Modifie WEBVIEW_API pour utiliser une bibliothèque partagée. |
WEBVIEW_STATIC | Modifie WEBVIEW_API pour créer ou utiliser une bibliothèque statique. |
Nom | Description |
---|---|
WEBVIEW_GTK | Compilez le backend GTK/WebKitGTK. |
WEBVIEW_COCOA | Compilez le backend Cocoa/WebKit. |
WEBVIEW_EDGE | Compilez le backend Win32/WebView2. |
Option | Description |
---|---|
WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL | Active ( 1 ) ou désactive ( 0 ) l'implémentation intégrée du chargeur WebView2. L'activation de cette option évite d'avoir besoin de WebView2Loader.dll mais si la DLL est présente, la DLL est prioritaire. Cette option est activée par défaut. |
WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK | Active ( 1 ) ou désactive ( 0 ) la liaison explicite de WebView2Loader.dll . L'activation de cela évite d'avoir besoin de bibliothèques d'importation ( *.lib ). Cette option est activée par défaut si WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL est activé. |
Afin de créer cette bibliothèque à l'aide de MinGW-w64 sous Windows, elle doit prendre en charge C++14 et disposer d'un SDK Windows à jour.
Distributions connues pour être compatibles :
Lier la partie chargeur WebView2 du SDK Microsoft WebView2 n'est pas une exigence stricte lors de l'utilisation de notre bibliothèque WebView, et la distribution WebView2Loader.dll
avec votre application ne l'est pas non plus.
Toutefois, si WebView2Loader.dll
est chargeable au moment de l'exécution, par exemple à partir du répertoire de l'exécutable, alors il sera utilisé ; sinon notre implémentation minimaliste sera utilisée à la place.
Si vous souhaitez utiliser le chargeur officiel, n'oubliez pas de le distribuer avec votre application, sauf si vous le liez de manière statique. Le lier statiquement est possible avec Visual C++ mais pas avec MinGW-w64.
Voici quelques-unes des différences notables entre notre implémentation du chargeur et l’implémentation officielle :
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
.Les options de personnalisation peuvent être utilisées pour modifier la façon dont la bibliothèque intègre le chargeur WebView2.
Ce projet utilise le système de build CMake.
En plus des dépendances mentionnées précédemment dans ce document pour le développement avec la bibliothèque WebView, les éléments suivants sont utilisés lors du développement de la bibliothèque WebView.
clang-format
clang-tidy
cmake -G " Ninja Multi-Config " -B build -S .
cmake --build build --config CONFIG
Remplacez CONFIG
par l'un des Debug
, Release
ou Profile
. Utilisez Profile
pour activer la couverture de code (GCC/Clang).
Exécutez des tests :
ctest --test-dir build --build-config CONFIG
Générer un rapport de couverture de test :
gcovr
Recherchez le rapport de couverture dans build/coverage
.
Exécutez ceci après avoir créé les configurations Debug
et Release
du projet :
cd build
cpack -G External -C " Debug;Release " --config CPackConfig.cmake
Voir les fichiers de la chaîne d'outils CMake dans le répertoire cmake/toolchains
.
Par exemple, cela cible Windows x64 sur Linux avec des threads POSIX :
cmake -G " Ninja Multi-Config " -B build -S . -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/x86_64-w64-mingw32.cmake -D WEBVIEW_TOOLCHAIN_EXECUTABLE_SUFFIX=-posix
cmake --build build --config CONFIG
Étant donné qu'un moteur de navigateur n'est pas un navigateur Web complet, il peut ne pas prendre en charge toutes les fonctionnalités que vous pouvez attendre d'un navigateur. Si vous constatez qu'une fonctionnalité ne fonctionne pas comme prévu, veuillez consulter la documentation du moteur du navigateur et ouvrir un ticket si vous pensez que la bibliothèque devrait la prendre en charge.
Par exemple, la bibliothèque ne tente pas de prendre en charge les fonctionnalités d'interaction utilisateur telles que alert()
, confirm()
et prompt()
ainsi que d'autres fonctionnalités non essentielles telles que console.log()
.
Langue | Projet |
---|---|
Ada | thechampagne/webview-ada |
Chignon | tr1ckydev/webview-bun |
C# | vue Web/webview_csharp |
C3 | lechampagne/webview-c3 |
Cristal | naqvis/webview |
D | thechampagne/webview-d, ronnie-w/webviewd |
Déno | webview/webview_deno |
Aller | webview/webview_go |
Port | EricLendvai/Harbour_WebView |
Haskell | lettier/webviewhs |
Jeanne | janet-lang/webview |
Java | vue web/webview_java |
Kotlin | Voyages d'hiver/webviewko |
Nim | oskca/webview, neroist/webview |
Noeud.js | Voyages d'hiver/webview-nodejs |
Odin | lechampagne/webview-odin |
Pascal | PierceNg/fpwebview |
Python | congzhangzh/webview_python,zserge/webview-python |
PHP | 0hr/php-webview |
Rubis | Maaarcocr/webview_ruby |
Rouiller | Boscop/vue Web |
Rapide | jakenvac/SwiftWebview |
V | malisipi/mui, ttytm/webview |
Zig | thechampagne/webview-zig |
Si vous souhaitez ajouter des liaisons à la liste, n'hésitez pas à soumettre une pull request ou à ouvrir un ticket.
Vous pouvez générer vous-même des liaisons pour la bibliothèque à l'aide de l'interface SWIG incluse ( webview.i
).
Voici quelques exemples pour vous aider à démarrer. Les lignes de commande de style Unix sont utilisées par souci de concision.
mkdir -p build/bindings/{python,csharp,java,ruby}
swig -c++ -python -outdir build/bindings/python -o build/bindings/python/python_wrap.cpp webview.i
swig -c++ -csharp -outdir build/bindings/csharp -o build/bindings/csharp/csharp_wrap.cpp webview.i
swig -c++ -java -outdir build/bindings/java -o build/bindings/java/java_wrap.cpp webview.i
swig -c++ -ruby -outdir build/bindings/ruby -o build/bindings/ruby/ruby_wrap.cpp webview.i
Le code est distribué sous licence MIT, n'hésitez pas à l'utiliser également dans vos projets propriétaires.