energy/cef/cef-application-run.go
2023-03-15 11:05:09 +08:00

98 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under Apache License Version 2.0, January 2004
//
// https://www.apache.org/licenses/LICENSE-2.0
//
//----------------------------------------
// energy application run
package cef
import (
"github.com/energye/energy/common"
"github.com/energye/energy/consts"
"github.com/energye/energy/logger"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
)
var (
//BrowserWindow 是基于LCL和VF窗口组件的浏览器主窗口
//
//可以对窗口的属性设置和事件监听Chromium的配置和事件监听.
//
//该窗口是主窗体,因此初始化时必须第一个初始化完成,如果创建子窗口最好在 SetBrowserInitAfter 回调函数中创建
//
//VF窗口组件默认在Linux平台自动开启
//LCL窗口组件默认在Windows、MacOSX平台自动开启
BrowserWindow = &browserWindow{
browserEvent: &BrowserEvent{},
Config: &browserConfig{
WindowProperty: NewWindowProperty(),
},
windowInfo: make(map[int32]IBrowserWindow),
windowSerial: 1, //默认1开始
}
browserProcessStartAfterCallback browserProcessStartAfterCallbackFunc
)
type browserProcessStartAfterCallbackFunc func(success bool)
// SetBrowserProcessStartAfterCallback 主进程启动之后回调函数
func SetBrowserProcessStartAfterCallback(callback browserProcessStartAfterCallbackFunc) {
if common.Args.IsMain() {
if browserProcessStartAfterCallback == nil {
browserProcessStartAfterCallback = callback
}
}
}
// Run
// 运行应用
//
// 在这里启动浏览器的主进程和子进程
func Run(app *TCEFApplication) {
defer func() {
logger.Debug("application process [", common.Args.ProcessType(), "] run end")
api.EnergyLibRelease()
}()
//MacOSX 多进程时需要调用StartSubProcess来启动子进程
if common.IsDarwin() && !consts.SingleProcess && !common.Args.IsMain() {
// 启动子进程
app.StartSubProcess()
app.Free()
} else {
//externalMessagePump 和 multiThreadedMessageLoop 为 false 时, 启用 VF (ViewsFrameworkBrowserWindow) 窗口组件
emp := app.ExternalMessagePump()
mtml := app.MultiThreadedMessageLoop()
consts.IsMessageLoop = !emp && !mtml
if consts.IsMessageLoop {
// 启用VF窗口组件
BrowserWindow.appContextInitialized(app)
}
// 启动主进程
success := app.StartMainProcess()
// 主进程启动成功之后回调
if browserProcessStartAfterCallback != nil {
browserProcessStartAfterCallback(success)
}
if success {
appMainRunCallback()
if consts.IsMessageLoop {
// VF窗口消息轮询
app.RunMessageLoop()
} else {
// 创建LCL窗口组件
if BrowserWindow.mainBrowserWindow == nil {
BrowserWindow.mainBrowserWindow = &lclBrowserWindow{}
}
// 运行主窗口
lcl.RunApp(&BrowserWindow.mainBrowserWindow)
}
}
}
}