有时你会想让PPAPI插件全屏(比如播放视频时),这次来看看怎么做。

PPAPI和CEF App两侧都要处理。

foruok原创,转载请注明出处。欢迎关注foruok的订阅号“程序视界”(programmer_sight)。

PPAPI插件中的处理

要支持全屏切换,PPAPI插件这侧,有两处需要处理:

  • 使用PPB_Fullscreen,调用SetFullscreen方法
  • 在PPP_Instance的DidChangeView方法中重建Graphics 2D或Graphics 3D

PPB_Fullscreen接口

在PPP_InitializeModule方法里加入下面代码:

ppb_fullscreen = (const PPB_Fullscreen*)get_browser_interface(PPB_FULLSCREEN_INTERFACE);

获取到PPB_Fullscreen接口后,可以在合适的地方写下类似下面的代码来完成全屏切换:

...
// fs defined somewhere
ppb_fullscreen->SetFullscreen(pp_inst, fs == PP_TRUE ? PP_FALSE : PP_TRUE);
...

需要注意的是,SetFullscreen是异步的,当你调用SetFullscreen(pp_inst, PP_TRUE)之后,并不会马上进入进入全屏状态,此时你调用PPB_Fullscreen的GetScreenSize方法,获取到的可能是一个中间状态。所以,在接下来的DidChangeView方法中,需要应对这种中间状态。

DidChangeView重建图形上下文

DidChangeView中,需要先释放之前创建image data,释放Graphics 2D。类似下面的代码:

PP_Resouce image; //somewhere
ppb_image_data->Unmap(image);
ppb_core->Release(image);
ppb_instance->BindGraphics(pp_inst, NULL);
ppb_core->Release(graphics);

然后再重新创建一遍,具体可以参考PPAPI插件与浏览器的交互过程及其它文章。

CEF APP侧响应全屏操作

当我们在PPAPI中调用PPB_Fullscreen的SetFullscreen方法时,其实会发生好几件事儿,主要的有两件:

  1. CEF APP的browser进程处理全屏切换
  2. 全屏完成后,PPAPI侧收到DidChangeView消息

现在就来看browser进程的处理。

CefDisplayHandler类有一个与全屏相关的方法需要重写:

virtual void OnFullscreenModeChange(CefRefPtr<CefBrowser> browser,bool fullscreen)

在这个方法里,你可以让窗口全屏或恢复。

有一点需要注意,有的浏览器实现,收到全屏模式变化消息时,(Windows上)会类似下面这样处理:

ShowWindow(browser->GetHost()->GetWindowHandle(), fullscreen ? SW_MAXIMIZE : SW_RESTORE);

这种处理,全屏对应窗口最大化,非全屏就回到最大化前的状态。可能导致一定的问题,比如PPAPI认为是全屏,获取的screen size是整个屏幕的尺寸,而浏览器窗口实际上只占据了任务栏之外的地方,这样的话,PPAPI插件就会被切边,显示不完整。

chromium的源码里,pepper_plugin_instance_impl.cc中,就针对这种情况,特别处理了flash插件。当检测到当前PPAPI插件时flash时,hook了一下,GetScreenSize返回实际窗口区域大小。这样flash插件就工作正常了。但我们写的则不会哈。

所以,如果你真想全屏,可以参考下面的代码:

void ClientHandler::OnFullscreenModeChange(CefRefPtr<CefBrowser> browser, bool fullscreen)
{HWND hwndBrowser = browser->GetHost()->GetWindowHandle();if (fullscreen){RECT rc;GetWindowRect(hwndBrowser, &rc);m_browserRects[hwndBrowser] = rc;HWND hwndDesktop = GetDesktopWindow();RECT rcDesktop;GetWindowRect(hwndDesktop, &rcDesktop);SetWindowLongPtr(hwndBrowser, GWL_STYLE, WS_VISIBLE);SetWindowPos(hwndBrowser, HWND_TOPMOST, 0, 0, rcDesktop.right, rcDesktop.bottom, SWP_SHOWWINDOW);}else{RECT rc = m_browserRects[hwndBrowser];SetWindowLongPtr(hwndBrowser, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE);SetWindowPos(hwndBrowser, HWND_NOTOPMOST, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);}
}

上面的代码,每次切换到全屏模式前,先保存窗口位置。从全屏退出时,再恢复。


就这样吧。

其他参考文章详见我的专栏:【CEF与PPAPI开发】。

PPAPI插件的全屏切换处理相关推荐

  1. dplayer js控制 自动全屏_vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】...

    最近公司的产品上线,一些高级功能在基础版本中不对用户开发,通过视频的形式展示. 产品开发用的是 vue, 经同事介绍使用了vue-video-player视频播放插件,通过 demo案例很快实现了视频 ...

  2. 远程桌面退出全屏/不能全屏/全屏切换的技巧

    远程桌面退出全屏/不能全屏/全屏切换的技巧退出全屏 问:我的电脑远程登录到服务器上并且切换到了全屏状态,全屏后发现桌面顶部没有浮动工具栏了,想退出全屏状态,不知如何退出了,最后,只有重启电脑.想知道如 ...

  3. VirtualBox全屏切换

    用VirtualBox的时候,如果设置为全屏,想再切换回来,没有什么菜单,只有通过键盘的快捷键来操作,才可以恢复. 我常常忘掉,所以老是得去找,以后需要记住这几个按键的快捷键. 1.全屏与非全屏切换: ...

  4. 页面平滑过渡全屏切换

    实现效果为页面平滑过渡全屏切换,点击导航和鼠标滚动都可以切换. 效果图: 代码: <!DOCTYPE html> <html> <head lang="en&q ...

  5. 视频全屏非全屏切换,状态栏动态显示隐藏兼容性解决

    列表中视频全屏/非全屏切换时,需要动态显示/隐藏状态栏 View类提供了setSystemUiVisibility和getSystemUiVisibility方法,这两个方法实现对状态栏的动态显示或隐 ...

  6. jQuery 扩展 全屏切换

    (function ($) {//全屏切换方法$.fn.toggleFullScreen = function (qp1, qp2) {var fullFlag = false;var _qp1 = ...

  7. vue 全屏 screenfull —— 整页全屏,指定元素全屏,退出全屏,全屏切换等

    安装 npm install screenfull --save 使用方法 import screenfull from "screenfull"; 属性 screenfull.i ...

  8. android播放器竖屏,Android 巧用DecorView实现列表或详情视频播放器竖屏及全屏切换...

    在平时开发过程中,如果使用到视频播放器的功能,那就一定会涉及到全屏切换的操作 以往常规操作基本如下 设置全屏播放步骤 1.横屏 2.视频播放器尺寸调整 3.隐藏其他多余控件 恢复小屏播放 1.竖屏 2 ...

  9. android全屏与非全屏切换时Toolbar的显示,仿微信漂流瓶效果

    Toolbar已经代替了actionbar,特别是在4.4或更高版本上可以有沉浸式效果,要使用Toolbar还要配置相关的Noactionbar style样式,但是如果在全屏与非全屏切换时,如何使用 ...

最新文章

  1. 解答关于学习前端的一些问题
  2. python函数文档说明调用方式_Python 跨.py文件调用自定义函数说明
  3. 2016 CVPR 德州仪器 ADAS Tutorial
  4. JSON合并补丁:JSON-P 1.1概述系列
  5. 面试高频题:springboot自动装配的原理你能说出来吗?
  6. 织梦CMS高端响应式电子商务网站模板
  7. 玩转 SpringBoot 2 快速整合 Filter 注解版
  8. Java基础学习总结(19)——Java环境变量配置
  9. 索引sql server_SQL Server报告– SQL Server索引利用率
  10. 推荐几个JAVA 学习不错的网站
  11. 读书印记 - 《终极算法》
  12. python 安居客 爬虫_python 自动抓取分析房价数据——安居客版
  13. gibboncode导入.stl格式模型,进行网格划分
  14. C/C++中取地址符的语义
  15. 洛谷P4939 Agent2(树状数组差分)
  16. windows下DxDiag查看笔记本电脑主板型号信息
  17. 给自己分一个 MAC地址--locally administered address
  18. QQ空间的花花快速成长所需的东东(转)
  19. 一般椭圆方程表示的椭圆的绘制
  20. vscode的常用插件

热门文章

  1. cadence学习资料整理
  2. 利用python开发的flappy bird 游戏
  3. 在线版音乐播放器APP(一)
  4. mysql语句转为oracle语句
  5. 【操作系统-哈工大李治军】---学习笔记(下)---操作系统管理内存
  6. linux locale设置
  7. XShell个人免费下载使用
  8. 覃卫平java,湖南省职业教“十一五”省级重点建设项目验收通过的项目.doc
  9. 如何把图片压缩到20k一下?怎么降低照片大小kb?
  10. 微信小程序下拉框的实现功能