AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu
Ubuntu 上实现 AWTK-WIDGET-WEB-VIEW 开始以为很简单,后来发现是最麻烦的。因为 Ubuntu 上的 webview 库是 基于 GTK 的,而 AWTK 是基于 X11 的,两者的窗口系统不同,所以期间踩了几个大坑。

1. 编译
AWTK 在使用 Linux 的输入法时,链接了 GTK3,所以编译 webview 时也要链接 GTK3, 需要指定参数 WEBVIEW_WEBKITGTK_API=“4.0”。
3rd/build_linux.sh
cmake -S webview -B build -DWEBVIEW_WEBKITGTK_API="4.0" -DCMAKE_BUILD_TYPE=Debug
mkdir -p build/core/amalgamationcmake --build buildmkdir ../bin
cp -avf ./build/core/libwebview*.so* ../bin
2. 运行
GTK 在 Ubuntu 上默认使用 Wayland,但是 AWTK 使用的是 X11,所以在运行时,需要设置 GDK_BACKEND 为 x11,保证两者使用的是同一个窗口系统。
export GDK_BACKEND=x11
3. 创建窗口
在 Ubuntu 上,创建一个 GTK 窗口,然后将 webview 嵌入到这个窗口中。
不使用 webview 的主循环,在 AWTK 定时器中去处理 GTK 的事件,发现 webview 可以处理窗口事件,但窗口上没有显示内容,后来发现需要调用 gdk_window_process_all_updates()。
static int s_webview_count = 0;
static uint32_t s_timer_id = 0;static ret_t web_view_on_timer(const timer_info_t* timer) {g_main_context_iteration(NULL, FALSE);gdk_window_process_all_updates();return RET_REPEAT;
}static ret_t sdl_window_set_child(SDL_Window* parent, webview_os_window_t os_window, int x, int y,int w, int h) {SDL_SysWMinfo wmInfo;SDL_VERSION(&wmInfo.version);SDL_GetWindowWMInfo(parent, &wmInfo);Window parent_win = wmInfo.info.x11.window;Display* display = wmInfo.info.x11.display;GtkWindow* gtk_window = GTK_WINDOW(os_window);GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(gtk_window));Window win = gdk_x11_window_get_xid(gdk_window);XReparentWindow(display, win, parent_win, x, y);gtk_window_move(GTK_WINDOW(gtk_window), x, y);gtk_window_resize(GTK_WINDOW(gtk_window), w, h);return RET_OK;
}webview_os_window_t webview_os_window_create(SDL_Window* parent, int x, int y, int w, int h) {GtkWidget* gtk_window = gtk_window_new(GTK_WINDOW_POPUP);gtk_window_set_decorated(GTK_WINDOW(gtk_window), FALSE);gtk_window_move(GTK_WINDOW(gtk_window), x, y);gtk_window_resize(GTK_WINDOW(gtk_window), w, h);gtk_widget_show_all(gtk_window);if (s_webview_count == 0) {s_timer_id = timer_add(web_view_on_timer, NULL, 30);s_webview_count++;}sdl_window_set_child(parent, gtk_window, x, y, w, h);return (webview_os_window_t)gtk_window;
}
4. 调整窗口大小
调整窗口大小时,需要调整 GTK 窗口的大小。
遗憾的是窗口大小调整了,但是 webview 的内容并没有跟着调整,还需要进一步研究。
void webview_os_window_move_resize(SDL_Window* parent, webview_os_window_t subwindow, int x, int y,int w, int h) {GtkWidget* gtk_window = GTK_WIDGET(subwindow);gtk_window_move(GTK_WINDOW(gtk_window), x, y);gtk_window_resize(GTK_WINDOW(gtk_window), w, h);GList* children = gtk_container_get_children(GTK_CONTAINER(gtk_window));if (children != NULL) {GtkWidget* widget = GTK_WIDGET(children->data);gtk_widget_set_size_request(widget, w, h);}
}
5. 销毁窗口
销毁窗口时,需要销毁 GTK 窗口。在销毁最后一个窗口时,停止定时器。
void webview_os_window_destroy(webview_os_window_t subwindow) {GtkWidget* gtk_window = GTK_WIDGET(subwindow);gtk_widget_destroy(gtk_window);s_webview_count--;if (s_webview_count == 0) {timer_remove(s_timer_id);s_timer_id = 0;}gdk_window_process_all_updates();
}
相关文章:
AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu
Ubuntu 上实现 AWTK-WIDGET-WEB-VIEW 开始以为很简单,后来发现是最麻烦的。因为 Ubuntu 上的 webview 库是 基于 GTK 的,而 AWTK 是基于 X11 的,两者的窗口系统不同,所以期间踩了几个大坑。 1. 编译 AWTK 在使用 Linux 的输入法时…...
Python入门(7)--高级函数特性详解
Python高级函数特性详解 🚀 目录 匿名函数(Lambda)装饰器的使用生成器与迭代器递归函数应用实战案例:文件批处理工具 1. 匿名函数(Lambda)深入解析 🎯 1.1 Lambda函数基础与进阶 1.1.1 基本…...
【数据库原理】理解数据库,基础知识
第一代:网状数据库;第二代:关系数据库;第三代:新一代数据库系统BigData 一、理解数据库 什么是数据:信息,对事物的存在方方式、运动状态及特征的描述。数据,记录信息的识别方式有数…...
VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送
因为开发钉钉H5微应用在手机上一直查看不到日志等,出现安卓和苹果上传图片一边是成功的,一边是失败的,所以找了这个,之前在开发微信小程序进行调试的时候能看到,之前没想到过,这次被人提点发现可以单独使用…...
论文分享 | FuzzLLM:一种用于发现大语言模型中越狱漏洞的通用模糊测试框架
大语言模型是当前人工智能领域的前沿研究方向,在安全性方面大语言模型存在一些挑战和问题。分享一篇发表于2024年ICASSP会议的论文FuzzLLM,它设计了一种模糊测试框架,利用模型的能力去测试模型对越狱攻击的防护水平。 论文摘要 大语言模型中…...
vmWare虚拟环境centos7安装Hadoop 伪分布式实践
背景:近期在研发大数据中台,需要研究Hadoop hive 的各种特性,需要搭建一个Hadoop的虚拟环境,本来想着使用dock ,但突然发现docker 公共仓库的镜像 被XX 了,无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…...
【C++入门(一)】半小时入门C++开发(深入理解new+List+范围for+可变参数)
目录 一.深入理解new 使用格式 二.List列表 定义一个列表 迭代器 添加元素 删除元素 排序 反转序列 三.范围for 四.可变参数 std::initializer_list 可变参数模板(variadic template) 一.深入理解new 类似于C语言中的malloc、calloc和reallo…...
Vue 3与TypeScript集成指南:构建类型安全的前端应用
在Vue 3中使用TypeScript,可以让你的组件更加健壮和易于维护。以下是使用TypeScript与Vue 3结合的详细步骤和知识点: 1. 环境搭建 首先,确保你安装了Node.js(推荐使用最新的LTS版本)和npm或Yarn。然后,安…...
MATLAB和Python发射光谱
在MATLAB和Python中,可以使用不同的库来生成发射光谱。以下是两种语言的简单示例: MATLAB: % 定义波长(nm)和强度(a.u.) wavelengths linspace(300, 1000, 1000); intensity sin(wavelengths / 500);…...
IEEE(常用)参考文献引用格式详解 | LaTeX参考文献规范(IEEE Trans、Conf、Arxiv)| 期刊会议名缩写查询
期刊 ** 期刊:已正式出版(有期卷号) ** 期刊:录用后在线访问即Early access(无期卷号)会议Arxiv论文 期刊 期刊:已正式出版(有期卷号) article{gu2024ai, title{{AI}-Enhanced Cloud-Edge-Terminal Collaborative Ne…...
第二十周:机器学习
目录 摘要 ABSTRACT 一、吴恩达机器学习exp2——逻辑回归 1、logistic函数 2、数据预处理 3、损失函数 4、梯度下降 5、设定评价指标 6、决策边界 7、正则化 二、动手深度学习pytorch——数据预处理 1、数据集读取 2、缺失值处理 3、转换为张量格式 总结 摘要…...
Elasticsearch面试内容整理-Elasticsearch 基础概念
Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎,提供强大的全文本搜索、实时数据分析、分布式存储等功能。以下是 Elasticsearch 的一些基础概念: 什么是 Elasticsearch? ● Elasticsearch 是一个用于全文搜索和实时分析的分布式搜索引擎。 ● 开源和可…...
机器学习算法模型系列——Adam算法
Adam是一种自适应学习率的优化算法,结合了动量和自适应学习率的特性。 主要思想是根据参数的梯度来动态调整每个参数的学习率。 核心原理包括: 动量(Momentum):Adam算法引入了动量项,以平滑梯度更新的方向…...
Qt按钮类-->day09
按钮基类 QAbstractButton 标题与图标 // 参数text的内容显示到按钮上 void QAbstractButton::setText(const QString &text); // 得到按钮上显示的文本内容, 函数的返回就是 QString QAbstractButton::text() const;// 得到按钮设置的图标 QIcon icon() const; // 给按钮…...
基于xr-frame实现微信小程序的手部、手势识别3D模型叠加和石头剪刀布游戏功能
前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案,基于混合方案实现,性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定,发布为正式版,但仍有一些功能还在开发&#…...
基于Kafka2.1解读Consumer原理
文章目录 概要整体架构流程技术名词解释技术细节coordinatorfetcherclientconsumer#poll的主要流程 全局总览小结 概要 继上一篇讲Producer原理的文章过去已经一个多月了,今天来讲讲Consumer的原理。 其实源码早就读了部分了,但是最近工作比较忙&#x…...
深度学习:ResNet每一层的输出形状
其中 /**在输出通道数为64、步幅为2的7 7卷积层后,接步幅为2的3 3的最大汇聚层,与GoogLeNet区别是每个卷积层后增加了批量规范层**/ b1 nn.Sequential(nn.Conv2d(1, 64, kernel_size7, stride2, padding3),nn.BatchNorm2d(64), nn.ReLU(),nn.MaxPool2d(kernel_s…...
国内几大网络安全公司介绍 - 网络安全
Posted by zhaol under 安全 , 电信 , 评论 , 中国 中国国内的安全市场进入“战国时期”,启明星辰、绿盟、天融信、安氏、亿阳、联想网御、华为等战国七雄拥有雄厚的客户资源和资金基础,帐前皆有勇猛善战之士,渐渐开始统领国内安全市场的潮流…...
修改Android Studio项目配置JDK路径和项目Gradle路径的GUI工具
概述 本工具提供了一个基于Python Tkinter的图形用户界面(GUI),用于帮助用户搜索并更新Android Studio项目中的config.properties文件里的java.home路径,以及workspace.xml文件中的last_opened_file_path路径。该工具旨在简化手动…...
✅DAY30 贪心算法 | 452. 用最少数量的箭引爆气球 | 435. 无重叠区间 | 763.划分字母区间
452. 用最少数量的箭引爆气球 解题思路:首先把原数组按左边界进行排序。然后比较[i-1]的右边界和[i]的左边界是否重叠,如果重叠,更新当前右边界为最小右边界和[i1]的左边界判断是重叠。 class Solution:def findMinArrowShots(self, points:…...
iOS 27 开放 AI 生态,长距高清传输新引擎 @ACP#GSV5800 筑牢 iPhone AI 显示后端底座
一、iOS 27 开放 AI:引爆高清长距传输与多接口扩展刚需苹果 iOS 27 系统全面开放第三方 AI 模型自由切换,支持 Claude、Gemini、DeepSeek 等主流大模型深度接入,iPhone/iPad 一跃成为全球最大 AI 交互与视觉输出入口。这一变革直接引爆AI 扩展…...
三步搞定B站4K视频下载:从新手到高手的完整指南
三步搞定B站4K视频下载:从新手到高手的完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为无法离线观看B站精彩…...
专业指南:如何用Legacy-iOS-Kit一站式管理老旧苹果设备
专业指南:如何用Legacy-iOS-Kit一站式管理老旧苹果设备 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
CommandAI:用自然语言驱动命令行,AI赋能开发运维效率革命
1. 项目概述:当命令行遇上AI,效率革命的新起点 如果你和我一样,每天有超过一半的工作时间是在终端(Terminal)里度过的,那你一定对命令行(Command Line)又爱又恨。爱的是它的高效、精…...
CANN/ops-nn自适应平均池化3D反向计算
aclnnAdaptiveAvgPool3dBackward 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 📄 查看源码 产品是否支持Ascend 950PR/Ascend 950DT√…...
Redis分布式锁进阶第五十七篇
Redis分布式锁进阶第二十五篇:联锁深度拆解 多资源交叉死锁根治 复杂业务多级加锁绝对有序方案一、本篇前置衔接 第二十四篇我们完成了全系列终局复盘,整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透,但真实…...
西安石油大学仪光实践协会4月活动机械蝴蝶台灯
项目简介该项目使用stm32芯片设计了一个灯光,300减速,可灯光颜色变化,和电机转向控制。制作了一个简单有趣的动态可控台灯。使用电源控制ic芯片,可与连接电池,对电池进行充电,并且显示电池剩余电量。实现制…...
备战蓝桥杯国赛【Day 8】
例题 1:数字统计(蓝桥杯基础题)项目内容类型暴力枚举 / 数学核心遍历区间,统计数字出现次数题目描述 统计范围 [L, R] 的所有整数中,数字 2 出现的次数。 输入格式 L R输出格式 数字 2 出现的次数。 题解 直接遍历每个…...
量子测量诱导相变在玻色系统中的实验实现
1. 量子测量诱导相变的理论基础量子测量诱导相变(Measurement-Induced Phase Transition, MIPT)是近年来量子多体物理领域的重要发现。这种相变不同于传统热力学相变,它完全由量子测量操作与酉演化之间的动态竞争所驱动。在玻色系统中&#x…...
Next.js App Router与React Server Components实战:构建高性能Hacker News克隆
1. 项目概述:一个基于 Next.js App Router 与 React Server Components 的 Hacker News 克隆 如果你和我一样,在过去几年里一直在用 Next.js 的 Pages Router 构建应用,那么当 App Router 和 React Server Components 这两个概念一起出现时&…...
