提交 916746bd 编写于 作者: yanghye's avatar yanghye

v2.0 Fixed Chinese input and gtk3 issues for linux packaging

上级 863f7cca
......@@ -29,8 +29,11 @@ func updateBrowserDevTools(browser *ICefBrowser, title string) {
}
}
}
func createBrowserDevTools(browser *ICefBrowser, browserWinInfo *TCefWindowInfo) {
func createBrowserDevTools(browser *ICefBrowser, browserWinInfo *LCLBrowserWindow) {
QueueAsyncCall(func(id int) {
if browserWinInfo.auxTools == nil {
browserWinInfo.auxTools = &auxTools{}
}
winAuxTools := browserWinInfo.auxTools
if winAuxTools.devToolsWindow != nil {
winAuxTools.devToolsWindow.Show()
......@@ -38,7 +41,7 @@ func createBrowserDevTools(browser *ICefBrowser, browserWinInfo *TCefWindowInfo)
}
winAuxTools.devToolsWindow = &LCLBrowserWindow{}
winAuxTools.devToolsWindow.SetWindowType(WT_DEV_TOOLS)
winAuxTools.devToolsWindow.TForm = lcl.NewForm(browserWinInfo.Window)
winAuxTools.devToolsWindow.TForm = lcl.NewForm(browserWinInfo)
winAuxTools.devToolsWindow.SetCaption(fmt.Sprintf("%s - %s", dev_tools_name, browser.MainFrame().Url))
winAuxTools.devToolsWindow.FormCreate()
winAuxTools.devToolsWindow.defaultWindowEvent()
......@@ -80,7 +83,7 @@ func createBrowserDevTools(browser *ICefBrowser, browserWinInfo *TCefWindowInfo)
winAuxTools.devToolsWindow.ChromiumCreate(nil, "")
winAuxTools.devToolsWindow.putChromiumWindowInfo()
winAuxTools.devToolsWindow.defaultChromiumEvent()
winAuxTools.devToolsWindow.windowInfo = browserWinInfo
//winAuxTools.devToolsWindow.windowInfo = browserWinInfo
winAuxTools.devToolsWindow.Show()
//明确的生成下一个窗体序号
BrowserWindow.setOrIncNextWindowNum()
......
......@@ -19,22 +19,20 @@ const (
)
func updateBrowserViewSource(browser *ICefBrowser, title string) {
if browserWinInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); browserWinInfo != nil && browserWinInfo.Window != nil && browserWinInfo.Window.WindowType() == WT_VIEW_SOURCE {
if browserWinInfo.Window != nil {
QueueAsyncCall(func(id int) {
if mainFrame := browser.MainFrame(); mainFrame != nil {
browserWinInfo.Window.SetCaption(fmt.Sprintf("%s - %s", view_source_name, mainFrame.Url))
} else {
logger.Error("failed to get main frame")
}
})
}
if browserWinInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); browserWinInfo != nil && browserWinInfo.WindowType() == WT_VIEW_SOURCE {
QueueAsyncCall(func(id int) {
if mainFrame := browser.MainFrame(); mainFrame != nil {
browserWinInfo.SetCaption(fmt.Sprintf("%s - %s", view_source_name, mainFrame.Url))
} else {
logger.Error("failed to get main frame")
}
})
}
}
func viewSourceAfterCreate(browser *ICefBrowser) bool {
if winInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); winInfo != nil {
if winInfo.Window.WindowType() == WT_VIEW_SOURCE && winInfo.auxTools.viewSourceWindow != nil {
if winInfo.WindowType() == WT_VIEW_SOURCE && winInfo.auxTools.viewSourceWindow != nil {
winInfo.auxTools.viewSourceWindow.chromium.LoadUrl(winInfo.auxTools.viewSourceUrl)
return true
}
......@@ -58,6 +56,9 @@ func createBrowserViewSource(browser *ICefBrowser, frame *ICefFrame) {
m.SetWidth(1024)
m.SetHeight(768)
if winInfo := BrowserWindow.GetWindowInfo(m.windowId); winInfo != nil {
if winInfo.auxTools == nil {
winInfo.auxTools = &auxTools{}
}
winInfo.auxTools.viewSourceUrl = viewSourceUrl
winInfo.auxTools.viewSourceWindow = m
}
......
......@@ -13,8 +13,8 @@ import (
)
type viewsFrameBrowserWindowOnEventCallback func(event *BrowserEvent, window *ViewsFrameworkBrowserWindow)
type browserWindowOnEventCallback func(event *BrowserEvent, window *TCefWindowInfo)
type browserWindowAfterOnEventCallback func(window *TCefWindowInfo)
type browserWindowOnEventCallback func(event *BrowserEvent, window *LCLBrowserWindow)
type browserWindowAfterOnEventCallback func(window *LCLBrowserWindow)
//创建主窗口指定的一些快捷配置属性
type browserConfig struct {
......
......@@ -30,7 +30,7 @@ var (
Config: &browserConfig{
WindowProperty: *NewWindowProperty(),
},
windowInfo: make(map[int32]*TCefWindowInfo),
windowInfo: make(map[int32]*LCLBrowserWindow),
windowSerial: 1,
uiLock: new(sync.Mutex),
}
......@@ -50,12 +50,12 @@ func SetBrowserProcessStartAfterCallback(callback browserProcessStartAfterCallba
// 浏览器包装结构体
type browser struct {
mainBrowserWindow *browserWindow //主浏览器窗口
popupWindow *LCLBrowserWindow //弹出的子窗口
browserEvent *BrowserEvent //浏览器全局事件
Config *browserConfig //浏览器和窗口配置
windowInfo map[int32]*TCefWindowInfo //窗口信息集合
windowSerial int32 //窗口序号
mainBrowserWindow *browserWindow //主浏览器窗口
popupWindow *LCLBrowserWindow //弹出的子窗口
browserEvent *BrowserEvent //浏览器全局事件
Config *browserConfig //浏览器和窗口配置
windowInfo map[int32]*LCLBrowserWindow //窗口信息集合
windowSerial int32 //窗口序号
uiLock *sync.Mutex
}
......@@ -139,7 +139,6 @@ func (m *browserWindow) OnFormCreate(sender lcl.IObject) {
m.ChromiumCreate(BrowserWindow.Config.chromiumConfig, BrowserWindow.Config.Url)
m.putChromiumWindowInfo()
m.defaultChromiumEvent()
BrowserWindow.mainBrowserWindow.windowInfo = m.windowInfo
m.AddOnCloseQuery(func(sender lcl.IObject, canClose *bool) bool {
if m.tray != nil {
m.tray.close()
......@@ -149,14 +148,14 @@ func (m *browserWindow) OnFormCreate(sender lcl.IObject) {
if BrowserWindow.Config.Title != "" {
m.SetCaption(BrowserWindow.Config.Title)
}
if BrowserWindow.Config.Icon != "" {
lcl.Application.Icon().LoadFromFSFile(BrowserWindow.Config.Icon)
if BrowserWindow.Config.IconFS != "" {
lcl.Application.Icon().LoadFromFSFile(BrowserWindow.Config.IconFS)
}
m.SetWidth(BrowserWindow.Config.Width)
m.SetHeight(BrowserWindow.Config.Height)
if BrowserWindow.Config.browserWindowOnEventCallback != nil {
BrowserWindow.browserEvent.chromium = m.chromium
BrowserWindow.Config.browserWindowOnEventCallback(BrowserWindow.browserEvent, m.windowInfo)
BrowserWindow.Config.browserWindowOnEventCallback(BrowserWindow.browserEvent, &m.LCLBrowserWindow)
}
//主进程(主窗口)启动后回调函数事件
......@@ -165,14 +164,14 @@ func (m *browserWindow) OnFormCreate(sender lcl.IObject) {
if !m.isFirstActivate {
m.isFirstActivate = true
if BrowserWindow.Config.browserWindowAfterOnEventCallback != nil {
BrowserWindow.Config.browserWindowAfterOnEventCallback(m.windowInfo)
BrowserWindow.Config.browserWindowAfterOnEventCallback(&m.LCLBrowserWindow)
}
}
})
}
func (m *browser) MainWindow() *TCefWindowInfo {
return m.mainBrowserWindow.windowInfo
func (m *browser) MainWindow() *LCLBrowserWindow {
return &m.mainBrowserWindow.LCLBrowserWindow
}
// 基于CEF views framework窗口 - 主窗口和chromium初始化时回调
......@@ -240,30 +239,26 @@ func (m *browser) GetNextWindowNum() int32 {
func (m *browser) createNextPopupWindow() {
m.popupWindow = &LCLBrowserWindow{}
m.popupWindow.TForm = lcl.NewForm(m.MainWindow().Window)
m.popupWindow.TForm = lcl.NewForm(m.MainWindow())
m.popupWindow.FormCreate()
m.popupWindow.defaultWindowEvent()
m.popupWindow.defaultWindowCloseEvent()
}
// 拿到窗口信息
func (m *browser) GetWindowInfo(browserId int32) *TCefWindowInfo {
func (m *browser) GetWindowInfo(browserId int32) *LCLBrowserWindow {
if winInfo, ok := m.windowInfo[browserId]; ok {
return winInfo
}
return nil
}
func (m *browser) GetWindowsInfo() map[int32]*TCefWindowInfo {
func (m *browser) GetWindowsInfo() map[int32]*LCLBrowserWindow {
return m.windowInfo
}
func (m *browser) putWindowInfo(browserId int32, windowInfo *TCefWindowInfo) {
if winInfo, ok := m.windowInfo[browserId]; ok {
winInfo.Window = windowInfo.Window
} else {
m.windowInfo[browserId] = windowInfo
}
func (m *browser) putWindowInfo(browserId int32, windowInfo *LCLBrowserWindow) {
m.windowInfo[browserId] = windowInfo
}
func (m *browser) removeWindowInfo(browseId int32) {
......@@ -273,46 +268,38 @@ func (m *browser) removeWindowInfo(browseId int32) {
func (m *browser) GetBrowser(browseId int32) *ICefBrowser {
if winInfo, ok := m.windowInfo[browseId]; ok {
return winInfo.Browser
return winInfo.browser
}
return nil
}
func (m *browser) putBrowserFrame(browser *ICefBrowser, frame *ICefFrame) {
if winInfo, ok := m.windowInfo[browser.Identifier()]; !ok {
winInfo = &TCefWindowInfo{
Browser: browser,
Frames: make(map[int64]*ICefFrame),
}
if frame != nil {
winInfo.Frames[frame.Id] = frame
}
m.windowInfo[browser.Identifier()] = winInfo
} else {
winInfo.Browser = browser
if frame != nil {
winInfo.Frames[frame.Id] = frame
if winInfo, ok := m.windowInfo[browser.Identifier()]; ok {
if winInfo.frames == nil {
winInfo.frames = make(TCEFFrame)
}
winInfo.browser = browser
winInfo.frames[frame.Id] = frame
}
}
func (m *browser) GetFrames(browseId int32) map[int64]*ICefFrame {
if winInfo, ok := m.windowInfo[browseId]; ok {
return winInfo.Frames
return winInfo.frames
}
return nil
}
func (m *browser) GetFrame(browseId int32, frameId int64) *ICefFrame {
if winInfo, ok := m.windowInfo[browseId]; ok {
return winInfo.Frames[frameId]
return winInfo.frames[frameId]
}
return nil
}
func (m *browser) RemoveFrame(browseId int32, frameId int64) {
if winInfo, ok := m.windowInfo[browseId]; ok {
delete(winInfo.Frames, frameId)
delete(winInfo.frames, frameId)
}
}
......@@ -325,9 +312,9 @@ func (m *browser) IsSameFrame(browseId int32, frameId int64) bool {
func (m *browser) removeNoValidFrames() {
for _, winInfo := range m.windowInfo {
for _, frm := range winInfo.Frames {
for _, frm := range winInfo.frames {
if !frm.IsValid() {
delete(winInfo.Frames, frm.Id)
delete(winInfo.frames, frm.Id)
}
}
}
......
......@@ -172,11 +172,17 @@ func (m *tCefTrayForm) createCefTrayWindow() {
m.TForm.InheritedWndProc(msg)
if msg.Msg == 6 && msg.WParam == 0 && msg.LParam == 0 {
QueueAsyncCall(func(id int) {
if m.isClosing {
return
}
m.TForm.Hide()
})
}
})
m.TForm.SetOnDeactivate(func(sender lcl.IObject) {
if m.isClosing {
return
}
m.TForm.Hide()
})
......
......@@ -77,11 +77,9 @@ func chromiumOnBeforeContextMenu(sender lcl.IObject, browser *ICefBrowser, frame
return
}
if winInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); winInfo != nil {
if winInfo.Window != nil {
//开发者工具和显示源代码不展示框架自定义菜单
if winInfo.Window.WindowType() == WT_DEV_TOOLS || winInfo.Window.WindowType() == WT_VIEW_SOURCE {
return
}
//开发者工具和显示源代码不展示框架自定义菜单
if winInfo.WindowType() == WT_DEV_TOOLS || winInfo.WindowType() == WT_VIEW_SOURCE {
return
}
}
undoVisible, undoEnabled := model.IsVisible(MENU_ID_UNDO), model.IsEnabled(MENU_ID_UNDO)
......@@ -282,7 +280,7 @@ func chromiumOnContextMenuCommand(sender lcl.IObject, browser *ICefBrowser, fram
browser.Print()
} else if commandId == closeBrowserId {
winInfo := BrowserWindow.GetWindowInfo(browser.Identifier())
winInfo.Close()
winInfo.CloseBrowserWindow()
} else if commandId == refreshId {
browser.Reload()
} else if commandId == forcedRefreshId {
......
......@@ -109,7 +109,7 @@ type ChromiumEventOnMainFrameChanged func(sender lcl.IObject, browser *ICefBrows
type ChromiumEventOnBeforePopup func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, beforePopupInfo *BeforePopupInfo, client *ICefClient, noJavascriptAccess *bool) bool
// windowParent popup
type ChromiumEventOnBeforePopupForWindowInfo func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, beforePopupInfo *BeforePopupInfo, popupWindow *TCefWindowInfo, noJavascriptAccess *bool) bool
type ChromiumEventOnBeforePopupForWindowInfo func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, beforePopupInfo *BeforePopupInfo, popupWindow *LCLBrowserWindow, noJavascriptAccess *bool) bool
// windowParent open url from tab
type ChromiumEventOnOpenUrlFromTab func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame)
......
......@@ -30,6 +30,17 @@ type cefFrame struct {
Identifier uintptr
}
type TCEFFrame map[int64]*ICefFrame
func (m TCEFFrame) GetByFrameId(frameId int64) *ICefFrame {
if m != nil {
if frame, ok := m[frameId]; ok {
return frame
}
}
return nil
}
func (m *ICefFrame) Undo() {
var frameId = m.Id
Proc(internale_CEFFrame_Undo).Call(uintptr(m.Browser.Identifier()), uintptr(unsafe.Pointer(&frameId)))
......
......@@ -35,24 +35,25 @@ type IBaseWindow interface {
//LCLBrowserWindow 基于chromium 和 lcl 的窗口组件
type LCLBrowserWindow struct {
*lcl.TForm //
chromium IChromium //
windowParent ITCefWindowParent //
windowProperty *WindowProperty
vFrameBrowserWindow *ViewsFrameworkBrowserWindow //基于CEF views framework窗口
windowInfo *TCefWindowInfo //基于LCL窗口信息
windowId int32 //
windowType consts.WINDOW_TYPE //0:browser 1:devTools 2:viewSource 默认:0
isClosing bool //
canClose bool //
onResize []TNotifyEvent //
onActivate []TNotifyEvent //
onShow []TNotifyEvent //
onClose []TCloseEvent //
onCloseQuery []TCloseQueryEvent //
onActivateAfter lcl.TNotifyEvent //
isFormCreate bool //是否创建完成 WindowForm
isChromiumCreate bool //是否创建完成 Chromium
*lcl.TForm //
chromium IChromium //
browser *ICefBrowser //
windowParent ITCefWindowParent //
windowProperty *WindowProperty //
windowId int32 //
windowType consts.WINDOW_TYPE //0:browser 1:devTools 2:viewSource 默认:0
isClosing bool //
canClose bool //
onResize []TNotifyEvent //
onActivate []TNotifyEvent //
onShow []TNotifyEvent //
onClose []TCloseEvent //
onCloseQuery []TCloseQueryEvent //
onActivateAfter lcl.TNotifyEvent //
isFormCreate bool //是否创建完成 WindowForm
isChromiumCreate bool //是否创建完成 Chromium
frames TCEFFrame //当前浏览器下的所有frame
auxTools *auxTools //辅助工具
}
//创建一个带有 chromium 窗口
......@@ -70,6 +71,10 @@ func NewBrowserWindow(config *tCefChromiumConfig, windowProperty *WindowProperty
return window
}
func (m *LCLBrowserWindow) Browser() *ICefBrowser {
return m.browser
}
func (m *LCLBrowserWindow) Chromium() IChromium {
return m.chromium
}
......@@ -106,11 +111,6 @@ func (m *LCLBrowserWindow) SetVisible(value bool) {
m.TForm.SetVisible(value)
}
//返回窗口信息
func (m *LCLBrowserWindow) WindowInfo() *TCefWindowInfo {
return m.windowInfo
}
//以默认的方式展示在任务栏上
func (m *LCLBrowserWindow) SetDefaultInTaskBar() {
if m.TForm == nil {
......@@ -203,14 +203,7 @@ func (m *LCLBrowserWindow) ChromiumCreate(config *tCefChromiumConfig, defaultUrl
}
func (m *LCLBrowserWindow) putChromiumWindowInfo() {
m.windowInfo = &TCefWindowInfo{
Window: m,
Browser: nil,
Frames: make(map[int64]*ICefFrame),
WindowProperty: NewWindowProperty(),
auxTools: &auxTools{},
}
BrowserWindow.putWindowInfo(m.windowId, m.windowInfo)
BrowserWindow.putWindowInfo(m.windowId, m)
}
//默认的chromium事件
......@@ -292,6 +285,181 @@ func (m *LCLBrowserWindow) SetOnActivateAfter(fn lcl.TNotifyEvent) {
m.onActivateAfter = fn
}
func (m *LCLBrowserWindow) Minimize() {
if m.TForm == nil {
return
}
QueueAsyncCall(func(id int) {
m.SetWindowState(types.WsMinimized)
})
}
func (m *LCLBrowserWindow) Maximize() {
if m.TForm == nil {
return
}
QueueAsyncCall(func(id int) {
var bs = m.BorderStyle()
var monitor = m.Monitor().WorkareaRect()
if m.windowProperty == nil {
m.windowProperty = &WindowProperty{}
}
if bs == types.BsNone {
var ws = m.WindowState()
var redWindowState types.TWindowState
//默认状态0
if m.windowProperty.WindowState == types.WsNormal && m.windowProperty.WindowState == ws {
redWindowState = types.WsMaximized
} else {
if m.windowProperty.WindowState == types.WsNormal {
redWindowState = types.WsMaximized
} else if m.windowProperty.WindowState == types.WsMaximized {
redWindowState = types.WsNormal
}
}
m.windowProperty.WindowState = redWindowState
if redWindowState == types.WsMaximized {
m.windowProperty.X = m.Left()
m.windowProperty.Y = m.Top()
m.windowProperty.Width = m.Width()
m.windowProperty.Height = m.Height()
m.SetLeft(monitor.Left)
m.SetTop(monitor.Top)
m.SetWidth(monitor.Right - monitor.Left - 1)
m.SetHeight(monitor.Bottom - monitor.Top - 1)
} else if redWindowState == types.WsNormal {
m.SetLeft(m.windowProperty.X)
m.SetTop(m.windowProperty.Y)
m.SetWidth(m.windowProperty.Width)
m.SetHeight(m.windowProperty.Height)
}
} else {
if m.WindowState() == types.WsMaximized {
m.SetWindowState(types.WsNormal)
if IsDarwin() {
m.SetWindowState(types.WsMaximized)
m.SetWindowState(types.WsNormal)
}
} else if m.WindowState() == types.WsNormal {
m.SetWindowState(types.WsMaximized)
}
m.windowProperty.WindowState = m.WindowState()
}
})
}
// 关闭带有浏览器的窗口
func (m *LCLBrowserWindow) CloseBrowserWindow() {
if m.TForm == nil {
return
}
QueueAsyncCall(func(id int) {
if m == nil {
logger.Error("关闭浏览器 WindowInfo 为空")
return
}
if IsDarwin() {
//main window close
if m.WindowType() == consts.WT_MAIN_BROWSER {
m.Close()
} else {
//sub window close
m.isClosing = true
m.Hide()
m.chromium.CloseBrowser(true)
}
} else {
m.isClosing = true
m.Hide()
m.chromium.CloseBrowser(true)
}
})
}
//禁用口透明
func (m *LCLBrowserWindow) DisableTransparent() {
if m.TForm == nil {
return
}
m.SetAllowDropFiles(false)
m.SetAlphaBlend(false)
m.SetAlphaBlendValue(255)
}
//使窗口透明 value 0 ~ 255
func (m *LCLBrowserWindow) EnableTransparent(value uint8) {
if m.TForm == nil {
return
}
m.SetAllowDropFiles(true)
m.SetAlphaBlend(true)
m.SetAlphaBlendValue(value)
}
//禁用最小化按钮
func (m *LCLBrowserWindow) DisableMinimize() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Exclude(types.BiMinimize))
}
//禁用最大化按钮
func (m *LCLBrowserWindow) DisableMaximize() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Exclude(types.BiMaximize))
}
//禁用系统菜单-同时禁用最小化,最大化,关闭按钮
func (m *LCLBrowserWindow) DisableSystemMenu() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Exclude(types.BiSystemMenu))
}
//禁用帮助菜单
func (m *LCLBrowserWindow) DisableHelp() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Exclude(types.BiHelp))
}
//启用最小化按钮
func (m *LCLBrowserWindow) EnableMinimize() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Include(types.BiMinimize))
}
//启用最大化按钮
func (m *LCLBrowserWindow) EnableMaximize() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Include(types.BiMaximize))
}
//启用系统菜单-同时禁用最小化,最大化,关闭按钮
func (m *LCLBrowserWindow) EnableSystemMenu() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Include(types.BiSystemMenu))
}
//启用帮助菜单
func (m *LCLBrowserWindow) EnableHelp() {
if m.TForm == nil {
return
}
m.SetBorderIcons(m.BorderIcons().Include(types.BiHelp))
}
func (m *LCLBrowserWindow) show(sender lcl.IObject) {
var ret bool
if m.onShow != nil {
......@@ -372,7 +540,7 @@ func (m *LCLBrowserWindow) registerPopupEvent() {
QueueAsyncCall(func(id int) {
BrowserWindow.uiLock.Lock()
defer BrowserWindow.uiLock.Unlock()
winProperty := BrowserWindow.popupWindow.windowInfo.WindowProperty
winProperty := BrowserWindow.popupWindow.windowProperty
if winProperty != nil {
if winProperty.IsShowModel {
BrowserWindow.popupWindow.ShowModal()
......@@ -384,7 +552,7 @@ func (m *LCLBrowserWindow) registerPopupEvent() {
}
}()
if bwEvent.onBeforePopup != nil {
result = !bwEvent.onBeforePopup(sender, browser, frame, beforePopupInfo, BrowserWindow.popupWindow.windowInfo, noJavascriptAccess)
result = !bwEvent.onBeforePopup(sender, browser, frame, beforePopupInfo, BrowserWindow.popupWindow, noJavascriptAccess)
}
return result
})
......@@ -461,7 +629,7 @@ func (m *LCLBrowserWindow) registerDefaultEvent() {
m.chromium.SetOnKeyEvent(func(sender lcl.IObject, browser *ICefBrowser, event *TCefKeyEvent, result *bool) {
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableDevTools) {
if winInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); winInfo != nil {
if winInfo.Window.WindowType() == consts.WT_DEV_TOOLS || winInfo.Window.WindowType() == consts.WT_VIEW_SOURCE {
if winInfo.WindowType() == consts.WT_DEV_TOOLS || winInfo.WindowType() == consts.WT_VIEW_SOURCE {
return
}
}
......@@ -580,17 +748,19 @@ func (m *LCLBrowserWindow) registerDefaultChromiumCloseEvent() {
logger.Debug("chromium.onBeforeClose")
chromiumOnBeforeClose(browser)
m.canClose = true
var tempClose = func() {
var closeWindow = func() {
defer func() {
if err := recover(); err != nil {
logger.Error("chromium.OnBeforeClose Error:", err)
}
}()
if m.windowInfo.auxTools.viewSourceWindow != nil {
m.windowInfo.auxTools.viewSourceWindow = nil
}
if m.windowInfo != nil && m.windowInfo.auxTools.devToolsWindow != nil {
m.windowInfo.auxTools.devToolsWindow.Close()
if m.auxTools != nil {
if m.auxTools.viewSourceWindow != nil {
m.auxTools.viewSourceWindow = nil
}
if m.auxTools.devToolsWindow != nil {
m.auxTools.devToolsWindow.Close()
}
}
BrowserWindow.removeWindowInfo(m.windowId)
//主窗口关闭
......@@ -605,7 +775,7 @@ func (m *LCLBrowserWindow) registerDefaultChromiumCloseEvent() {
}
}
QueueAsyncCall(func(id int) { // main thread run
tempClose()
closeWindow()
})
if bwEvent.onBeforeClose != nil {
bwEvent.onBeforeClose(sender, browser)
......
......@@ -114,17 +114,17 @@ func (m *browserWindow) appContextInitialized(app *TCEFApplication) {
BrowserWindow.Config.chromiumConfig.SetEnableOpenUrlTab(true)
BrowserWindow.Config.chromiumConfig.SetEnableWindowPopup(true)
}
m.vFrameBrowserWindow = NewViewsFrameworkBrowserWindow(BrowserWindow.Config.chromiumConfig, &BrowserWindow.Config.WindowProperty, BrowserWindow.Config.viewsFrameBrowserWindowOnEventCallback)
m.chromium = m.vFrameBrowserWindow.chromium
vFrameBrowserWindow := NewViewsFrameworkBrowserWindow(BrowserWindow.Config.chromiumConfig, &BrowserWindow.Config.WindowProperty, BrowserWindow.Config.viewsFrameBrowserWindowOnEventCallback)
m.chromium = vFrameBrowserWindow.chromium
m.putChromiumWindowInfo()
m.vFrameBrowserWindow.registerPopupEvent()
m.vFrameBrowserWindow.registerDefaultEvent()
m.vFrameBrowserWindow.windowComponent.SetOnCanClose(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
vFrameBrowserWindow.registerPopupEvent()
vFrameBrowserWindow.registerDefaultEvent()
vFrameBrowserWindow.windowComponent.SetOnCanClose(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
fmt.Println("OnCanClose")
*aResult = true
app.QuitMessageLoop()
})
m.vFrameBrowserWindow.CreateTopLevelWindow()
vFrameBrowserWindow.CreateTopLevelWindow()
})
}
......@@ -141,7 +141,7 @@ func (m *ViewsFrameworkBrowserWindow) registerPopupEvent() {
fmt.Println("BrowserWindow-beforePopupInfo", beforePopupInfo.TargetUrl)
var result = false
if bwEvent.onBeforePopup != nil {
result = !bwEvent.onBeforePopup(sender, browser, frame, beforePopupInfo, BrowserWindow.popupWindow.windowInfo, noJavascriptAccess)
result = !bwEvent.onBeforePopup(sender, browser, frame, beforePopupInfo, BrowserWindow.popupWindow, noJavascriptAccess)
}
if !result {
result = true
......@@ -242,7 +242,7 @@ func (m *ViewsFrameworkBrowserWindow) registerDefaultEvent() {
m.chromium.SetOnKeyEvent(func(sender lcl.IObject, browser *ICefBrowser, event *TCefKeyEvent, result *bool) {
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableDevTools) {
if winInfo := BrowserWindow.GetWindowInfo(browser.Identifier()); winInfo != nil {
if winInfo.Window.WindowType() == consts.WT_DEV_TOOLS || winInfo.Window.WindowType() == consts.WT_VIEW_SOURCE {
if winInfo.WindowType() == consts.WT_DEV_TOOLS || winInfo.WindowType() == consts.WT_VIEW_SOURCE {
return
}
}
......
......@@ -9,6 +9,6 @@
package cef
//适用于 windows linux macos 系统托盘
func (m *TCefWindowInfo) NewTray() ITray {
return newTray(m.Window)
func (m *LCLBrowserWindow) NewTray() ITray {
return newTray(m)
}
......@@ -12,9 +12,9 @@
package cef
//只适用于windows的无菜单托盘
func (m *TCefWindowInfo) NewCefTray(width, height int32, url string) ITray {
func (m *LCLBrowserWindow) NewCefTray(width, height int32, url string) ITray {
if BrowserWindow.mainBrowserWindow.tray == nil {
BrowserWindow.mainBrowserWindow.tray = newCefTray(m.Window, width, height, url)
BrowserWindow.mainBrowserWindow.tray = newCefTray(m, width, height, url)
}
return BrowserWindow.mainBrowserWindow.tray
}
//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under GNU General Public License v3.0
//
//----------------------------------------
package cef
import (
"github.com/energye/energy/common"
"github.com/energye/energy/consts"
"github.com/energye/energy/logger"
"github.com/energye/golcl/lcl/types"
)
type TCEFFrame map[int64]*ICefFrame
// 窗口信息
type TCefWindowInfo struct {
Window *LCLBrowserWindow `json:"-"` //窗口Form
Browser *ICefBrowser `json:"-"` //浏览器对象,加载完chromium之后创建
WindowProperty *WindowProperty `json:"-"` //窗口属性
Frames TCEFFrame `json:"-"` //当前浏览器下的所有frame
auxTools *auxTools //辅助工具
}
//辅助工具
type auxTools struct {
devToolsWindow *LCLBrowserWindow //devTools
devToolsX int32 //上次改变的窗体位置,宽度
devToolsY int32 //
devToolsWidth int32 //
devToolsHeight int32 //
viewSourceWindow *LCLBrowserWindow //viewSource
viewSourceUrl string //
viewSourceX int32 //上次改变的窗体位置,宽度
viewSourceY int32 //
viewSourceWidth int32 //
viewSourceHeight int32 //
}
//窗口属性
type WindowProperty struct {
IsShowModel bool //是否以模态窗口显示
WindowState types.TWindowState //窗口 状态
Title string //窗口 标题
Url string //默认打开URL
Icon string //窗口图标 加载本地图标
IconFS string //窗口图标 加载emfs内置图标
CanMinimize bool //窗口 是否启用最小化功能
CanMaximize bool //窗口 是否启用最大化功能
CanResize bool //窗口 是否允许调整窗口大小
CanClose bool //窗口 关闭时是否关闭窗口
CenterWindow bool //窗口 是否居中显示
AlwaysOnTop bool //窗口 置顶
X int32 //窗口 CenterWindow=false X坐标
Y int32 //窗口 CenterWindow=false Y坐标
Width int32 //窗口 宽
Height int32 //窗口 高
}
//创建一个 窗口默认属性
func NewWindowProperty() *WindowProperty {
return &WindowProperty{
Title: "Energy",
Url: "about:blank",
CanMinimize: true,
CanMaximize: true,
CanResize: true,
CanClose: true,
CenterWindow: true,
Width: 1024,
Height: 768,
}
}
func (m *TCefWindowInfo) Chromium() IChromiumProc {
return m.Window.chromium
}
func (m *TCefWindowInfo) chromiumEvent() IChromiumEvent {
return m.Window.chromium
}
func (m *TCefWindowInfo) Minimize() {
QueueAsyncCall(func(id int) {
m.Window.SetWindowState(types.WsMinimized)
})
}
func (m *TCefWindowInfo) Maximize() {
BrowserWindow.uiLock.Lock()
defer BrowserWindow.uiLock.Unlock()
QueueAsyncCall(func(id int) {
var bs = m.Window.BorderStyle()
var monitor = m.Window.Monitor().WorkareaRect()
if bs == types.BsNone {
var ws = m.Window.WindowState()
var redWindowState types.TWindowState
//默认状态0
if m.WindowProperty.WindowState == types.WsNormal && m.WindowProperty.WindowState == ws {
redWindowState = types.WsMaximized
} else {
if m.WindowProperty.WindowState == types.WsNormal {
redWindowState = types.WsMaximized
} else if m.WindowProperty.WindowState == types.WsMaximized {
redWindowState = types.WsNormal
}
}
m.WindowProperty.WindowState = redWindowState
if redWindowState == types.WsMaximized {
m.WindowProperty.X = m.Window.Left()
m.WindowProperty.Y = m.Window.Top()
m.WindowProperty.Width = m.Window.Width()
m.WindowProperty.Height = m.Window.Height()
m.Window.SetLeft(monitor.Left)
m.Window.SetTop(monitor.Top)
m.Window.SetWidth(monitor.Right - monitor.Left - 1)
m.Window.SetHeight(monitor.Bottom - monitor.Top - 1)
} else if redWindowState == types.WsNormal {
m.Window.SetLeft(m.WindowProperty.X)
m.Window.SetTop(m.WindowProperty.Y)
m.Window.SetWidth(m.WindowProperty.Width)
m.Window.SetHeight(m.WindowProperty.Height)
}
} else {
if m.Window.WindowState() == types.WsMaximized {
m.Window.SetWindowState(types.WsNormal)
if common.IsDarwin() {
m.Window.SetWindowState(types.WsMaximized)
m.Window.SetWindowState(types.WsNormal)
}
} else if m.Window.WindowState() == types.WsNormal {
m.Window.SetWindowState(types.WsMaximized)
}
m.WindowProperty.WindowState = m.Window.WindowState()
}
})
}
// 关闭窗口-在ui线程中执行
func (m *TCefWindowInfo) Close() {
BrowserWindow.uiLock.Lock()
defer BrowserWindow.uiLock.Unlock()
QueueAsyncCall(func(id int) {
if m == nil {
logger.Error("关闭浏览器 WindowInfo 为空")
return
}
if m.Window == nil {
logger.Error("关闭浏览器 Window 为空")
return
}
if common.IsDarwin() {
//main window close
if m.Window.WindowType() == consts.WT_MAIN_BROWSER {
m.Window.Close()
} else {
//sub window close
m.Window.isClosing = true
m.Window.Hide()
m.Window.chromium.CloseBrowser(true)
}
} else {
m.Window.isClosing = true
m.Window.Hide()
m.Window.chromium.CloseBrowser(true)
}
})
}
//禁用口透明
func (m *TCefWindowInfo) DisableTransparent() {
m.Window.SetAllowDropFiles(false)
m.Window.SetAlphaBlend(false)
m.Window.SetAlphaBlendValue(255)
}
//使窗口透明 value 0 ~ 255
func (m *TCefWindowInfo) EnableTransparent(value uint8) {
m.Window.SetAllowDropFiles(true)
m.Window.SetAlphaBlend(true)
m.Window.SetAlphaBlendValue(value)
}
//禁用最小化按钮
func (m *TCefWindowInfo) DisableMinimize() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Exclude(types.BiMinimize))
}
//禁用最大化按钮
func (m *TCefWindowInfo) DisableMaximize() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Exclude(types.BiMaximize))
}
//禁用系统菜单-同时禁用最小化,最大化,关闭按钮
func (m *TCefWindowInfo) DisableSystemMenu() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Exclude(types.BiSystemMenu))
}
//禁用帮助菜单
func (m *TCefWindowInfo) DisableHelp() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Exclude(types.BiHelp))
}
//启用最小化按钮
func (m *TCefWindowInfo) EnableMinimize() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Include(types.BiMinimize))
}
//启用最大化按钮
func (m *TCefWindowInfo) EnableMaximize() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Include(types.BiMaximize))
}
//启用系统菜单-同时禁用最小化,最大化,关闭按钮
func (m *TCefWindowInfo) EnableSystemMenu() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Include(types.BiSystemMenu))
}
//启用帮助菜单
func (m *TCefWindowInfo) EnableHelp() {
m.Window.SetBorderIcons(m.Window.BorderIcons().Include(types.BiHelp))
}
func (m TCEFFrame) GetByFrameId(frameId int64) *ICefFrame {
if m != nil {
if frame, ok := m[frameId]; ok {
return frame
}
}
return nil
}
......@@ -13,6 +13,41 @@ import (
"github.com/energye/golcl/lcl/types"
)
//辅助工具
type auxTools struct {
devToolsWindow *LCLBrowserWindow //devTools
devToolsX int32 //上次改变的窗体位置,宽度
devToolsY int32 //
devToolsWidth int32 //
devToolsHeight int32 //
viewSourceWindow *LCLBrowserWindow //viewSource
viewSourceUrl string //
viewSourceX int32 //上次改变的窗体位置,宽度
viewSourceY int32 //
viewSourceWidth int32 //
viewSourceHeight int32 //
}
//窗口属性
type WindowProperty struct {
IsShowModel bool //是否以模态窗口显示
WindowState types.TWindowState //窗口 状态
Title string //窗口 标题
Url string //默认打开URL
Icon string //窗口图标 加载本地图标
IconFS string //窗口图标 加载emfs内置图标
CanMinimize bool //窗口 是否启用最小化功能
CanMaximize bool //窗口 是否启用最大化功能
CanResize bool //窗口 是否允许调整窗口大小
CanClose bool //窗口 关闭时是否关闭窗口
CenterWindow bool //窗口 是否居中显示
AlwaysOnTop bool //窗口 置顶
X int32 //窗口 CenterWindow=false X坐标
Y int32 //窗口 CenterWindow=false Y坐标
Width int32 //窗口 宽
Height int32 //窗口 高
}
//创建一个新window窗口
func NewWindow(windowProperty *WindowProperty) *LCLBrowserWindow {
if windowProperty == nil {
......@@ -50,3 +85,35 @@ func NewWindow(windowProperty *WindowProperty) *LCLBrowserWindow {
}
return window
}
type IBrowserWindow interface {
Show()
Hide()
Close()
}
type ILCLBrowserWindow interface {
IBrowserWindow
Id() int32
}
type IViewsFrameworkBrowserWindow interface {
IBrowserWindow
CreateTopLevelWindow()
CenterWindow(size *TCefSize)
}
//创建一个 窗口默认属性
func NewWindowProperty() *WindowProperty {
return &WindowProperty{
Title: "Energy",
Url: "about:blank",
CanMinimize: true,
CanMaximize: true,
CanResize: true,
CanClose: true,
CenterWindow: true,
Width: 1024,
Height: 768,
}
}
......@@ -28,7 +28,7 @@ func MainBrowserWindow() {
config.SetEnableDevTools(true)
cef.BrowserWindow.Config.SetChromiumConfig(config)
//创建窗口时的回调函数 对浏览器事件设置,和窗口属性组件等创建和修改
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.LCLBrowserWindow) {
//设置应用图标 这里加载的图标是内置到执行程序里的资源文件
lcl.Application.Icon().LoadFromFSFile("resources/icon.ico")
//在窗体初始化时创建窗口内的组件
......@@ -59,15 +59,15 @@ func MainBrowserWindow() {
})
})
//创建窗口之后对对主窗口的属性、组件或子窗口的创建
cef.BrowserWindow.SetBrowserInitAfter(func(browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInitAfter(func(browserWindow *cef.LCLBrowserWindow) {
fmt.Println("SetBrowserInitAfter")
})
}
//控制组件UI
//地址栏和控制按钮创建
func controlUI(browserWindow *cef.TCefWindowInfo) (goBack *lcl.TButton, goForward *lcl.TButton, stop *lcl.TButton, refresh *lcl.TButton, progressLabel *lcl.TLabel, addrBox *lcl.TComboBox) {
window := browserWindow.Window
func controlUI(browserWindow *cef.LCLBrowserWindow) (goBack *lcl.TButton, goForward *lcl.TButton, stop *lcl.TButton, refresh *lcl.TButton, progressLabel *lcl.TLabel, addrBox *lcl.TComboBox) {
window := browserWindow
//这里使用系统UI组件
//创建panel做为地址栏的父组件
addrPanel := lcl.NewPanel(window) //设置父组件
......
......@@ -51,7 +51,7 @@ func main() {
})
})
//在SetBrowserInit中设置cookie事件,这些事件将返回操作后的结果
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.LCLBrowserWindow) {
//获取cookie时触发
event.SetOnCookiesVisited(func(sender lcl.IObject, cookie *cef.ICefCookie) {
fmt.Printf("SetOnCookiesVisited: %+v\n", cookie)
......
......@@ -27,10 +27,10 @@ func main() {
//指定一个URL地址,或本地html文件目录
cef.BrowserWindow.Config.Url = "http://localhost:22022/download.html"
//在主窗口初始化回调函数里设置浏览器事件
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.LCLBrowserWindow) {
//linux 下载文件 系统弹出保存对话框不启作用
//所以 自己调用系统的保存对话框获得保存路径
linuxDlSave := lcl.NewSaveDialog(browserWindow.Window)
linuxDlSave := lcl.NewSaveDialog(browserWindow)
linuxDlSave.SetTitle("保存对话框标题")
//下载之前事件
......
......@@ -55,9 +55,9 @@ func timeTask() {
args.SetString(0, fmt.Sprintf("Go发送的数据: %d", param0), true)
args.SetFloat64(1, float64(param0+10))
//将数据发送出去
info.Chromium().Emit("js-on-event-demo", args, info.Browser)
info.Chromium().Emit("js-on-event-demo", args, info.Browser())
//触发js监听函数,这个函数带有返回值到go中
info.Chromium().EmitAndCallback("js-on-event-demo-return", args, info.Browser, func(context ipc.IIPCContext) {
info.Chromium().EmitAndCallback("js-on-event-demo-return", args, info.Browser(), func(context ipc.IIPCContext) {
//因为js和go不一样,返回值只能有1个,且是通过 Arguments 获取
arguments := context.Arguments()
//需要正确的获取类型,否则会失败
......
......@@ -21,7 +21,7 @@ func main() {
cef.BrowserWindow.Config.Title = "Energy - Key Event"
cef.BrowserWindow.Config.Icon = "resources/icon.ico"
//在主窗口初始化回调函数里设置浏览器事件
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.LCLBrowserWindow) {
event.SetOnKeyEvent(func(sender lcl.IObject, browser *cef.ICefBrowser, event *cef.TCefKeyEvent, result *bool) {
fmt.Printf("%s %+v\n", string(rune(event.Character)), event)
})
......
......@@ -33,11 +33,6 @@ func main() {
fmt.Println("SetOnContextMenuCommand", commandId)
})
})
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window *cef.TCefWindowInfo) {
fmt.Println("cef.BrowserWindow.SetBrowserInit", window)
fmt.Printf("%+v\n", window)
})
//在主进程启动成功之后执行
//在这里启动内置http服务
//内置http服务需要使用 go:embed resources 内置资源到执行程序中
......
......@@ -67,7 +67,7 @@ func AppBrowserInit() {
event.On("close", func(context ipc.IIPCContext) {
fmt.Println("close browserId:", context.BrowserId())
winInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
winInfo.Close()
winInfo.CloseBrowserWindow()
})
event.On("minWindow", func(context ipc.IIPCContext) {
winInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
......@@ -80,7 +80,7 @@ func AppBrowserInit() {
event.On("closeWindow", func(context ipc.IIPCContext) {
fmt.Println("closeWindow", context.BrowserId())
winInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
winInfo.Close()
winInfo.CloseBrowserWindow()
})
event.On("window-list", func(context ipc.IIPCContext) {
var ids []int32
......@@ -95,11 +95,11 @@ func AppBrowserInit() {
args := context.Arguments().GetString(0)
fmt.Println("find-args:", args)
winInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
winInfo.Browser.Find(args, false, false, true)
winInfo.Browser().Find(args, false, false, true)
})
event.On("find-stop", func(context ipc.IIPCContext) {
winInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
winInfo.Browser.StopFinding(true)
winInfo.Browser().StopFinding(true)
})
var newForm *cef.LCLBrowserWindow
event.On("js-new-window", func(context ipc.IIPCContext) {
......@@ -139,6 +139,7 @@ func AppBrowserInit() {
browserWindow = cef.NewBrowserWindow(nil, wp)
browserWindow.SetWidth(800)
browserWindow.SetHeight(600)
browserWindow.SetShowInTaskBar()
}
fmt.Println("\t|--", browserWindow.IsClosing())
cef.QueueAsyncCall(func(id int) {
......@@ -173,47 +174,47 @@ func AppBrowserInit() {
})
//主窗口初始化回调函数
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.LCLBrowserWindow) {
lcl.Application.SetOnMinimize(func(sender lcl.IObject) {
fmt.Println("minimize")
})
fmt.Println("主窗口初始化回调函数")
lcl.Application.Icon().LoadFromFSFile("resources/icon.ico") //设置应用图标
browserWindow.Window.SetCaption("这里设置应用标题")
browserWindow.Window.SetPosition(types.PoScreenCenter) //窗口局中显示
browserWindow.SetCaption("这里设置应用标题")
browserWindow.SetPosition(types.PoScreenCenter) //窗口局中显示
//设置窗口样式,无标题 ,最大化按钮等
//browserWindow.Window.SetBorderStyle(types.BsSingle)
//browserWindow.Window.SetFormStyle(types.FsNormal)
//browserWindow.Window.SetFormStyle(types.FsSystemStayOnTop)
//browserWindow.SetBorderStyle(types.BsSingle)
//browserWindow.SetFormStyle(types.FsNormal)
//browserWindow.SetFormStyle(types.FsSystemStayOnTop)
//设置窗口大小
browserWindow.Window.SetWidth(1600)
browserWindow.Window.SetHeight(900)
browserWindow.SetWidth(1600)
browserWindow.SetHeight(900)
//限制窗口大小 linux 下不是很友好
//browserWindow.Window.Constraints().SetMinHeight(300)
//browserWindow.Window.Constraints().SetMinWidth(300)
//browserWindow.Window.Constraints().SetMaxWidth(1600)
//browserWindow.Window.Constraints().SetMaxHeight(900)
browserWindow.Window.Constraints().SetOnChange(func(sender lcl.IObject) {
browserWindow.Constraints().SetOnChange(func(sender lcl.IObject) {
fmt.Println("browserWindow SetOnChange")
})
//添加事件,add不会覆盖默认的事件 set会覆盖默认的事件
browserWindow.Window.AddOnClose(func(sender lcl.IObject, action *types.TCloseAction) bool {
browserWindow.AddOnClose(func(sender lcl.IObject, action *types.TCloseAction) bool {
fmt.Println("添加onclose事件")
return false
})
//窗口大小改变后触发
browserWindow.Window.AddOnResize(func(sender lcl.IObject) bool {
browserWindow.AddOnResize(func(sender lcl.IObject) bool {
//Browser是在chromium加载完之后创建, 窗口创建时该对象还不存在
if browserWindow.Browser != nil {
if browserWindow.Browser() != nil {
var target = &cef.EmitTarget{
BrowseId: browserWindow.Browser.Identifier(),
FrameId: browserWindow.Browser.MainFrame().Id,
BrowseId: browserWindow.Browser().Identifier(),
FrameId: browserWindow.Browser().MainFrame().Id,
}
var argumentList = ipc.NewArgumentList()
argumentList.SetInt32(0, browserWindow.Window.Left())
argumentList.SetInt32(1, browserWindow.Window.Top())
argumentList.SetInt32(2, browserWindow.Window.Width())
argumentList.SetInt32(3, browserWindow.Window.Height())
argumentList.SetInt32(0, browserWindow.Left())
argumentList.SetInt32(1, browserWindow.Top())
argumentList.SetInt32(2, browserWindow.Width())
argumentList.SetInt32(3, browserWindow.Height())
browserWindow.Chromium().Emit("window-resize", argumentList, target)
browserWindow.Chromium().EmitAndCallback("window-resize", argumentList, target, func(context ipc.IIPCContext) {
fmt.Println("EmitAndCallback AddOnResize")
......@@ -225,18 +226,18 @@ func AppBrowserInit() {
return false
})
//windows下可以使用这个函数,实时触发
browserWindow.Window.SetOnConstrainedResize(func(sender lcl.IObject, minWidth, minHeight, maxWidth, maxHeight *int32) {
browserWindow.SetOnConstrainedResize(func(sender lcl.IObject, minWidth, minHeight, maxWidth, maxHeight *int32) {
//Browser是在chromium加载完之后创建, 窗口创建时该对象还不存在
if browserWindow.Browser != nil {
if browserWindow.Browser() != nil {
var target = &cef.EmitTarget{
BrowseId: browserWindow.Browser.Identifier(),
FrameId: browserWindow.Browser.MainFrame().Id,
BrowseId: browserWindow.Browser().Identifier(),
FrameId: browserWindow.Browser().MainFrame().Id,
}
var argumentList = ipc.NewArgumentList()
argumentList.SetInt32(0, browserWindow.Window.Left())
argumentList.SetInt32(1, browserWindow.Window.Top())
argumentList.SetInt32(2, browserWindow.Window.Width())
argumentList.SetInt32(3, browserWindow.Window.Height())
argumentList.SetInt32(0, browserWindow.Left())
argumentList.SetInt32(1, browserWindow.Top())
argumentList.SetInt32(2, browserWindow.Width())
argumentList.SetInt32(3, browserWindow.Height())
browserWindow.Chromium().Emit("window-resize", argumentList, target)
//使用EmitAndReturn函数会锁死
// browserWindow.Chromium.EmitAndCallback("window-resize", argumentList, target, func(context cef.IIPCContext) {
......@@ -245,11 +246,11 @@ func AppBrowserInit() {
}
})
//自定义browser窗体
addressBar(browserWindow.Window)
addressBar(browserWindow)
//下载文件
//linux系统弹出保存对话框不启作用
//自己调用系统的保存对话框获得保存路径
dlSave := lcl.NewSaveDialog(browserWindow.Window)
dlSave := lcl.NewSaveDialog(browserWindow)
dlSave.SetTitle("保存对话框标题")
event.SetOnBeforeDownload(func(sender lcl.IObject, browser *cef.ICefBrowser, beforeDownloadItem *cef.DownloadItem, suggestedName string, callback *cef.ICefBeforeDownloadCallback) {
fmt.Println("OnBeforeDownload:", beforeDownloadItem, suggestedName)
......@@ -273,45 +274,45 @@ func AppBrowserInit() {
event.SetOnFindResult(func(sender lcl.IObject, browser *cef.ICefBrowser, identifier, count int32, selectionRect *cef.TCefRect, activeMatchOrdinal int32, finalUpdate bool) {
fmt.Println("OnFindResult:", browser.Identifier(), identifier, count, selectionRect, activeMatchOrdinal, finalUpdate)
})
event.SetOnBeforePopup(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, beforePopupInfo *cef.BeforePopupInfo, popupWindow *cef.TCefWindowInfo, noJavascriptAccess *bool) bool {
event.SetOnBeforePopup(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, beforePopupInfo *cef.BeforePopupInfo, popupWindow *cef.LCLBrowserWindow, noJavascriptAccess *bool) bool {
fmt.Println("OnBeforePopup: " + beforePopupInfo.TargetUrl)
popupWindow.Window.SetCaption("改变了标题 - " + beforePopupInfo.TargetUrl)
popupWindow.SetCaption("改变了标题 - " + beforePopupInfo.TargetUrl)
//popupWindow.Form.SetBorderStyle(types.BsNone)
//popupWindow.Form.SetFormStyle(types.FsNormal)
popupWindow.Window.SetWidth(800)
popupWindow.Window.SetHeight(600)
popupWindow.SetWidth(800)
popupWindow.SetHeight(600)
//窗口弹出之前可自定义系统组件
//窗口大小改变后触发
//windows下窗口调整后触发一次
popupWindow.Window.AddOnResize(func(sender lcl.IObject) bool {
popupWindow.AddOnResize(func(sender lcl.IObject) bool {
//Browser是在chromium加载完之后创建, 窗口创建时该对象还不存在
if popupWindow.Browser != nil {
if popupWindow.Browser() != nil {
var target = &cef.EmitTarget{
BrowseId: popupWindow.Browser.Identifier(),
FrameId: popupWindow.Browser.MainFrame().Id,
BrowseId: popupWindow.Browser().Identifier(),
FrameId: popupWindow.Browser().MainFrame().Id,
}
var argumentList = ipc.NewArgumentList()
argumentList.SetInt32(0, popupWindow.Window.Left())
argumentList.SetInt32(1, popupWindow.Window.Top())
argumentList.SetInt32(2, popupWindow.Window.Width())
argumentList.SetInt32(3, popupWindow.Window.Height())
argumentList.SetInt32(0, popupWindow.Left())
argumentList.SetInt32(1, popupWindow.Top())
argumentList.SetInt32(2, popupWindow.Width())
argumentList.SetInt32(3, popupWindow.Height())
popupWindow.Chromium().Emit("window-resize", argumentList, target)
}
return false
})
//windows下可以使用这个函数,实时触发
popupWindow.Window.SetOnConstrainedResize(func(sender lcl.IObject, minWidth, minHeight, maxWidth, maxHeight *int32) {
popupWindow.SetOnConstrainedResize(func(sender lcl.IObject, minWidth, minHeight, maxWidth, maxHeight *int32) {
//Browser是在chromium加载完之后创建, 窗口创建时该对象还不存在
if popupWindow.Browser != nil {
if popupWindow.Browser() != nil {
var target = &cef.EmitTarget{
BrowseId: popupWindow.Browser.Identifier(),
FrameId: popupWindow.Browser.MainFrame().Id,
BrowseId: popupWindow.Browser().Identifier(),
FrameId: popupWindow.Browser().MainFrame().Id,
}
var argumentList = ipc.NewArgumentList()
argumentList.SetInt32(0, popupWindow.Window.Left())
argumentList.SetInt32(1, popupWindow.Window.Top())
argumentList.SetInt32(2, popupWindow.Window.Width())
argumentList.SetInt32(3, popupWindow.Window.Height())
argumentList.SetInt32(0, popupWindow.Left())
argumentList.SetInt32(1, popupWindow.Top())
argumentList.SetInt32(2, popupWindow.Width())
argumentList.SetInt32(3, popupWindow.Height())
popupWindow.Chromium().Emit("window-resize", argumentList, target)
}
})
......@@ -373,7 +374,7 @@ func AppBrowserInit() {
})
})
//添加子窗口初始化
cef.BrowserWindow.SetBrowserInitAfter(func(browserWindow *cef.TCefWindowInfo) {
cef.BrowserWindow.SetBrowserInitAfter(func(browserWindow *cef.LCLBrowserWindow) {
//在这里创建 一些子窗口 子组件 等
//托盘
if common.IsWindows() {
......@@ -385,14 +386,14 @@ func AppBrowserInit() {
}
// 托盘 只适用 windows 的系统托盘, 基于html 和 ipc 实现功能
func cefTray(browserWindow *cef.TCefWindowInfo) {
func cefTray(browserWindow *cef.LCLBrowserWindow) {
var url = "http://localhost:22022/min-browser-tray.html"
tray := browserWindow.NewCefTray(250, 300, url)
tray.SetTitle("任务管理器里显示的标题")
tray.SetHint("这里是文字\n文字啊")
tray.SetIcon("resources/icon.ico")
tray.SetOnClick(func(sender lcl.IObject) {
browserWindow.Window.SetVisible(!browserWindow.Window.Visible())
browserWindow.SetVisible(!browserWindow.Visible())
})
tray.SetBalloon("气泡标题", "气泡内容", 2000)
ipc.IPC.Browser().On("tray-show-balloon", func(context ipc.IIPCContext) {
......@@ -401,18 +402,18 @@ func cefTray(browserWindow *cef.TCefWindowInfo) {
tray.Hide()
})
ipc.IPC.Browser().On("tray-show-main-window", func(context ipc.IIPCContext) {
vb := !browserWindow.Window.Visible()
browserWindow.Window.SetVisible(vb)
vb := !browserWindow.Visible()
browserWindow.SetVisible(vb)
if vb {
if browserWindow.Window.WindowState() == types.WsMinimized {
browserWindow.Window.SetWindowState(types.WsNormal)
if browserWindow.WindowState() == types.WsMinimized {
browserWindow.SetWindowState(types.WsNormal)
}
browserWindow.Window.Focused()
browserWindow.Focused()
}
tray.Hide()
})
ipc.IPC.Browser().On("tray-close-main-window", func(context ipc.IIPCContext) {
browserWindow.Window.Close()
browserWindow.CloseBrowserWindow()
})
ipc.IPC.Browser().On("tray-show-message-box", func(context ipc.IIPCContext) {
cef.QueueAsyncCall(func(id int) {
......@@ -424,7 +425,7 @@ func cefTray(browserWindow *cef.TCefWindowInfo) {
}
// 托盘 系统原生 windows linux macos
func tray(browserWindow *cef.TCefWindowInfo) {
func tray(browserWindow *cef.LCLBrowserWindow) {
//托盘 windows linux macos 系统托盘
newTray := browserWindow.NewTray()
tray := newTray.Tray()
......@@ -437,12 +438,12 @@ func tray(browserWindow *cef.TCefWindowInfo) {
newTray.ShowBalloon()
})
tray.AddMenuItem("显示/隐藏", func(object lcl.IObject) {
vis := browserWindow.Window.Visible()
vis := browserWindow.Visible()
cef.BrowserWindow.GetWindowInfo(1)
browserWindow.Window.SetVisible(!vis)
browserWindow.SetVisible(!vis)
})
tray.AddMenuItem("退出", func(object lcl.IObject) {
browserWindow.Close()
browserWindow.CloseBrowserWindow()
})
//linux下有些问题
tray.SetBalloon("气泡标题", "气泡内容", 2000)
......@@ -495,5 +496,5 @@ func addressBar(window *cef.LCLBrowserWindow) {
//
//fmt.Println("monitor WorkareaRect:", monitor.WorkareaRect())
//fmt.Println("monitor Height:", monitor.Height(), "Width:", monitor.Width())
//fmt.Println("m.Window.WindowState():", window.WindowState())
//fmt.Println("m.WindowState():", window.WindowState())
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册