//---------------------------------------- // // 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) } } } }