Uma pequena biblioteca de webview multiplataforma para C/C++ para construir GUIs modernas de plataforma cruzada.
O objetivo do projeto é criar uma camada de abstração de UI HTML5 comum para as plataformas mais utilizadas.
Ele suporta ligações JavaScript bidirecionais (para chamar JavaScript de C/C++ e para chamar C/C++ de JavaScript).
Observação
A vinculação de idioma para Go foi movida. Versões <= 0.1.1 estão disponíveis neste repositório.
Plataforma | Tecnologias |
---|---|
Linux | GTK, WebKitGTK |
macOS | Cacau, WebKit |
Windows | API do Windows, WebView2 |
A documentação mais atualizada está no código-fonte. Melhorar a documentação é um esforço contínuo e você está convidado a contribuir.
Seu compilador deve suportar no mínimo C++11, exceto para plataformas que exigem uma versão mais moderna.
Este projeto usa CMake e Ninja e, embora sejam recomendadas para sua conveniência, essas ferramentas não são necessárias para usar a biblioteca.
As bibliotecas GTK e WebKitGTK são necessárias para desenvolvimento e distribuição. Você precisa verificar seus repositórios de pacotes para saber quais pacotes instalar.
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
com --cflags
e --libs
para obter as opções do compilador/vinculador para um destes conjuntos de módulos: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
(veja mount(8)) ao seu fstab para ignorar a proteção de memória W^X para seu executável. Por favor, veja se funciona sem desabilitar este recurso de segurança primeiro.Seu compilador deve dar suporte a C++14 e recomendamos emparelhá-lo com um SDK do Windows 10 atualizado.
Para Visual C++, recomendamos o Visual Studio 2022 ou posterior. Existem alguns requisitos ao usar o MinGW-w64.
Os desenvolvedores e usuários finais devem ter o tempo de execução WebView2 instalado em seus sistemas para qualquer versão do Windows anterior ao Windows 11.
Se você é um desenvolvedor deste projeto, vá para a seção de desenvolvimento.
Você terá um aplicativo funcional, mas recomendamos explorar os exemplos disponíveis.
Crie os seguintes arquivos em um novo diretório:
.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 ;
}
Construa o projeto:
cmake -G Ninja -B build -S . -D CMAKE_BUILD_TYPE=Release
cmake --build build
Encontre o executável no diretório build/bin
.
Uma biblioteca amalgamada pode ser construída ao construir o projeto usando CMake, ou o script amalgamate.py
pode ser invocado diretamente.
Este último é descrito abaixo.
python3 scripts/amalgamate.py --output webview_amalgamation.h core/include/webview/webview.h
Consulte python3 scripts/amalgamate.py --help
para uso de script.
Aqui está um exemplo para invocar compiladores do tipo GCC/Clang diretamente. Use o arquivo main.cc
do exemplo anterior.
Coloque o cabeçalho webview.h
amalgamado ou todos os arquivos individuais em libs/webview
e WebView2.h
do MS WebView2 em libs
.
Construa o projeto na plataforma escolhida.
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
Os seguintes destinos CMake estão disponíveis:
Nome | Descrição |
---|---|
webview::core | Cabeçalhos para C++. |
webview::core_shared | Biblioteca compartilhada para C. |
webview::core_static | Biblioteca estática para C. |
Alvos especiais para verificações sob demanda e tarefas relacionadas:
Nome | Descrição |
---|---|
webview_format_check | Verifique os arquivos com formato clang. |
webview_reformat | Reformate arquivos com formato clang. |
As seguintes opções booleanas podem ser usadas ao construir o projeto webview de forma independente ou ao construí-lo como parte do seu projeto (por exemplo, com FetchContent).
Opção | Descrição |
---|---|
WEBVIEW_BUILD | Habilitar construção |
WEBVIEW_BUILD_AMALGAMATION | Construa uma biblioteca amalgamada |
WEBVIEW_BUILD_DOCS | Documentação de construção |
WEBVIEW_BUILD_EXAMPLES | Construir exemplos |
WEBVIEW_BUILD_SHARED_LIBRARY | Crie bibliotecas compartilhadas |
WEBVIEW_BUILD_STATIC_LIBRARY | Crie bibliotecas estáticas |
WEBVIEW_BUILD_TESTS | Construir testes |
WEBVIEW_ENABLE_CHECKS | Habilitar verificações |
WEBVIEW_ENABLE_CLANG_FORMAT | Habilitar formato clang |
WEBVIEW_ENABLE_CLANG_TIDY | Ativar clang-tidy |
WEBVIEW_ENABLE_PACKAGING | Ativar embalagem |
WEBVIEW_INSTALL_DOCS | Instalar documentação |
WEBVIEW_INSTALL_TARGETS | Instalar destinos |
WEBVIEW_IS_CI | Inicializado pela variável de ambiente CI |
WEBVIEW_PACKAGE_AMALGAMATION | Biblioteca amalgamada de pacotes |
WEBVIEW_PACKAGE_DOCS | Documentação do pacote |
WEBVIEW_PACKAGE_HEADERS | Cabeçalhos de pacote |
WEBVIEW_PACKAGE_LIB | Bibliotecas compiladas por pacotes |
WEBVIEW_STRICT_CHECKS | Faça verificações rigorosas |
WEBVIEW_STRICT_CLANG_FORMAT | Torne a verificação do formato clang rigorosa |
WEBVIEW_STRICT_CLANG_TIDY | Torne a verificação do clang-tidy rigorosa |
WEBVIEW_USE_COMPAT_MINGW | Use auxiliar de compatibilidade para MinGW |
WEBVIEW_USE_STATIC_MSVC_RUNTIME | Use biblioteca de tempo de execução estática (MSVC) |
Observação
As verificações são habilitadas por padrão, mas não são aplicadas por padrão para desenvolvimento local (controlado pela opção WEBVIEW_IS_CI
).
Opções não booleanas:
Opção | Descrição |
---|---|
WEBVIEW_CLANG_FORMAT_EXE | Caminho do executável clang-format . |
WEBVIEW_CLANG_TIDY_EXE | Caminho do executável clang-tidy . |
Essas opções podem ser usadas ao usar o pacote webview CMake.
Opção | Descrição |
---|---|
WEBVIEW_WEBKITGTK_API | API WebKitGTK para interface, por exemplo, 6.0 , 4.1 (recomendado) ou 4.0 . Isso também decidirá automaticamente a versão do GTK. Usa a API recomendada mais recente por padrão, se disponível, ou a API mais recente conhecida e disponível. Observe que pode haver grandes diferenças entre as versões da API que podem afetar a disponibilidade dos recursos. Consulte a documentação da API webview para obter detalhes sobre a disponibilidade de recursos. |
Opção | Descrição |
---|---|
WEBVIEW_MSWEBVIEW2_VERSION | Versão do MS WebView2, por exemplo 1.0.1150.38 . |
WEBVIEW_USE_BUILTIN_MSWEBVIEW2 | Use o MS WebView2 integrado. |
Essas opções podem ser especificadas como macros de pré-processador para modificar a compilação, mas não são necessárias ao usar o CMake.
Nome | Descrição |
---|---|
WEBVIEW_API | Controla a ligação da API C, a visibilidade do símbolo e se é uma biblioteca compartilhada. Por padrão, isso é inline para C++ e extern para C. |
WEBVIEW_BUILD_SHARED | Modifica WEBVIEW_API para construir uma biblioteca compartilhada. |
WEBVIEW_SHARED | Modifica WEBVIEW_API para usar uma biblioteca compartilhada. |
WEBVIEW_STATIC | Modifica WEBVIEW_API para construir ou usar uma biblioteca estática. |
Nome | Descrição |
---|---|
WEBVIEW_GTK | Compile o back-end GTK/WebKitGTK. |
WEBVIEW_COCOA | Compile o back-end do Cocoa/WebKit. |
WEBVIEW_EDGE | Compile o back-end Win32/WebView2. |
Opção | Descrição |
---|---|
WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL | Habilita ( 1 ) ou desabilita ( 0 ) a implementação integrada do carregador WebView2. Ativar isso evita a necessidade de WebView2Loader.dll , mas se a DLL estiver presente, a DLL terá prioridade. Esta opção está habilitada por padrão. |
WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK | Ativa ( 1 ) ou desativa ( 0 ) a vinculação explícita de WebView2Loader.dll . Ativar isso evita a necessidade de importar bibliotecas ( *.lib ). Esta opção é habilitada por padrão se WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL estiver habilitado. |
Para construir esta biblioteca usando MinGW-w64 no Windows, ela deve suportar C++14 e ter um Windows SDK atualizado.
Distribuições que são conhecidas por serem compatíveis:
Vincular a parte do carregador WebView2 do Microsoft WebView2 SDK não é um requisito difícil ao usar nossa biblioteca webview, nem distribuir WebView2Loader.dll
com seu aplicativo.
Se, no entanto, WebView2Loader.dll
puder ser carregado em tempo de execução, por exemplo, a partir do diretório do executável, então ele será usado; caso contrário, nossa implementação minimalista será usada.
Se você desejar usar o carregador oficial, lembre-se de distribuí-lo junto com seu aplicativo, a menos que você o vincule estaticamente. Vinculá-lo estaticamente é possível com Visual C++, mas não com MinGW-w64.
Aqui estão algumas das maneiras notáveis pelas quais nossa implementação do carregador difere da implementação oficial:
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
.As opções de personalização podem ser usadas para alterar a forma como a biblioteca integra o carregador WebView2.
Este projeto usa o sistema de compilação CMake.
Além das dependências mencionadas anteriormente neste documento para desenvolvimento com a biblioteca webview, as seguintes são usadas durante o desenvolvimento da biblioteca webview.
clang-format
clang-tidy
cmake -G " Ninja Multi-Config " -B build -S .
cmake --build build --config CONFIG
Substitua CONFIG
por Debug
, Release
ou Profile
. Use Profile
para ativar a cobertura de código (GCC/Clang).
Execute testes:
ctest --test-dir build --build-config CONFIG
Gere relatório de cobertura de teste:
gcovr
Encontre o relatório de cobertura em build/coverage
.
Execute isto depois de construir as configurações Debug
e Release
do projeto:
cd build
cpack -G External -C " Debug;Release " --config CPackConfig.cmake
Consulte os arquivos do conjunto de ferramentas CMake no diretório cmake/toolchains
.
Por exemplo, isso é direcionado ao Windows x64 no Linux com 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
Como um mecanismo de navegador não é um navegador completo, ele pode não suportar todos os recursos que você espera de um navegador. Se você descobrir que um recurso não funciona conforme o esperado, consulte a documentação do mecanismo do navegador e abra um problema se achar que a biblioteca deveria suportá-lo.
Por exemplo, a biblioteca não tenta oferecer suporte a recursos de interação do usuário como alert()
, confirm()
e prompt()
e outros recursos não essenciais como console.log()
.
Linguagem | Projeto |
---|---|
Ada | thechampagne/webview-ada |
Pão | tr1ckydev/webview-bun |
C# | webview/webview_csharp |
C3 | thechampagne/webview-c3 |
Cristal | naqvis/webview |
D | thechampagne/webview-d, ronnie-w/webviewd |
Deno | webview/webview_deno |
Ir | webview/webview_go |
Porto | EricLendvai/Harbour_WebView |
Haskell | lettier/webviewhs |
Janete | janet-lang/webview |
Java | webview/webview_java |
Kotlin | Winterreisender/webviewko |
Nim | oskca/webview, neroist/webview |
Node.js | Winterreisender/webview-nodejs |
Odin | thechampagne/webview-odin |
Pascal | PierceNg/fpwebview |
Pitão | congzhangzh/webview_python,zserge/webview-python |
PHP | 0h/php-webview |
Rubi | Maaarcocr/webview_ruby |
Ferrugem | Boscop/visualização na web |
Rápido | jakenvac/SwiftWebview |
V | malisipi/mui, ttytm/webview |
Ziguezague | thechampagne/webview-zig |
Se você deseja adicionar ligações à lista, sinta-se à vontade para enviar uma solicitação pull ou abrir um problema.
Você mesmo pode gerar ligações para a biblioteca usando a interface SWIG incluída ( webview.i
).
Aqui estão alguns exemplos para você começar. Linhas de comando no estilo Unix são usadas para concisão.
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
O código é distribuído sob licença do MIT, sinta-se à vontade para usá-lo também em seus projetos proprietários.