提交 4a9d599e 编写于 作者: yanghye's avatar yanghye

Fixed Chinese input and gtk3 issues for linux packaging

上级 6c9e89cf
......@@ -36,7 +36,7 @@ func createBrowserDevTools(browser *ICefBrowser, browserWinInfo *TCefWindowInfo)
winAuxTools.devToolsWindow.Show()
return
}
winAuxTools.devToolsWindow = &BaseWindow{}
winAuxTools.devToolsWindow = &LCLBrowserWindow{}
winAuxTools.devToolsWindow.SetWindowType(WT_DEV_TOOLS)
winAuxTools.devToolsWindow.TForm = lcl.NewForm(browserWinInfo.Window)
winAuxTools.devToolsWindow.SetCaption(fmt.Sprintf("%s - %s", dev_tools_name, browser.MainFrame().Url))
......
......@@ -51,8 +51,7 @@ func SetBrowserProcessStartAfterCallback(callback browserProcessStartAfterCallba
// 浏览器包装结构体
type browser struct {
mainBrowserWindow *browserWindow //主浏览器窗口
mainWindow *TCefWindowInfo //主窗口信息
popupWindow *browserWindow //弹出的子窗口
popupWindow *LCLBrowserWindow //弹出的子窗口
browserEvent *BrowserEvent //浏览器全局事件
Config *browserConfig //浏览器和窗口配置
windowInfo map[int32]*TCefWindowInfo //窗口信息集合
......@@ -84,7 +83,7 @@ type BrowserEvent struct {
}
type browserWindow struct {
BaseWindow
LCLBrowserWindow
isFirstActivate bool
tray ITray
}
......@@ -140,7 +139,7 @@ func (m *browserWindow) OnFormCreate(sender lcl.IObject) {
m.ChromiumCreate(BrowserWindow.Config.chromiumConfig, BrowserWindow.Config.Url)
m.putChromiumWindowInfo()
m.defaultChromiumEvent()
BrowserWindow.mainWindow = m.windowInfo
BrowserWindow.mainBrowserWindow.windowInfo = m.windowInfo
m.AddOnCloseQuery(func(sender lcl.IObject, canClose *bool) bool {
if m.tray != nil {
m.tray.close()
......@@ -173,7 +172,7 @@ func (m *browserWindow) OnFormCreate(sender lcl.IObject) {
}
func (m *browser) MainWindow() *TCefWindowInfo {
return m.mainWindow
return m.mainBrowserWindow.windowInfo
}
// 基于CEF views framework窗口 - 主窗口和chromium初始化时回调
......@@ -240,7 +239,7 @@ func (m *browser) GetNextWindowNum() int32 {
}
func (m *browser) createNextPopupWindow() {
m.popupWindow = &browserWindow{}
m.popupWindow = &LCLBrowserWindow{}
m.popupWindow.TForm = lcl.NewForm(m.MainWindow().Window)
m.popupWindow.FormCreate()
m.popupWindow.defaultWindowEvent()
......
......@@ -37,7 +37,7 @@ type IChromiumProc interface {
StopLoad()
ResetZoomLevel()
CloseAllBrowsers()
CreateBrowser(window ITCefWindow) bool
CreateBrowser(window ITCefWindowParent) bool
CreateBrowserByBrowserViewComponent(homePage string, browserViewComponent *TCEFBrowserViewComponent) bool
Initialized() bool
BrowserId() int32
......@@ -51,8 +51,8 @@ type IChromiumProc interface {
GoForward()
NotifyMoveOrResizeStarted()
CloseBrowser(forceClose bool)
ShowDevTools(window ITCefWindow)
CloseDevTools(window ITCefWindow)
ShowDevTools(window ITCefWindowParent)
CloseDevTools(window ITCefWindowParent)
VisitAllCookies(id int32)
VisitURLCookies(url string, includeHttpOnly bool, id int32)
DeleteCookies(url, cookieName string, deleteImmediately bool)
......@@ -166,7 +166,7 @@ func (m *TCEFChromium) CloseAllBrowsers() {
_CEFChromium_CloseAllBrowses(m.Instance())
}
func (m *TCEFChromium) CreateBrowser(window ITCefWindow) bool {
func (m *TCEFChromium) CreateBrowser(window ITCefWindowParent) bool {
if window.Type() == Wht_WindowParent {
return _CEFChromium_CreateBrowseByWindow(m.Instance(), window.Instance())
} else if window.Type() == Wht_LinkedWindowParent {
......@@ -235,7 +235,7 @@ func (m *TCEFChromium) CloseBrowser(forceClose bool) {
_CEFChromium_CloseBrowser(m.Instance(), api.PascalBool(forceClose))
}
func (m *TCEFChromium) ShowDevTools(window ITCefWindow) {
func (m *TCEFChromium) ShowDevTools(window ITCefWindowParent) {
if window == nil {
_CEFChromium_ShowDevTools(m.Instance())
} else {
......@@ -243,7 +243,7 @@ func (m *TCEFChromium) ShowDevTools(window ITCefWindow) {
}
}
func (m *TCEFChromium) CloseDevTools(window ITCefWindow) {
func (m *TCEFChromium) CloseDevTools(window ITCefWindowParent) {
if window == nil {
_CEFChromium_CloseDevTools(m.Instance())
} else {
......
......@@ -27,7 +27,7 @@ type tCefTrayForm struct {
owner lcl.IWinControl
trayIcon *lcl.TTrayIcon
chromium IChromium
windowParent ITCefWindow
windowParent ITCefWindowParent
x, y, w, h int32
mouseUp TMouseEvent
isClosing bool
......
......@@ -14,6 +14,8 @@ import (
"github.com/energye/energy/ipc"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/rtl"
"github.com/energye/golcl/lcl/types/messages"
)
// 事件处理函数返回true将不继续执行
......@@ -21,9 +23,9 @@ func chromiumOnAfterCreate(browser *ICefBrowser) bool {
if viewSourceAfterCreate(browser) {
return true
}
//if IsWindows() {
// rtl.SendMessage(browser.HostWindowHandle(), messages.WM_SETICON, 1, lcl.Application.Icon().Handle())
//}
if IsWindows() {
rtl.SendMessage(browser.HostWindowHandle(), messages.WM_SETICON, 1, lcl.Application.Icon().Handle())
}
return false
}
......
......@@ -14,7 +14,7 @@ import (
"github.com/energye/golcl/lcl"
)
type ITCefWindow interface {
type ITCefWindowParent interface {
lcl.IWinControl
Type() consts.TCefWindowHandleType
SetChromium(chromium IChromium, tag int32)
......@@ -27,7 +27,7 @@ type ITCefWindow interface {
Free()
}
func NewCEFWindow(owner lcl.IComponent) ITCefWindow {
func NewCEFWindow(owner lcl.IComponent) ITCefWindowParent {
if common.IsWindows() {
return NewCEFWindowParent(owner)
} else {
......
......@@ -26,18 +26,19 @@ import (
type IBaseWindow interface {
lcl.IWinControl
FormCreate()
WindowParent() ITCefWindow
WindowParent() ITCefWindowParent
Chromium() IChromium
ChromiumCreate(config *tCefChromiumConfig, defaultUrl string)
registerEvent()
registerDefaultEvent()
}
//BaseWindow 是一个基于chromium 和 lcl 的窗口组件
type BaseWindow struct {
*lcl.TForm //
chromium IChromium //
windowParent ITCefWindow //
//LCLBrowserWindow 基于chromium 和 lcl 的窗口组件
type LCLBrowserWindow struct {
*lcl.TForm //
chromium IChromium //
windowParent ITCefWindowParent //
windowProperty *WindowProperty
vFrameBrowserWindow *ViewsFrameworkBrowserWindow //基于CEF views framework窗口
windowInfo *TCefWindowInfo //基于LCL窗口信息
windowId int32 //
......@@ -57,52 +58,80 @@ type BaseWindow struct {
//创建一个带有 chromium 窗口
//
//该窗口默认不具备默认事件处理能力, 通过 EnableDefaultEvent 函数注册事件处理
func NewBrowserWindow(config *tCefChromiumConfig, defaultUrl string) *Window {
var window = NewWindow()
window.ChromiumCreate(config, defaultUrl)
func NewBrowserWindow(config *tCefChromiumConfig, windowProperty *WindowProperty) *LCLBrowserWindow {
if windowProperty == nil {
windowProperty = NewWindowProperty()
}
var window = NewWindow(windowProperty)
window.ChromiumCreate(config, windowProperty.Url)
window.putChromiumWindowInfo()
//BeforeBrowser是一个必须的默认事件,在浏览器创建时窗口序号会根据browserId生成
//OnBeforeBrowser 是一个必须的默认事件,在浏览器创建时窗口序号会根据browserId生成
window.Chromium().SetOnBeforeBrowser(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame) bool { return false })
return window
}
func (m *BaseWindow) Id() int32 {
func (m *LCLBrowserWindow) Chromium() IChromium {
return m.chromium
}
func (m *LCLBrowserWindow) Id() int32 {
return m.windowId
}
func (m *BaseWindow) Show() {
func (m *LCLBrowserWindow) Show() {
if m.TForm == nil {
return
}
m.TForm.Show()
}
func (m *BaseWindow) Hide() {
func (m *LCLBrowserWindow) Hide() {
if m.TForm == nil {
return
}
m.TForm.Hide()
}
func (m *BaseWindow) Visible() bool {
func (m *LCLBrowserWindow) Visible() bool {
if m.TForm == nil {
return false
}
return m.TForm.Visible()
}
func (m *BaseWindow) SetVisible(value bool) {
func (m *LCLBrowserWindow) SetVisible(value bool) {
if m.TForm == nil {
return
}
m.TForm.SetVisible(value)
}
//返回窗口信息
func (m *BaseWindow) WindowInfo() *TCefWindowInfo {
func (m *LCLBrowserWindow) WindowInfo() *TCefWindowInfo {
return m.windowInfo
}
//以默认的方式展示在任务栏上
func (m *BaseWindow) SetDefaultInTaskBar() {
func (m *LCLBrowserWindow) SetDefaultInTaskBar() {
if m.TForm == nil {
return
}
m.TForm.SetShowInTaskBar(types.StDefault)
}
//展示在任务栏上
func (m *BaseWindow) SetShowInTaskBar() {
func (m *LCLBrowserWindow) SetShowInTaskBar() {
if m.TForm == nil {
return
}
m.TForm.SetShowInTaskBar(types.StAlways)
}
//不会展示在任务栏上
func (m *BaseWindow) SetNotInTaskBar() {
func (m *LCLBrowserWindow) SetNotInTaskBar() {
if m.TForm == nil {
return
}
m.TForm.SetShowInTaskBar(types.StNever)
}
......@@ -111,29 +140,29 @@ func (m *BaseWindow) SetNotInTaskBar() {
//在windows下它是 TCEFWindowParent, linux或macOSx下它是 TCEFLinkedWindowParent
//
//通过函数可调整该组件的属性
func (m *BaseWindow) WindowParent() ITCefWindow {
func (m *LCLBrowserWindow) WindowParent() ITCefWindowParent {
return m.windowParent
}
//返回窗口关闭状态
func (m *BaseWindow) IsClosing() bool {
func (m *LCLBrowserWindow) IsClosing() bool {
return m.isClosing
}
// 设置窗口类型
func (m *BaseWindow) SetWindowType(windowType consts.WINDOW_TYPE) {
func (m *LCLBrowserWindow) SetWindowType(windowType consts.WINDOW_TYPE) {
m.windowType = windowType
}
// 返回窗口类型
func (m *BaseWindow) WindowType() consts.WINDOW_TYPE {
func (m *LCLBrowserWindow) WindowType() consts.WINDOW_TYPE {
return m.windowType
}
// 创建window浏览器组件
//
// 不带有默认事件的chromium
func (m *BaseWindow) ChromiumCreate(config *tCefChromiumConfig, defaultUrl string) {
func (m *LCLBrowserWindow) ChromiumCreate(config *tCefChromiumConfig, defaultUrl string) {
if m.isChromiumCreate {
return
}
......@@ -173,7 +202,7 @@ func (m *BaseWindow) ChromiumCreate(config *tCefChromiumConfig, defaultUrl strin
})
}
func (m *BaseWindow) putChromiumWindowInfo() {
func (m *LCLBrowserWindow) putChromiumWindowInfo() {
m.windowInfo = &TCefWindowInfo{
Window: m,
Browser: nil,
......@@ -185,9 +214,10 @@ func (m *BaseWindow) putChromiumWindowInfo() {
}
//默认的chromium事件
func (m *BaseWindow) defaultChromiumEvent() {
func (m *LCLBrowserWindow) defaultChromiumEvent() {
if m.WindowType() != consts.WT_DEV_TOOLS {
AddGoForm(m.windowId, m.Instance())
m.registerPopupEvent()
m.registerDefaultEvent()
m.registerDefaultChromiumCloseEvent()
}
......@@ -196,7 +226,7 @@ func (m *BaseWindow) defaultChromiumEvent() {
// 创建窗口
//
// 不带有默认事件的窗口
func (m *BaseWindow) FormCreate() {
func (m *LCLBrowserWindow) FormCreate() {
if m.isFormCreate {
return
}
......@@ -206,7 +236,7 @@ func (m *BaseWindow) FormCreate() {
}
//默认窗口活动/关闭处理事件
func (m *BaseWindow) defaultWindowEvent() {
func (m *LCLBrowserWindow) defaultWindowEvent() {
if m.WindowType() != consts.WT_DEV_TOOLS {
m.SetOnResize(m.resize)
m.SetOnActivate(m.activate)
......@@ -215,42 +245,54 @@ func (m *BaseWindow) defaultWindowEvent() {
}
//默认的窗口关闭事件
func (m *BaseWindow) defaultWindowCloseEvent() {
func (m *LCLBrowserWindow) defaultWindowCloseEvent() {
m.SetOnClose(m.close)
m.SetOnCloseQuery(m.closeQuery)
}
//启用默认关闭事件行为-该窗口将被关闭
func (m *LCLBrowserWindow) EnableDefaultClose() {
m.defaultWindowCloseEvent()
m.registerDefaultChromiumCloseEvent()
}
//启用所有默认事件行为
func (m *LCLBrowserWindow) EnableAllDefaultEvent() {
m.defaultWindowCloseEvent()
m.defaultChromiumEvent()
}
// 添加OnResize事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
func (m *BaseWindow) AddOnResize(fn TNotifyEvent) {
func (m *LCLBrowserWindow) AddOnResize(fn TNotifyEvent) {
m.onResize = append(m.onResize, fn)
}
// 添加OnActivate事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
func (m *BaseWindow) AddOnActivate(fn TNotifyEvent) {
func (m *LCLBrowserWindow) AddOnActivate(fn TNotifyEvent) {
m.onActivate = append(m.onActivate, fn)
}
// 添加OnShow事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
func (m *BaseWindow) AddOnShow(fn TNotifyEvent) {
func (m *LCLBrowserWindow) AddOnShow(fn TNotifyEvent) {
m.onShow = append(m.onShow, fn)
}
// 添加OnClose事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
func (m *BaseWindow) AddOnClose(fn TCloseEvent) {
func (m *LCLBrowserWindow) AddOnClose(fn TCloseEvent) {
m.onClose = append(m.onClose, fn)
}
// 添加OnCloseQuery事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
func (m *BaseWindow) AddOnCloseQuery(fn TCloseQueryEvent) {
func (m *LCLBrowserWindow) AddOnCloseQuery(fn TCloseQueryEvent) {
m.onCloseQuery = append(m.onCloseQuery, fn)
}
//每次激活窗口之后执行一次
func (m *BaseWindow) SetOnActivateAfter(fn lcl.TNotifyEvent) {
func (m *LCLBrowserWindow) SetOnActivateAfter(fn lcl.TNotifyEvent) {
m.onActivateAfter = fn
}
func (m *BaseWindow) show(sender lcl.IObject) {
func (m *LCLBrowserWindow) show(sender lcl.IObject) {
var ret bool
if m.onShow != nil {
for _, fn := range m.onShow {
......@@ -268,7 +310,7 @@ func (m *BaseWindow) show(sender lcl.IObject) {
}
}
func (m *BaseWindow) resize(sender lcl.IObject) {
func (m *LCLBrowserWindow) resize(sender lcl.IObject) {
var ret bool
if m.onResize != nil {
for _, fn := range m.onResize {
......@@ -290,7 +332,7 @@ func (m *BaseWindow) resize(sender lcl.IObject) {
}
}
func (m *BaseWindow) activate(sender lcl.IObject) {
func (m *LCLBrowserWindow) activate(sender lcl.IObject) {
var ret bool
if m.onActivate != nil {
for _, fn := range m.onActivate {
......@@ -313,9 +355,7 @@ func (m *BaseWindow) activate(sender lcl.IObject) {
m.onActivateAfter(sender)
}
}
// 默认事件注册 部分事件允许被覆盖
func (m *BaseWindow) registerDefaultEvent() {
func (m *LCLBrowserWindow) registerPopupEvent() {
var bwEvent = BrowserWindow.browserEvent
m.chromium.SetOnBeforePopup(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, beforePopupInfo *BeforePopupInfo, client *ICefClient, noJavascriptAccess *bool) bool {
if !api.GoBool(BrowserWindow.Config.chromiumConfig.enableWindowPopup) {
......@@ -348,12 +388,52 @@ func (m *BaseWindow) registerDefaultEvent() {
}
return result
})
}
// 默认事件注册 部分事件允许被覆盖
func (m *LCLBrowserWindow) registerDefaultEvent() {
var bwEvent = BrowserWindow.browserEvent
//默认自定义快捷键
defaultAcceleratorCustom()
m.chromium.SetOnProcessMessageReceived(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, sourceProcess consts.CefProcessId, message *ipc.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)
}
})
//事件可以被覆盖
m.chromium.SetOnBeforeDownload(func(sender lcl.IObject, browser *ICefBrowser, beforeDownloadItem *DownloadItem, 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) {
chromiumOnBeforeContextMenu(sender, browser, frame, params, model)
if bwEvent.onBeforeContextMenu != nil {
bwEvent.onBeforeContextMenu(sender, browser, frame, params, model)
}
})
m.chromium.SetOnContextMenuCommand(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32, result *bool) {
chromiumOnContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
if bwEvent.onContextMenuCommand != nil {
bwEvent.onContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
}
})
m.chromium.SetOnLoadingStateChange(func(sender lcl.IObject, browser *ICefBrowser, isLoading, canGoBack, canGoForward bool) {
if bwEvent.onLoadingStateChange != nil {
bwEvent.onLoadingStateChange(sender, browser, isLoading, canGoBack, canGoForward)
}
})
m.chromium.SetOnFrameCreated(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame) {
QueueAsyncCall(func(id int) {
BrowserWindow.putBrowserFrame(browser, frame)
......@@ -368,6 +448,7 @@ func (m *BaseWindow) registerDefaultEvent() {
bwEvent.onFrameDetached(sender, browser, frame)
}
})
m.chromium.SetOnAfterCreated(func(sender lcl.IObject, browser *ICefBrowser) {
if chromiumOnAfterCreate(browser) {
return
......@@ -376,24 +457,6 @@ func (m *BaseWindow) registerDefaultEvent() {
bwEvent.onAfterCreated(sender, browser)
}
})
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)
}
})
//事件可以被覆盖
m.chromium.SetOnBeforeDownload(func(sender lcl.IObject, browser *ICefBrowser, beforeDownloadItem *DownloadItem, suggestedName string, callback *ICefBeforeDownloadCallback) {
if bwEvent.onBeforeDownload != nil {
bwEvent.onBeforeDownload(sender, browser, beforeDownloadItem, suggestedName, callback)
} else {
callback.Cont(consts.ExePath+consts.Separator+suggestedName, true)
}
})
//默认自定义快捷键
defaultAcceleratorCustom()
//事件可以被覆盖
m.chromium.SetOnKeyEvent(func(sender lcl.IObject, browser *ICefBrowser, event *TCefKeyEvent, result *bool) {
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableDevTools) {
......@@ -430,25 +493,14 @@ func (m *BaseWindow) registerDefaultEvent() {
bwEvent.onTitleChange(sender, browser, title)
}
})
m.chromium.SetOnBeforeContextMenu(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, model *ICefMenuModel) {
chromiumOnBeforeContextMenu(sender, browser, frame, params, model)
if bwEvent.onBeforeContextMenu != nil {
bwEvent.onBeforeContextMenu(sender, browser, frame, params, model)
}
})
m.chromium.SetOnContextMenuCommand(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32, result *bool) {
chromiumOnContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
if bwEvent.onContextMenuCommand != nil {
bwEvent.onContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
}
})
m.chromium.SetOnLoadingStateChange(func(sender lcl.IObject, browser *ICefBrowser, isLoading, canGoBack, canGoForward bool) {
if bwEvent.onLoadingStateChange != nil {
bwEvent.onLoadingStateChange(sender, browser, isLoading, canGoBack, canGoForward)
}
})
}
func (m *BaseWindow) close(sender lcl.IObject, action *types.TCloseAction) {
//控制LCL创建的窗口事件
func (m *LCLBrowserWindow) registerControlLCLWindowEvent() {
}
func (m *LCLBrowserWindow) close(sender lcl.IObject, action *types.TCloseAction) {
var ret bool
if m.onClose != nil {
for _, fn := range m.onClose {
......@@ -463,7 +515,7 @@ func (m *BaseWindow) close(sender lcl.IObject, action *types.TCloseAction) {
}
}
func (m *BaseWindow) closeQuery(sender lcl.IObject, close *bool) {
func (m *LCLBrowserWindow) closeQuery(sender lcl.IObject, close *bool) {
var ret bool
if m.onCloseQuery != nil {
for _, fn := range m.onCloseQuery {
......@@ -501,7 +553,7 @@ func (m *BaseWindow) closeQuery(sender lcl.IObject, close *bool) {
}
//默认的chromium关闭事件
func (m *BaseWindow) registerDefaultChromiumCloseEvent() {
func (m *LCLBrowserWindow) registerDefaultChromiumCloseEvent() {
var bwEvent = BrowserWindow.browserEvent
m.chromium.SetOnClose(func(sender lcl.IObject, browser *ICefBrowser, aAction *TCefCloseBrowsesAction) {
logger.Debug("chromium.onClose")
......
......@@ -18,8 +18,6 @@ import (
"github.com/energye/golcl/lcl/api"
)
//为解决linux 107.xx以后版本gtk2和gtk3共存和中文输入问题
//
//基于CEF views framework窗口
//
//该窗口使用CEF内部实现,在linux下107.xx以后版本默认使用GTK3,但无法使用lcl组件集成到窗口中
......@@ -30,7 +28,7 @@ type ViewsFrameworkBrowserWindow struct {
component lcl.IComponent //
windowComponent *TCEFWindowComponent //
browserViewComponent *TCEFBrowserViewComponent //
windowProperty *WindowProperty //
windowProperty *WindowProperty //窗口属性
}
//创建 ViewsFrameworkBrowserWindow 窗口
......@@ -87,6 +85,7 @@ func NewViewsFrameworkBrowserWindow(chromiumConfig *tCefChromiumConfig, windowPr
m.windowComponent.SetOnCanClose(func(sender lcl.IObject, window *ICefWindow, aResult *bool) {
*aResult = windowProperty.CanClose
})
m.windowComponent.SetAlwaysOnTop(windowProperty.AlwaysOnTop)
return m
}
......@@ -117,7 +116,6 @@ func (m *browserWindow) appContextInitialized(app *TCEFApplication) {
}
m.vFrameBrowserWindow = NewViewsFrameworkBrowserWindow(BrowserWindow.Config.chromiumConfig, &BrowserWindow.Config.WindowProperty, BrowserWindow.Config.viewsFrameBrowserWindowOnEventCallback)
m.chromium = m.vFrameBrowserWindow.chromium
m.windowId = BrowserWindow.GetNextWindowNum()
m.putChromiumWindowInfo()
m.vFrameBrowserWindow.registerPopupEvent()
m.vFrameBrowserWindow.registerDefaultEvent()
......@@ -165,6 +163,8 @@ func (m *ViewsFrameworkBrowserWindow) registerPopupEvent() {
Height: BrowserWindow.Config.WindowProperty.Height,
}
vFrameBrowserWindow := NewViewsFrameworkBrowserWindow(BrowserWindow.Config.chromiumConfig, wp, nil)
vFrameBrowserWindow.registerPopupEvent()
vFrameBrowserWindow.registerDefaultEvent()
vFrameBrowserWindow.windowComponent.CreateTopLevelWindow()
}
......@@ -174,12 +174,47 @@ func (m *ViewsFrameworkBrowserWindow) registerPopupEvent() {
func (m *ViewsFrameworkBrowserWindow) registerDefaultEvent() {
var bwEvent = BrowserWindow.browserEvent
//默认自定义快捷键
defaultAcceleratorCustom()
m.chromium.SetOnProcessMessageReceived(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, sourceProcess consts.CefProcessId, message *ipc.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)
}
})
//事件可以被覆盖
m.chromium.SetOnBeforeDownload(func(sender lcl.IObject, browser *ICefBrowser, beforeDownloadItem *DownloadItem, 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) {
chromiumOnBeforeContextMenu(sender, browser, frame, params, model)
if bwEvent.onBeforeContextMenu != nil {
bwEvent.onBeforeContextMenu(sender, browser, frame, params, model)
}
})
m.chromium.SetOnContextMenuCommand(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32, result *bool) {
chromiumOnContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
if bwEvent.onContextMenuCommand != nil {
bwEvent.onContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
}
})
m.chromium.SetOnLoadingStateChange(func(sender lcl.IObject, browser *ICefBrowser, isLoading, canGoBack, canGoForward bool) {
if bwEvent.onLoadingStateChange != nil {
bwEvent.onLoadingStateChange(sender, browser, isLoading, canGoBack, canGoForward)
}
})
m.chromium.SetOnFrameCreated(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame) {
QueueAsyncCall(func(id int) {
BrowserWindow.putBrowserFrame(browser, frame)
......@@ -194,6 +229,7 @@ func (m *ViewsFrameworkBrowserWindow) registerDefaultEvent() {
bwEvent.onFrameDetached(sender, browser, frame)
}
})
m.chromium.SetOnAfterCreated(func(sender lcl.IObject, browser *ICefBrowser) {
if chromiumOnAfterCreate(browser) {
return
......@@ -202,24 +238,6 @@ func (m *ViewsFrameworkBrowserWindow) registerDefaultEvent() {
bwEvent.onAfterCreated(sender, browser)
}
})
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)
}
})
//事件可以被覆盖
m.chromium.SetOnBeforeDownload(func(sender lcl.IObject, browser *ICefBrowser, beforeDownloadItem *DownloadItem, suggestedName string, callback *ICefBeforeDownloadCallback) {
if bwEvent.onBeforeDownload != nil {
bwEvent.onBeforeDownload(sender, browser, beforeDownloadItem, suggestedName, callback)
} else {
callback.Cont(consts.ExePath+consts.Separator+suggestedName, true)
}
})
//默认自定义快捷键
defaultAcceleratorCustom()
//事件可以被覆盖
m.chromium.SetOnKeyEvent(func(sender lcl.IObject, browser *ICefBrowser, event *TCefKeyEvent, result *bool) {
if api.GoBool(BrowserWindow.Config.chromiumConfig.enableDevTools) {
......@@ -250,27 +268,10 @@ func (m *ViewsFrameworkBrowserWindow) registerDefaultEvent() {
return false
})
m.chromium.SetOnTitleChange(func(sender lcl.IObject, browser *ICefBrowser, title string) {
//updateBrowserDevTools(browser, title)
//updateBrowserViewSource(browser, title)
updateBrowserDevTools(browser, title)
updateBrowserViewSource(browser, title)
if bwEvent.onTitleChange != nil {
bwEvent.onTitleChange(sender, browser, title)
}
})
m.chromium.SetOnBeforeContextMenu(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, model *ICefMenuModel) {
chromiumOnBeforeContextMenu(sender, browser, frame, params, model)
if bwEvent.onBeforeContextMenu != nil {
bwEvent.onBeforeContextMenu(sender, browser, frame, params, model)
}
})
m.chromium.SetOnContextMenuCommand(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32, result *bool) {
chromiumOnContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
if bwEvent.onContextMenuCommand != nil {
bwEvent.onContextMenuCommand(sender, browser, frame, params, commandId, eventFlags, result)
}
})
m.chromium.SetOnLoadingStateChange(func(sender lcl.IObject, browser *ICefBrowser, isLoading, canGoBack, canGoForward bool) {
if bwEvent.onLoadingStateChange != nil {
bwEvent.onLoadingStateChange(sender, browser, isLoading, canGoBack, canGoForward)
}
})
}
......@@ -19,39 +19,40 @@ type TCEFFrame map[int64]*ICefFrame
// 窗口信息
type TCefWindowInfo struct {
Window *BaseWindow `json:"-"` //窗口Form
Browser *ICefBrowser `json:"-"` //浏览器对象,加载完chromium之后创建
WindowProperty *WindowProperty `json:"-"` //窗口属性
Frames TCEFFrame `json:"-"` //当前浏览器下的所有frame
auxTools *auxTools //辅助工具
Window *LCLBrowserWindow `json:"-"` //窗口Form
Browser *ICefBrowser `json:"-"` //浏览器对象,加载完chromium之后创建
WindowProperty *WindowProperty `json:"-"` //窗口属性
Frames TCEFFrame `json:"-"` //当前浏览器下的所有frame
auxTools *auxTools //辅助工具
}
type auxTools struct {
devToolsWindow *BaseWindow //开发者工具窗口
devToolsX int32 //上次改变的窗体位置,宽度
devToolsY int32 //
devToolsWidth int32 //
devToolsHeight int32 //
viewSourceWindow *browserWindow //viewSource
viewSourceUrl string //
viewSourceX int32 //上次改变的窗体位置,宽度
viewSourceY int32 //
viewSourceWidth int32 //
viewSourceHeight int32 //
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 //标题
WindowState types.TWindowState //窗口 状态
Title string //窗口 标题
Url string //默认打开URL
Icon string //窗口图标 加载本地图
IconFS string //窗口图标 加载emfs内置图
CanMinimize bool //窗口 是否显示最小化按钮
CanMaximize bool //窗口 是否显示最大化按钮
Icon string //窗口图标 加载本地图
IconFS string //窗口图标 加载emfs内置图
CanMinimize bool //窗口 是否启用最小化功能
CanMaximize bool //窗口 是否启用最大化功能
CanResize bool //窗口 是否允许调整窗口大小
CanClose bool //窗口 关闭时是否关闭窗口
IsCenterWindow bool //窗口 是否居中显示
AlwaysOnTop bool //窗口 置顶
X int32 //窗口 IsCenterWindow=false X坐标
Y int32 //窗口 IsCenterWindow=false Y坐标
Width int32 //窗口 宽
......
......@@ -8,40 +8,43 @@
package cef
import "github.com/energye/golcl/lcl"
// 自定义窗口组件
type Window struct {
BaseWindow
defaultUrl string
config *tCefChromiumConfig
}
import (
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
)
//创建一个新window窗口
func NewWindow() *Window {
var window = &Window{}
func NewWindow(windowProperty *WindowProperty) *LCLBrowserWindow {
if windowProperty == nil {
windowProperty = NewWindowProperty()
}
var window = &LCLBrowserWindow{}
window.windowProperty = windowProperty
//window.TForm = lcl.NewForm(owner)
lcl.Application.CreateForm(&window)
window.ParentDoubleBuffered()
window.FormCreate()
window.SetNotInTaskBar()
window.defaultWindowEvent()
window.SetCaption(windowProperty.Title)
if windowProperty.IsCenterWindow {
window.SetPosition(types.PoDesktopCenter)
} else {
window.SetPosition(types.PoDefault)
window.SetBounds(windowProperty.X, windowProperty.Y, windowProperty.Width, windowProperty.Height)
}
if windowProperty.IconFS != "" {
_ = window.Icon().LoadFromFSFile(windowProperty.IconFS)
} else if windowProperty.Icon != "" {
window.Icon().LoadFromFile(windowProperty.Icon)
}
if windowProperty.AlwaysOnTop {
window.SetFormStyle(types.FsSystemStayOnTop)
}
window.EnabledMinimize(windowProperty.CanMinimize)
window.EnabledMaximize(windowProperty.CanMaximize)
if !windowProperty.CanResize {
window.SetBorderStyle(types.BsSingle)
}
return window
}
//返回完整的chromium对象
func (m *Window) Chromium() IChromium {
return m.chromium
}
//启用默认关闭事件行为-该窗口将被关闭
func (m *Window) EnableDefaultClose() {
m.defaultWindowCloseEvent()
m.registerDefaultChromiumCloseEvent()
}
//启用所有默认事件行为
func (m *Window) EnableAllDefaultEvent() {
m.defaultWindowCloseEvent()
m.defaultChromiumEvent()
}
......@@ -11,6 +11,7 @@
</head>
<body style="overflow: hidden;margin: 0px;padding: 0px;">
<a href="https://www.baidu.com" target="_blank">百度</a>
<a href="/" target="_blank">index</a>
<a href="https://energy.yanghy.cn">Energy</a>
</body>
</html>
\ No newline at end of file
......@@ -101,11 +101,11 @@ func AppBrowserInit() {
winInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
winInfo.Browser.StopFinding(true)
})
var newForm *cef.Window
var newForm *cef.LCLBrowserWindow
event.On("js-new-window", func(context ipc.IIPCContext) {
fmt.Println("创建新窗口 ProcessType:", common.Args.ProcessType())
if newForm == nil {
newForm = cef.NewWindow()
newForm = cef.NewWindow(nil)
newForm.SetCaption("新窗口标题")
btn := lcl.NewButton(newForm)
btn.SetParent(newForm)
......@@ -129,12 +129,14 @@ func AppBrowserInit() {
}
})
})
var browserWindow *cef.Window
var browserWindow *cef.LCLBrowserWindow
event.On("js-new-browser-window", func(context ipc.IIPCContext) {
fmt.Println("通过 js ipc emit 事件创建新Browser窗口 ProcessType:", common.Args.ProcessType())
if browserWindow == nil {
browserWindow = cef.NewBrowserWindow(nil, "https://www.baidu.com")
browserWindow.SetCaption("Browser新窗口标题")
wp := cef.NewWindowProperty()
wp.Url = "https://www.baidu.com"
wp.Title = "Browser新窗口标题"
browserWindow = cef.NewBrowserWindow(nil, wp)
browserWindow.SetWidth(800)
browserWindow.SetHeight(600)
}
......@@ -180,9 +182,9 @@ func AppBrowserInit() {
browserWindow.Window.SetCaption("这里设置应用标题")
browserWindow.Window.SetPosition(types.PoScreenCenter) //窗口局中显示
//设置窗口样式,无标题 ,最大化按钮等
//window.Window.SetBorderStyle(types.BsNone)
//window.Form.SetFormStyle(types.FsNormal)
//window.Form.SetFormStyle(types.FsSystemStayOnTop)
//browserWindow.Window.SetBorderStyle(types.BsSingle)
//browserWindow.Window.SetFormStyle(types.FsNormal)
//browserWindow.Window.SetFormStyle(types.FsSystemStayOnTop)
//设置窗口大小
browserWindow.Window.SetWidth(1600)
browserWindow.Window.SetHeight(900)
......@@ -448,7 +450,7 @@ func tray(browserWindow *cef.TCefWindowInfo) {
}
// 自定义组件
func addressBar(window *cef.BaseWindow) {
func addressBar(window *cef.LCLBrowserWindow) {
window.WindowParent().SetAlign(types.AlNone)
window.WindowParent().SetAnchors(types.NewSet(types.AkTop, types.AkLeft, types.AkRight, types.AkBottom))
window.WindowParent().SetTop(0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册