energy/cef/browser-window-views-framework.go

662 lines
23 KiB
Go
Raw Normal View History

//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under Apache License Version 2.0, January 2004
//
// https://www.apache.org/licenses/LICENSE-2.0
//
//----------------------------------------
2023-02-20 00:20:01 +08:00
// VF窗口组件定义和实现
2023-05-31 17:41:14 +08:00
package cef
import (
2023-05-31 18:00:34 +08:00
"github.com/energye/energy/v2/cef/internal/ipc"
"github.com/energye/energy/v2/cef/internal/window"
"github.com/energye/energy/v2/cef/process"
"github.com/energye/energy/v2/consts"
"github.com/energye/energy/v2/logger"
"github.com/energye/energy/v2/pkgs/assetserve"
"github.com/energye/golcl/energy/emfs"
"github.com/energye/golcl/energy/tools"
"github.com/energye/golcl/lcl"
2023-07-14 18:50:14 +08:00
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/types"
2023-07-14 18:50:14 +08:00
"runtime"
)
// ViewsFrameworkBrowserWindow 基于CEF views framework 窗口组件
//
// 该窗口使用CEF内部实现在linux下107.xx以后版本默认使用GTK3但无法使用lcl组件集成到窗口中
//
// 当创建应用配置时 MultiThreadedMessageLoop 和 ExternalMessagePump 属性同时为false(linux系统默认强制false)时启用ViewsFramework窗口
type ViewsFrameworkBrowserWindow struct {
2023-01-28 11:46:09 +08:00
isClosing bool //
windowType consts.WINDOW_TYPE //0:browser 1:devTools 2:viewSource 默认:0
windowId int32 //
chromium IChromium //
component lcl.IComponent //
windowComponent *TCEFWindowComponent //
browserViewComponent *TCEFBrowserViewComponent //
windowProperty *WindowProperty //窗口属性
auxTools *auxTools //辅助工具
tray ITray //托盘
2023-02-14 15:25:02 +08:00
doOnWindowCreated WindowComponentOnWindowCreated //窗口创建
2023-01-28 11:46:09 +08:00
doOnGetInitialBounds WindowComponentOnGetInitialBounds //窗口初始bounds
regions *TCefDraggableRegions //窗口内html拖拽区域
context *ICefRequestContext //
extraInfo *ICefDictionaryValue //
screen *lcl.TScreen //屏幕
}
2023-02-20 00:20:01 +08:00
// NewViewsFrameworkBrowserWindow 创建 ViewsFrameworkBrowserWindow 窗口
2023-06-19 12:41:52 +08:00
func NewViewsFrameworkBrowserWindow(config *TCefChromiumConfig, windowProperty WindowProperty, owner ...lcl.IComponent) *ViewsFrameworkBrowserWindow {
if config == nil {
config = NewChromiumConfig()
}
var component lcl.IComponent
if len(owner) > 0 {
component = lcl.NewComponent(owner[0])
} else {
component = lcl.NewComponent(nil)
}
m := &ViewsFrameworkBrowserWindow{
windowProperty: &windowProperty,
component: component,
2023-06-19 12:41:52 +08:00
chromium: NewChromium(component, config),
2023-07-04 11:59:45 +08:00
windowComponent: WindowComponentRef.New(component),
browserViewComponent: BrowserViewComponentRef.New(component),
}
2023-02-03 08:36:26 +08:00
m.SetWindowType(windowProperty.WindowType)
m.chromium.SetEnableMultiBrowserMode(true)
m.windowComponent.SetOnWindowCreated(func(sender lcl.IObject, window *ICefWindow) {
2023-07-07 15:27:26 +08:00
if m.chromium.CreateBrowserByBrowserViewComponent(windowProperty.Url, m.browserViewComponent, m.context, m.extraInfo) {
m.windowComponent.AddChildView(m.browserViewComponent)
if windowProperty.Title != "" {
m.windowComponent.SetTitle(windowProperty.Title)
}
if windowProperty.EnableCenterWindow {
m.windowComponent.CenterWindow(NewCefSize(windowProperty.Width, windowProperty.Height))
}
if windowProperty.IconFS != "" {
if emfs.IsExist(windowProperty.IconFS) {
2023-03-01 13:38:43 +08:00
if err := m.windowComponent.SetWindowAppIconByFSFile(1, windowProperty.IconFS); err != nil {
logger.Error("set window application icon error:", err.Error())
}
}
} else if windowProperty.Icon != "" {
if tools.IsExist(windowProperty.Icon) {
2023-03-01 13:38:43 +08:00
if err := m.windowComponent.SetWindowAppIconByFile(1, windowProperty.Icon); err != nil {
logger.Error("set window application icon error:", err.Error())
}
}
}
m.browserViewComponent.RequestFocus()
m.windowComponent.Show()
if m.doOnWindowCreated != nil {
m.doOnWindowCreated(sender, window)
}
}
})
return m
}
// ViewsFrameworkBrowserWindow 主窗口初始化
2023-03-04 11:19:45 +08:00
func (m *browserWindow) appContextInitialized(app *TCEFApplication) {
// 仅主进程初始化主窗口,
// 子进程也不会初始, 判断一下省着多调用函数了
2023-05-31 17:41:14 +08:00
if !process.Args.IsMain() {
return
}
// VF 主窗口在 application 上下文初始化时创建
app.SetOnContextInitialized(func() {
2023-02-03 08:36:26 +08:00
m.Config.WindowProperty.WindowType = consts.WT_MAIN_BROWSER
// main window
vfMainWindow := NewViewsFrameworkBrowserWindow(m.Config.ChromiumConfig(), m.Config.WindowProperty)
// 主窗口关闭流程 before close
// OnCanClose如果阻止关闭该函数不会执行
vfMainWindow.Chromium().SetOnBeforeClose(func(sender lcl.IObject, browser *ICefBrowser) {
2023-05-31 17:41:14 +08:00
chromiumOnBeforeClose(browser)
if vfMainWindow.tray != nil {
vfMainWindow.tray.close()
}
2023-07-09 15:40:10 +08:00
app.QuitMessageLoop()
})
2023-05-31 17:41:14 +08:00
// 重置窗口属性, 注册默认实现事件
vfMainWindow.ResetWindowPropertyForEvent()
vfMainWindow.registerPopupEvent(true)
vfMainWindow.registerDefaultEvent()
vfMainWindow.windowComponent.SetOnCanClose(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
*aResult = vfMainWindow.Chromium().TryCloseBrowser()
})
// 设置到 MainBrowser
BrowserWindow.mainVFBrowserWindow = vfMainWindow
if m.Config.browserWindowOnEventCallback != nil {
BrowserWindow.browserEvent.chromium = vfMainWindow.chromium
m.Config.browserWindowOnEventCallback(BrowserWindow.browserEvent, vfMainWindow)
}
ipc.SetProcessMessage(vfMainWindow.Chromium().(*TCEFChromium))
vfMainWindow.CreateTopLevelWindow()
//创建完窗口之后设置窗口属性
vfMainWindow.createAfterWindowPropertyForEvent()
})
}
func (m *ViewsFrameworkBrowserWindow) createAfterWindowPropertyForEvent() {
wp := m.WindowProperty()
if wp.EnableResize {
// VF MinimumSize & MaximumSize 在事件中设置
// 如果动态设置,需要自己实现该回调函数
if wp.MinWidth > 0 && wp.MinHeight > 0 {
m.windowComponent.SetOnGetMinimumSize(func(view *ICefView, result *TCefSize) {
result.Width = int32(wp.MinWidth)
result.Height = int32(wp.MinHeight)
})
}
if wp.MaxWidth > 0 && wp.MaxHeight > 0 {
m.windowComponent.SetOnGetMaximumSize(func(view *ICefView, result *TCefSize) {
result.Width = int32(wp.MaxWidth)
result.Height = int32(wp.MaxHeight)
})
}
}
}
2023-02-20 00:20:01 +08:00
// registerPopupEvent 注册弹出子窗口事件
2023-07-09 15:40:10 +08:00
func (m *ViewsFrameworkBrowserWindow) registerPopupEvent(isMain bool) {
var bwEvent = BrowserWindow.browserEvent
2023-07-09 15:40:10 +08:00
if !isMain {
// 子窗口关闭流程
2023-07-09 15:40:10 +08:00
m.chromium.SetOnBeforeClose(func(sender lcl.IObject, browser *ICefBrowser) {
chromiumOnBeforeClose(browser)
})
}
m.Chromium().SetOnOpenUrlFromTab(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, targetUrl string, targetDisposition consts.TCefWindowOpenDisposition, userGesture bool) bool {
if !m.Chromium().Config().EnableOpenUrlTab() {
return true
}
return false
})
m.Chromium().SetOnBeforePopup(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, beforePopupInfo *BeforePopupInfo, client *ICefClient, noJavascriptAccess *bool) bool {
if !m.Chromium().Config().EnableWindowPopup() {
return true
}
wp := *m.windowProperty //clone
2023-01-31 19:44:03 +08:00
wp.Url = beforePopupInfo.TargetUrl
2023-02-03 08:36:26 +08:00
wp.WindowType = consts.WT_POPUP_SUB_BROWSER
2023-07-23 22:17:50 +08:00
var vFrameBrowserWindow = NewViewsFrameworkBrowserWindow(NewChromiumConfig(), wp, BrowserWindow.MainWindow().AsViewsFrameworkBrowserWindow().Component())
var result = false
if bwEvent.onBeforePopup != nil {
2023-07-09 15:40:10 +08:00
result = bwEvent.onBeforePopup(sender, browser, frame, beforePopupInfo, vFrameBrowserWindow, noJavascriptAccess)
}
if !result {
2023-07-09 15:40:10 +08:00
vFrameBrowserWindow.ResetWindowPropertyForEvent()
vFrameBrowserWindow.registerPopupEvent(false)
vFrameBrowserWindow.registerDefaultEvent()
vFrameBrowserWindow.CreateTopLevelWindow()
result = true
}
return result
})
}
2023-02-20 00:20:01 +08:00
// ResetWindowPropertyForEvent 重置窗口属性-通过事件函数
func (m *ViewsFrameworkBrowserWindow) ResetWindowPropertyForEvent() {
2023-01-28 11:46:09 +08:00
wp := m.WindowProperty()
m.windowComponent.SetOnGetInitialShowState(func(sender lcl.IObject, window *ICefWindow, aResult *consts.TCefShowState) {
*aResult = consts.TCefShowState(wp.WindowInitState + 1) // CEF 要 + 1
})
2023-01-28 11:46:09 +08:00
m.windowComponent.SetOnGetInitialBounds(func(sender lcl.IObject, window *ICefWindow, aResult *TCefRect) {
if wp.EnableCenterWindow {
m.windowComponent.CenterWindow(NewCefSize(wp.Width, wp.Height))
aResult.Width = wp.Width
aResult.Height = wp.Height
} else {
aResult.X = wp.X
aResult.Y = wp.Y
aResult.Width = wp.Width
aResult.Height = wp.Height
}
if m.doOnGetInitialBounds != nil {
m.doOnGetInitialBounds(sender, window, aResult)
}
})
m.windowComponent.SetOnCanMinimize(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
2023-01-28 11:46:09 +08:00
*aResult = wp.EnableMinimize
})
m.windowComponent.SetOnCanResize(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
2023-01-28 11:46:09 +08:00
*aResult = wp.EnableResize
})
m.windowComponent.SetOnCanMaximize(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
2023-01-28 11:46:09 +08:00
*aResult = wp.EnableMaximize
})
m.windowComponent.SetOnCanClose(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
2023-01-28 11:46:09 +08:00
*aResult = wp.EnableClose
})
m.windowComponent.SetOnIsFrameless(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
*aResult = wp.EnableHideCaption
})
2023-01-28 11:46:09 +08:00
m.windowComponent.SetAlwaysOnTop(wp.AlwaysOnTop)
m.windowComponent.SetBounds(NewCefRect(wp.X, wp.Y, wp.Width, wp.Height))
}
2023-02-20 00:20:01 +08:00
// registerDefaultEvent 注册默认事件
func (m *ViewsFrameworkBrowserWindow) registerDefaultEvent() {
var bwEvent = BrowserWindow.browserEvent
//默认自定义快捷键
defaultAcceleratorCustom()
2023-02-26 21:17:28 +08:00
m.chromium.SetOnProcessMessageReceived(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, sourceProcess consts.CefProcessId, message *ICefProcessMessage) bool {
if bwEvent.onProcessMessageReceived != nil {
return bwEvent.onProcessMessageReceived(sender, browser, frame, sourceProcess, message)
}
return false
})
m.chromium.SetOnBeforeResourceLoad(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, request *ICefRequest, callback *ICefCallback, result *consts.TCefReturnValue) {
if assetserve.AssetsServerHeaderKeyValue != "" {
request.SetHeaderByName(assetserve.AssetsServerHeaderKeyName, assetserve.AssetsServerHeaderKeyValue, true)
}
if bwEvent.onBeforeResourceLoad != nil {
bwEvent.onBeforeResourceLoad(sender, browser, frame, request, callback, result)
}
})
2023-02-28 09:55:20 +08:00
m.chromium.SetOnBeforeDownload(func(sender lcl.IObject, browser *ICefBrowser, beforeDownloadItem *ICefDownloadItem, suggestedName string, callback *ICefBeforeDownloadCallback) {
if bwEvent.onBeforeDownload != nil {
bwEvent.onBeforeDownload(sender, browser, beforeDownloadItem, suggestedName, callback)
} else {
callback.Cont(consts.ExePath+consts.Separator+suggestedName, true)
}
})
m.chromium.SetOnBeforeContextMenu(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, model *ICefMenuModel) {
var flag bool
if bwEvent.onBeforeContextMenu != nil {
bwEvent.onBeforeContextMenu(sender, browser, frame, params, model)
}
if !flag {
chromiumOnBeforeContextMenu(m, browser, frame, params, model)
}
})
m.chromium.SetOnContextMenuCommand(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32, result *bool) {
if bwEvent.onContextMenuCommand != nil {
bwEvent.onContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
}
if !*result {
chromiumOnContextMenuCommand(m, browser, frame, params, commandId, eventFlags, result)
}
})
m.chromium.SetOnAfterCreated(func(sender lcl.IObject, browser *ICefBrowser) {
var flag bool
if bwEvent.onAfterCreated != nil {
flag = bwEvent.onAfterCreated(sender, browser)
}
if !flag {
chromiumOnAfterCreate(browser)
}
})
2023-05-31 17:41:14 +08:00
m.chromium.SetOnKeyEvent(func(sender lcl.IObject, browser *ICefBrowser, event *TCefKeyEvent, osEvent *consts.TCefEventHandle, result *bool) {
if bwEvent.onKeyEvent != nil {
bwEvent.onKeyEvent(sender, browser, event, osEvent, m, result)
}
if !*result {
if m.WindowType() == consts.WT_DEV_TOOLS || m.WindowType() == consts.WT_VIEW_SOURCE {
return
}
if m.Chromium().Config().EnableDevTools() {
2023-05-31 17:41:14 +08:00
if event.WindowsKeyCode == consts.VkF12 && event.Kind == consts.KEYEVENT_RAW_KEYDOWN {
browser.ShowDevTools()
*result = true
2023-05-31 17:41:14 +08:00
} else if event.WindowsKeyCode == consts.VkF12 && event.Kind == consts.KEYEVENT_KEYUP {
*result = true
}
}
if KeyAccelerator.accelerator(browser, event, result) {
return
}
}
})
2023-05-31 17:41:14 +08:00
m.chromium.SetOnBeforeBrowser(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, request *ICefRequest, userGesture, isRedirect bool) bool {
if bwEvent.onBeforeBrowser != nil {
return bwEvent.onBeforeBrowser(sender, browser, frame, request, userGesture, isRedirect, m)
}
return false
})
m.chromium.SetOnTitleChange(func(sender lcl.IObject, browser *ICefBrowser, title string) {
if bwEvent.onTitleChange != nil {
bwEvent.onTitleChange(sender, browser, title, m)
}
})
m.chromium.SetOnDragEnter(func(sender lcl.IObject, browser *ICefBrowser, dragData *ICefDragData, mask consts.TCefDragOperations, result *bool) {
*result = !m.WindowProperty().EnableDragFile
if bwEvent.onDragEnter != nil {
bwEvent.onDragEnter(sender, browser, dragData, mask, m, result)
}
})
m.chromium.SetOnLoadEnd(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, httpStatusCode int32) {
if bwEvent.onLoadEnd != nil {
bwEvent.onLoadEnd(sender, browser, frame, httpStatusCode)
}
})
if m.WindowProperty().EnableWebkitAppRegion {
m.chromium.SetOnDraggableRegionsChanged(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, regions *TCefDraggableRegions) {
if bwEvent.onDraggableRegionsChanged != nil {
bwEvent.onDraggableRegionsChanged(sender, browser, frame, regions, m)
}
m.regions = regions
m.windowComponent.SetDraggableRegions(regions.Regions())
})
}
}
2023-02-20 00:20:01 +08:00
// EnableAllDefaultEvent 启用所有默认事件行为
func (m *ViewsFrameworkBrowserWindow) EnableAllDefaultEvent() {
2023-07-09 15:40:10 +08:00
m.registerPopupEvent(false)
m.registerDefaultEvent()
}
2023-02-20 00:20:01 +08:00
// SetOnWindowCreated 窗口创建
func (m *ViewsFrameworkBrowserWindow) SetOnWindowCreated(onWindowCreated WindowComponentOnWindowCreated) {
m.doOnWindowCreated = onWindowCreated
}
2023-02-20 00:20:01 +08:00
// SetOnGetInitialBounds 窗口初始坐标和大小
2023-01-28 11:46:09 +08:00
func (m *ViewsFrameworkBrowserWindow) SetOnGetInitialBounds(onGetInitialBounds WindowComponentOnGetInitialBounds) {
m.doOnGetInitialBounds = onGetInitialBounds
}
2023-07-07 15:27:26 +08:00
// SetCreateBrowserExtraInfo
// 设置 Chromium 创建浏览器时设置的扩展信息
func (m *ViewsFrameworkBrowserWindow) SetCreateBrowserExtraInfo(_ string, context *ICefRequestContext, extraInfo *ICefDictionaryValue) {
m.context = context
m.extraInfo = extraInfo
}
2023-02-20 00:20:01 +08:00
// IsViewsFramework 返回是否VF窗口组件这里返回true
func (m *ViewsFrameworkBrowserWindow) IsViewsFramework() bool {
return true
}
2023-02-20 00:20:01 +08:00
// IsLCL 返回是否LCL窗口组件这里返回false
func (m *ViewsFrameworkBrowserWindow) IsLCL() bool {
return false
}
2023-02-20 00:20:01 +08:00
// WindowProperty 部分提供部分窗口属性设置
func (m *ViewsFrameworkBrowserWindow) WindowProperty() *WindowProperty {
return m.windowProperty
}
2023-02-20 00:20:01 +08:00
// BrowserWindow 返回VF窗口组件实现
func (m *ViewsFrameworkBrowserWindow) BrowserWindow() *ViewsFrameworkBrowserWindow {
return m
}
2023-02-20 00:20:01 +08:00
// Handle 返回窗口句柄
func (m *ViewsFrameworkBrowserWindow) Handle() types.HWND {
return types.HWND(m.WindowComponent().WindowHandle().ToPtr())
}
2023-02-20 00:20:01 +08:00
// AsViewsFrameworkBrowserWindow 转换为VF窗口组件这里返回VF窗口组件
func (m *ViewsFrameworkBrowserWindow) AsViewsFrameworkBrowserWindow() IViewsFrameworkBrowserWindow {
return m
}
2023-02-20 00:20:01 +08:00
// AsLCLBrowserWindow 转换为LCL窗口组件这里返回nil
func (m *ViewsFrameworkBrowserWindow) AsLCLBrowserWindow() ILCLBrowserWindow {
return nil
}
2023-02-20 00:20:01 +08:00
// SetTitle 设置窗口标题
func (m *ViewsFrameworkBrowserWindow) SetTitle(title string) {
m.WindowProperty().Title = title
}
2023-02-20 00:20:01 +08:00
// SetWidth 设置窗口宽
func (m *ViewsFrameworkBrowserWindow) SetWidth(value int32) {
m.WindowProperty().Width = value
}
2023-02-20 00:20:01 +08:00
// SetHeight 设置窗口高
func (m *ViewsFrameworkBrowserWindow) SetHeight(value int32) {
m.WindowProperty().Height = value
}
2023-02-20 00:20:01 +08:00
// Point 返回窗口坐标
func (m *ViewsFrameworkBrowserWindow) Point() *TCefPoint {
result := m.WindowComponent().Position()
m.WindowProperty().X = result.X
m.WindowProperty().Y = result.Y
return result
}
2023-02-20 00:20:01 +08:00
// Size 返回窗口宽高
func (m *ViewsFrameworkBrowserWindow) Size() *TCefSize {
result := m.WindowComponent().Size()
m.WindowProperty().Width = result.Width
m.WindowProperty().Height = result.Height
return result
}
2023-02-20 00:20:01 +08:00
// Bounds 返回窗口坐标和宽高
func (m *ViewsFrameworkBrowserWindow) Bounds() *TCefRect {
result := m.WindowComponent().Bounds()
m.WindowProperty().X = result.X
m.WindowProperty().Y = result.Y
m.WindowProperty().Width = result.Width
m.WindowProperty().Height = result.Height
return result
}
2023-02-20 00:20:01 +08:00
// SetPoint 设置窗口坐标
func (m *ViewsFrameworkBrowserWindow) SetPoint(x, y int32) {
m.WindowProperty().X = x
m.WindowProperty().Y = y
}
2023-02-20 00:20:01 +08:00
// SetSize 设置窗口宽高
func (m *ViewsFrameworkBrowserWindow) SetSize(width, height int32) {
m.WindowProperty().Width = width
m.WindowProperty().Height = height
}
2023-02-20 00:20:01 +08:00
// SetBounds 设置窗口坐标和宽高
func (m *ViewsFrameworkBrowserWindow) SetBounds(x, y, width, height int32) {
m.WindowProperty().X = x
m.WindowProperty().Y = y
m.WindowProperty().Width = width
m.WindowProperty().Height = height
}
2023-02-20 00:20:01 +08:00
// getAuxTools 获取辅助工具-开发者工具
func (m *ViewsFrameworkBrowserWindow) getAuxTools() *auxTools {
return m.auxTools
}
2023-02-20 00:20:01 +08:00
// createAuxTools 创建辅助工具-开发者工具
func (m *ViewsFrameworkBrowserWindow) createAuxTools() {
if m.auxTools == nil {
m.auxTools = &auxTools{}
}
}
2023-02-20 00:20:01 +08:00
// Browser 返回browser
func (m *ViewsFrameworkBrowserWindow) Browser() *ICefBrowser {
2023-02-26 19:14:49 +08:00
return m.Chromium().Browser()
}
2023-02-20 00:20:01 +08:00
// Chromium 返回 chromium
func (m *ViewsFrameworkBrowserWindow) Chromium() IChromium {
return m.chromium
}
2023-02-20 00:20:01 +08:00
// Id 获取窗口ID
func (m *ViewsFrameworkBrowserWindow) Id() int32 {
2023-05-31 17:41:14 +08:00
if m.windowId == 0 {
m.windowId = m.Chromium().BrowserId()
}
return m.windowId
}
2023-02-20 00:20:01 +08:00
// Show 显示窗口
func (m *ViewsFrameworkBrowserWindow) Show() {
m.WindowComponent().Show()
}
2023-02-20 00:20:01 +08:00
// Hide 隐藏窗口
func (m *ViewsFrameworkBrowserWindow) Hide() {
m.WindowComponent().Hide()
}
2023-02-20 00:20:01 +08:00
// Close 关闭窗口,一搬不使用
func (m *ViewsFrameworkBrowserWindow) Close() {
m.WindowComponent().Close()
}
2023-02-20 00:20:01 +08:00
// WindowState 返回窗口最小化、最大化、全屏状态
2023-02-14 15:25:02 +08:00
func (m *ViewsFrameworkBrowserWindow) WindowState() types.TWindowState {
if m.windowComponent.IsMinimized() {
return types.WsMinimized
} else if m.windowComponent.IsMaximized() {
return types.WsMaximized
} else if m.windowComponent.IsFullscreen() {
return types.WsFullScreen
}
return types.WsNormal
}
2023-02-20 00:20:01 +08:00
// Maximize 窗口最大化/还原
func (m *ViewsFrameworkBrowserWindow) Maximize() {
if m.WindowState() == types.WsNormal {
2023-02-14 15:25:02 +08:00
m.WindowComponent().Maximize()
} else {
m.Restore()
}
}
func (m *ViewsFrameworkBrowserWindow) FullScreen() {
m.WindowComponent().SetFullscreen(true)
}
func (m *ViewsFrameworkBrowserWindow) ExitFullScreen() {
m.WindowComponent().SetFullscreen(false)
}
func (m *ViewsFrameworkBrowserWindow) IsFullScreen() bool {
return m.WindowComponent().IsFullscreen()
}
2023-02-20 00:20:01 +08:00
// Minimize 窗口最小化
func (m *ViewsFrameworkBrowserWindow) Minimize() {
m.WindowComponent().Minimize()
}
2023-02-20 00:20:01 +08:00
// Restore 窗口还原
func (m *ViewsFrameworkBrowserWindow) Restore() {
m.WindowComponent().Restore()
}
2023-02-20 00:20:01 +08:00
// CloseBrowserWindow 关闭浏览器窗口
func (m *ViewsFrameworkBrowserWindow) CloseBrowserWindow() {
m.isClosing = true
m.chromium.CloseBrowser(true)
}
2023-02-20 00:20:01 +08:00
// CreateTopLevelWindow 创建顶层窗口
func (m *ViewsFrameworkBrowserWindow) CreateTopLevelWindow() {
2023-05-31 17:41:14 +08:00
if m.WindowType() != consts.WT_DEV_TOOLS {
window.CurrentBrowseWindowCache = m
}
m.WindowComponent().CreateTopLevelWindow()
}
2023-02-20 00:20:01 +08:00
// CenterWindow 设置窗口居中,同时指定窗口大小
func (m *ViewsFrameworkBrowserWindow) CenterWindow(size *TCefSize) {
m.WindowComponent().CenterWindow(size)
}
2023-02-20 00:20:01 +08:00
// SetCenterWindow 设置窗口居中显示
func (m *ViewsFrameworkBrowserWindow) SetCenterWindow(value bool) {
m.WindowProperty().EnableCenterWindow = value
}
2023-02-20 00:20:01 +08:00
// IsClosing 返回窗口是否正在关闭/或已关闭 true正在或已关闭
func (m *ViewsFrameworkBrowserWindow) IsClosing() bool {
return m.isClosing
}
2023-02-20 00:20:01 +08:00
// WindowType 返回窗口类型
func (m *ViewsFrameworkBrowserWindow) WindowType() consts.WINDOW_TYPE {
return m.windowType
}
2023-02-20 00:20:01 +08:00
// SetWindowType 设置窗口类型
func (m *ViewsFrameworkBrowserWindow) SetWindowType(windowType consts.WINDOW_TYPE) {
m.windowType = windowType
}
2023-02-20 00:20:01 +08:00
// DisableMinimize 禁用最小化按钮
func (m *ViewsFrameworkBrowserWindow) DisableMinimize() {
m.WindowProperty().EnableMinimize = false
}
2023-02-20 00:20:01 +08:00
// DisableMaximize 禁用最大化按钮
func (m *ViewsFrameworkBrowserWindow) DisableMaximize() {
m.WindowProperty().EnableMaximize = false
}
2023-02-20 00:20:01 +08:00
// DisableResize 禁用调整窗口大小
func (m *ViewsFrameworkBrowserWindow) DisableResize() {
m.WindowProperty().EnableResize = false
}
2023-02-20 00:20:01 +08:00
// EnableMinimize 启用最小化按钮
func (m *ViewsFrameworkBrowserWindow) EnableMinimize() {
m.WindowProperty().EnableMinimize = true
}
2023-02-20 00:20:01 +08:00
// EnableMaximize 启用最大化按钮
func (m *ViewsFrameworkBrowserWindow) EnableMaximize() {
m.WindowProperty().EnableMaximize = true
}
2023-02-20 00:20:01 +08:00
// EnableResize 启用允许调整窗口大小
func (m *ViewsFrameworkBrowserWindow) EnableResize() {
m.WindowProperty().EnableResize = true
}
2023-02-20 00:20:01 +08:00
// Component 返回窗口父组件
func (m *ViewsFrameworkBrowserWindow) Component() lcl.IComponent {
return m.component
}
2023-02-20 00:20:01 +08:00
// WindowComponent 返回窗口组件
func (m *ViewsFrameworkBrowserWindow) WindowComponent() *TCEFWindowComponent {
return m.windowComponent
}
2023-02-20 00:20:01 +08:00
// BrowserViewComponent 返回浏览器显示组件
func (m *ViewsFrameworkBrowserWindow) BrowserViewComponent() *TCEFBrowserViewComponent {
return m.browserViewComponent
}
2023-07-14 18:50:14 +08:00
func (m *ViewsFrameworkBrowserWindow) Screen() *lcl.TScreen {
if m.screen == nil && m.BrowserViewComponent() != nil {
m.screen = lcl.NewScreen(m.BrowserViewComponent())
}
return m.screen
}
2023-07-14 18:50:14 +08:00
// RunOnMainThread
// 在主线程中运行
func (m *ViewsFrameworkBrowserWindow) RunOnMainThread(fn func()) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
if api.DMainThreadId() == api.DCurrentThreadId() {
fn()
} else {
lcl.ThreadSync(func() {
fn()
})
}
}