-
Notifications
You must be signed in to change notification settings - Fork 5
Addon Browser Backend
HoshinoYumeka edited this page Sep 7, 2026
·
1 revision
com.november.mcphone.feature.browser.client.IBrowser
com.november.mcphone.feature.browser.client.IBrowserBackend
com.november.mcphone.feature.browser.client.BrowserBackends
⚠ 这三个类不在
api包下,不受五条兼容承诺保护。 它们是为把 MCEF 从浏览器 App 中隔离出去而抽的一层,目前只有内建的 MCEF 后端一个实现,尚未经过第二个实现的检验。 待形状稳定后再挪进api包——按第四条,挪包等于换一次 API,因此宁可晚挪,不要挪两次。
这一层不含 MCEF / JCEF 类型:画面以 GL 纹理 id 交出,输入按鼠标键盘事件转发进去。
| 方法 | 说明 |
|---|---|
boolean isAvailable() |
此时此刻能不能建浏览器(MCEF 装了也可能还在下载原生库) |
Component unavailableReason() |
不可用的原因,界面直接显示 |
IBrowser create(String url, int width, int height) |
宽高是真实像素;后端不可用时返回 null,调用方必须判空
|
public final class BrowserBackends {
public static final String MCEF_MODID = "mcef";
public static final IBrowserBackend NONE; // 永远不可用
public static IBrowserBackend get(); // 永不为 null
public static boolean set(IBrowserBackend backend); // true 表示接上了
public static boolean isMcefLoaded();
public static void installDefault(); // 客户端启动时由 MCphone 调用
}接入自定义实现:
BrowserBackends.set(new MyBackend()); // 须在 MCphone 装上默认后端之前| 行为 | 说明 |
|---|---|
| 挂载点数量 |
全局一个,先接上的算数。已有人接管时 set 返回 false、保留原来那个并告警 |
传入 null
|
返回 false 并告警 |
| 无人接管 |
get() 返回 NONE:isAvailable() 恒为 false,create 恒返回 null
|
isMcefLoaded() 回答的是"装没装",不是"此刻能不能用"。
installDefault()把"装没装"的判断与"真去new"分在两个方法里。写在同一个方法内,if尚未执行、方法本身就先抛NoClassDefFoundError。自定义后端引用第三方类型时同理。
一个已经打开的浏览器,共 19 个方法。方法签名中不允许出现 MCEF / JCEF 类型。
| 分组 | 方法 |
|---|---|
| 画面 |
int textureId()、void resize(int width, int height)
|
| 鼠标 |
mouseMove(int,int)、mousePress(int,int,int)、mouseRelease(int,int,int)、mouseWheel(int,int,double,int)
|
| 键盘 |
keyPress(int,long,int)、keyRelease(int,long,int)、charTyped(char,int)、setFocus(boolean)
|
| 导航 |
loadUrl(String)、currentUrl()、canGoBack()、goBack()、canGoForward()、goForward()、reload()、isLoading()
|
| 生命周期 | close() |
| 成员 | 约束 |
|---|---|
textureId() |
每帧都可能变,每次绘制前重新取,不要缓存 |
resize |
单位是真实像素,不是 GUI 缩放后的坐标;传错画面会糊 |
mouseWheel 的 modifiers
|
GLFW 掩码(SHIFT=1 / CTRL=2 / ALT=4),必须传真值;写死 0 会让 Ctrl+滚轮缩放静默失效 |
charTyped |
与 keyPress 分开:字符输入要经过输入法与键盘布局 |
setFocus |
没有焦点时网页里的输入框不会闪光标 |
currentUrl() |
刚建好尚未加载时可能是空串 |
close() |
必须调用:背后是真的 Chromium 渲染进程,不关会一直在后台活着 |
返回 GL 纹理 id 而不让后端自己绘制:贴四边形的写法随 Minecraft 版本变化,该留在界面层。
浏览器 App 的玩家侧说明见🌐 浏览器。