cef-commponent-tray_window.go 6.6 KB
Newer Older
yanghye's avatar
yanghye 已提交
1 2 3 4
//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
yanghye's avatar
yanghye 已提交
5
// Licensed under GNU General Public License v3.0
yanghye's avatar
yanghye 已提交
6 7 8 9 10 11 12 13 14
//
//----------------------------------------

//go:build windows
// +build windows

package cef

import (
yanghye's avatar
yanghye 已提交
15
	. "github.com/energye/energy/common"
yanghye's avatar
yanghye 已提交
16
	"github.com/energye/energy/common/assetserve"
yanghye's avatar
yanghye 已提交
17 18
	. "github.com/energye/energy/consts"
	"github.com/energye/energy/ipc"
yanghye's avatar
yanghye 已提交
19
	"github.com/energye/energy/logger"
yanghye's avatar
yanghye 已提交
20 21 22 23 24
	"github.com/energye/golcl/lcl"
	"github.com/energye/golcl/lcl/types"
)

//Cef托盘
25
type tLCLCefTrayForm struct {
yanghye's avatar
yanghye 已提交
26
	*lcl.TForm
27
	owner        lcl.IComponent
yanghye's avatar
yanghye 已提交
28
	trayIcon     *lcl.TTrayIcon
29
	chromium     IChromium
30
	windowParent ITCefWindowParent
yanghye's avatar
yanghye 已提交
31 32 33 34 35 36
	x, y, w, h   int32
	mouseUp      TMouseEvent
	isClosing    bool
	url          string
}

37 38
func newLCLCefTray(owner lcl.IComponent, width, height int32, url string) *tLCLCefTrayForm {
	var trayForm *tLCLCefTrayForm
yanghye's avatar
yanghye 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52
	lcl.Application.CreateForm(&trayForm)
	trayForm.trayIcon = lcl.NewTrayIcon(owner)
	trayForm.trayIcon.SetVisible(true)
	trayForm.owner = owner
	trayForm.x = -width
	trayForm.y = -height
	trayForm.w = width
	trayForm.h = height
	trayForm.url = url
	trayForm.onmMouse()
	trayForm.createCefTrayWindow()
	return trayForm
}

53
func (m *tLCLCefTrayForm) OnFormCreate(sender lcl.IObject) {
yanghye's avatar
yanghye 已提交
54 55 56
	m.SetShowInTaskBar(types.StNever)
}

57
func (m *tLCLCefTrayForm) Tray() *Tray {
yanghye's avatar
yanghye 已提交
58 59 60
	return nil
}

61
func (m *tLCLCefTrayForm) Show() {
62
	if BrowserWindow.mainBrowserWindow.Chromium() == nil || !BrowserWindow.mainBrowserWindow.Chromium().Initialized() {
yanghye's avatar
yanghye 已提交
63 64 65 66 67
		return
	}
	m.TForm.Show()
}

68
func (m *tLCLCefTrayForm) Hide() {
yanghye's avatar
yanghye 已提交
69 70 71
	m.TForm.Hide()
}

72
func (m *tLCLCefTrayForm) close() {
yanghye's avatar
yanghye 已提交
73 74 75
	if m.isClosing {
		return
	}
yanghye's avatar
yanghye 已提交
76 77 78 79
	m.Hide()
	m.TForm.Close()
}

80
func (m *tLCLCefTrayForm) SetOnDblClick(fn lcl.TNotifyEvent) {
yanghye's avatar
yanghye 已提交
81 82 83
	m.trayIcon.SetOnDblClick(fn)
}

84
func (m *tLCLCefTrayForm) SetOnClick(fn lcl.TNotifyEvent) {
yanghye's avatar
yanghye 已提交
85 86 87
	m.trayIcon.SetOnClick(fn)
}

88
func (m *tLCLCefTrayForm) SetOnMouseUp(fn TMouseEvent) {
yanghye's avatar
yanghye 已提交
89 90
	m.mouseUp = fn
}
91
func (m *tLCLCefTrayForm) SetOnMouseDown(fn lcl.TMouseEvent) {
yanghye's avatar
yanghye 已提交
92 93
	m.trayIcon.SetOnMouseDown(fn)
}
94
func (m *tLCLCefTrayForm) SetOnMouseMove(fn lcl.TMouseMoveEvent) {
yanghye's avatar
yanghye 已提交
95 96 97
	m.trayIcon.SetOnMouseMove(fn)
}

98
func (m *tLCLCefTrayForm) Visible() bool {
yanghye's avatar
yanghye 已提交
99 100 101
	return m.TForm.Visible()
}

102
func (m *tLCLCefTrayForm) SetVisible(v bool) {
yanghye's avatar
yanghye 已提交
103 104 105
	m.trayIcon.SetVisible(v)
}

106
func (m *tLCLCefTrayForm) SetHint(value string) {
yanghye's avatar
yanghye 已提交
107 108 109
	m.trayIcon.SetHint(value)
}

110
func (m *tLCLCefTrayForm) SetTitle(title string) {
yanghye's avatar
yanghye 已提交
111 112 113
	m.TForm.SetCaption(title)
}

114
func (m *tLCLCefTrayForm) onmMouse() {
yanghye's avatar
yanghye 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
	QueueAsyncCall(func(id int) {
		m.trayIcon.SetOnMouseUp(func(sender lcl.IObject, button types.TMouseButton, shift types.TShiftState, x, y int32) {
			var monitor = m.TForm.Monitor()
			var monitorWidth = monitor.Width()
			width, height := m.TForm.Width(), m.TForm.Height()
			var mx = x + width
			var my = y + height
			if mx < monitorWidth {
				mx = x
			} else {
				mx = x - width
			}
			if my > m.h {
				my = y
			}
			if my > height {
				my = y - height
			}
			m.TForm.SetBounds(mx, my, width, height)
			var ret bool
			if m.mouseUp != nil {
				ret = m.mouseUp(sender, button, shift, x, y)
			}
			if !ret {
				if button == types.MbRight {
					m.Show()
				}
			}
		})
	})
}

//设置托盘气泡
//title 气泡标题
//content 气泡内容
//timeout 显示时间(毫秒)
151
func (m *tLCLCefTrayForm) SetBalloon(title, content string, timeout int32) ITray {
yanghye's avatar
yanghye 已提交
152 153 154 155 156 157 158
	m.trayIcon.SetBalloonTitle(title)
	m.trayIcon.SetBalloonHint(content)
	m.trayIcon.SetBalloonTimeout(timeout)
	return m
}

//显示托盘气泡
159
func (m *tLCLCefTrayForm) ShowBalloon() {
yanghye's avatar
yanghye 已提交
160 161 162
	m.trayIcon.ShowBalloonHint()
}

163
func (m *tLCLCefTrayForm) createCefTrayWindow() {
yanghye's avatar
yanghye 已提交
164 165 166 167 168 169 170 171 172 173 174
	m.TForm.SetBorderStyle(types.BsNone)
	m.TForm.SetFormStyle(types.FsStayOnTop)
	m.TForm.SetBounds(-(m.w * 2), -(m.h * 2), m.w, m.h)
	m.TForm.SetOnActivate(func(sender lcl.IObject) {
		m.chromium.Initialized()
		m.chromium.CreateBrowser(m.windowParent)
	})
	m.TForm.SetOnWndProc(func(msg *types.TMessage) {
		m.TForm.InheritedWndProc(msg)
		if msg.Msg == 6 && msg.WParam == 0 && msg.LParam == 0 {
			QueueAsyncCall(func(id int) {
175 176 177
				if m.isClosing {
					return
				}
yanghye's avatar
yanghye 已提交
178 179 180 181 182
				m.TForm.Hide()
			})
		}
	})
	m.TForm.SetOnDeactivate(func(sender lcl.IObject) {
183 184 185
		if m.isClosing {
			return
		}
yanghye's avatar
yanghye 已提交
186 187 188 189
		m.TForm.Hide()
	})

	m.TForm.SetOnCloseQuery(func(sender lcl.IObject, canClose *bool) {
yanghye's avatar
yanghye 已提交
190 191
		*canClose = true
		logger.Debug("tray.window.onCloseQuery canClose:", *canClose)
yanghye's avatar
yanghye 已提交
192 193 194 195 196 197
		if m.isClosing {
			return
		}
		m.isClosing = true
		m.Hide()
		m.chromium.CloseBrowser(true)
yanghye's avatar
yanghye 已提交
198
		m.trayIcon.Free()
yanghye's avatar
yanghye 已提交
199 200 201
	})
	m.TForm.SetOnClose(func(sender lcl.IObject, action *types.TCloseAction) {
		*action = types.CaFree
yanghye's avatar
yanghye 已提交
202
		logger.Debug("tray.window.onClose action:", *action)
yanghye's avatar
yanghye 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
	})
	m.TForm.SetOnShow(func(sender lcl.IObject) {
		if m.windowParent != nil {
			QueueAsyncCall(func(id int) {
				m.windowParent.UpdateSize()
			})
		}
	})
	m.windowParent = NewCEFWindow(m.TForm)
	m.windowParent.SetParent(m.TForm)
	m.windowParent.SetAlign(types.AlClient)
	m.windowParent.SetAnchors(types.NewSet(types.AkTop, types.AkLeft, types.AkRight, types.AkBottom))
	m.chromium = NewChromium(m.windowParent, nil)
	m.chromium.SetOnBeforeContextMenu(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, params *ICefContextMenuParams, model *ICefMenuModel) {
		model.Clear()
	})
	m.chromium.SetOnBeforeBrowser(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame) bool {
		BrowserWindow.setOrIncNextWindowNum(browser.Identifier() + 1)
		return false
	})
yanghye's avatar
yanghye 已提交
223 224 225 226 227
	m.chromium.SetOnBeforeResourceLoad(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, request *ICefRequest, callback *ICefCallback, result *TCefReturnValue) {
		if assetserve.AssetsServerHeaderKeyValue != "" {
			request.SetHeaderByName(assetserve.AssetsServerHeaderKeyName, assetserve.AssetsServerHeaderKeyValue, true)
		}
	})
yanghye's avatar
yanghye 已提交
228
	m.chromium.SetOnClose(func(sender lcl.IObject, browser *ICefBrowser, aAction *TCefCloseBrowsesAction) {
yanghye's avatar
yanghye 已提交
229
		logger.Debug("tray.chromium.onClose")
yanghye's avatar
yanghye 已提交
230 231 232
		if IsDarwin() {
			m.windowParent.DestroyChildWindow()
		} else {
yanghye's avatar
yanghye 已提交
233 234 235 236
			//QueueAsyncCall(func(id int) { //主进程执行
			//m.windowParent.Free()
			//logger.Debug("tray.chromium.onClose => windowParent.Free")
			//})
yanghye's avatar
yanghye 已提交
237
		}
yanghye's avatar
yanghye 已提交
238 239
		*aAction = CbaClose
		//*aAction = CbaDelay
yanghye's avatar
yanghye 已提交
240 241
	})
	m.chromium.SetOnBeforeClose(func(sender lcl.IObject, browser *ICefBrowser) {
yanghye's avatar
yanghye 已提交
242
		logger.Debug("tray.chromium.onBeforeClose")
yanghye's avatar
yanghye 已提交
243
	})
yanghye's avatar
yanghye 已提交
244
	m.chromium.SetOnProcessMessageReceived(func(sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, sourceProcess CefProcessId, message *ipc.ICefProcessMessage) bool {
yanghye's avatar
yanghye 已提交
245 246 247 248 249 250 251
		return false
	})
	m.windowParent.SetChromium(m.chromium, 0)
	m.chromium.SetDefaultURL(m.url)
}

//设置托盘图标
252
func (m *tLCLCefTrayForm) SetIcon(iconResourcePath string) {
yanghye's avatar
yanghye 已提交
253 254
	m.trayIcon.Icon().LoadFromFSFile(iconResourcePath)
}