Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
energye
energy
提交
fb1924c9
energy
项目概览
energye
/
energy
通知
13
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
energy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
fb1924c9
编写于
7月 14, 2023
作者:
yanghye
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
A: lcl custom window drag
上级
f99f42c4
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
161 addition
and
43 deletion
+161
-43
cef/application-callback.go
cef/application-callback.go
+90
-39
cef/application-run.go
cef/application-run.go
+1
-0
cef/browser-window-lcl.go
cef/browser-window-lcl.go
+16
-0
cef/browser-window-lcl_other.go
cef/browser-window-lcl_other.go
+4
-0
cef/browser-window-lcl_windows.go
cef/browser-window-lcl_windows.go
+6
-0
cef/browser-window-views-framework.go
cef/browser-window-views-framework.go
+16
-0
cef/browser-window.go
cef/browser-window.go
+1
-0
cef/ipc-browser.go
cef/ipc-browser.go
+19
-1
cef/ipc.go
cef/ipc.go
+2
-1
cef/types-browser.go
cef/types-browser.go
+4
-2
cef/types.go
cef/types.go
+2
-0
未找到文件。
cef/application-callback.go
浏览文件 @
fb1924c9
...
...
@@ -13,8 +13,10 @@
package
cef
import
(
"fmt"
"github.com/energye/energy/v2/cef/internal/ipc"
"github.com/energye/energy/v2/cef/internal/process"
ipcArgument
"github.com/energye/energy/v2/cef/ipc/argument"
"github.com/energye/energy/v2/consts"
)
...
...
@@ -26,6 +28,11 @@ func appOnContextCreated(browser *ICefBrowser, frame *ICefFrame, context *ICefV8
ipcRender
.
registerGoSyncReplayEvent
()
// render ipc
ipcRender
.
makeIPC
(
context
)
// render ipc make
makeProcess
(
browser
,
frame
,
context
)
// process make
// 只在LCL窗口中使用自定义窗口拖拽, VF窗口默认已实现
// 在MacOS中LCL窗口没有有效的消息事件
var
executeJS
=
`energyExtension.drag.setEnableDrag(true); energyExtension.drag.setup();`
frame
.
ExecuteJavaScript
(
executeJS
,
""
,
0
)
}
// appMainRunCallback 应用运行 - 默认实现
...
...
@@ -35,45 +42,89 @@ func appMainRunCallback() {
// appWebKitInitialized - webkit - 默认实现
func
appWebKitInitialized
()
{
// var myparamValue string
// v8Handler := V8HandlerRef.New()
// v8Handler.Execute(func(name string, object *ICefV8Value, arguments *TCefV8ValueArray, retVal *ResultV8Value, exception *ResultString) bool {
// fmt.Println("v8Handler.Execute", name)
// var result bool
// if name == "GetMyParam" {
// result = true
// retVal.SetResult(V8ValueRef.NewString(myparamValue))
// } else if name == "SetMyParam" {
// if arguments.Size() > 0 {
// newValue := arguments.Get(0)
// fmt.Println("value is string:", newValue.IsString())
// fmt.Println("value:", newValue.GetStringValue())
// myparamValue = newValue.GetStringValue()
// newValue.Free()
// }
// result = true
// }
// return result
// })
// //注册js
// var jsCode = `
// let energyExtension;
// if (!energyExtension) {
// energyExtension = {};
// }
// (function () {
// test.__defineGetter__('mouseover', function (e) {
// native function mouseover();
// return mouseover(e);
// });
// test.__defineSetter__('mousemove', function (e) {
// native function mousemove();
// mousemove(e);
// });
// })();
//`
// // 注册JS 和v8处理器
// RegisterExtension("v8/test", jsCode, v8Handler)
energyExtensionHandler
:=
V8HandlerRef
.
New
()
energyExtensionHandler
.
Execute
(
func
(
name
string
,
object
*
ICefV8Value
,
arguments
*
TCefV8ValueArray
,
retVal
*
ResultV8Value
,
exception
*
ResultString
)
bool
{
fmt
.
Println
(
"Execute"
,
name
,
consts
.
IsMessageLoop
,
application
.
SingleProcess
())
message
:=
&
ipcArgument
.
List
{
Id
:
-
1
,
BId
:
ipc
.
RenderChan
()
.
BrowserId
(),
Name
:
internalIPCDRAG
,
}
ipc
.
RenderChan
()
.
IPC
()
.
Send
(
message
.
Bytes
())
return
false
})
var
code
=
`
let energyExtension;
if (!energyExtension) {
energyExtension = {
drag: {
enableDrag: false,
shouldDrag: false,
cssDragProperty: "--webkit-app-region",
cssDragValue: "drag",
defaultCursor: null
},
};
}
(function () {
energyExtension.drag.war = function (e) {
let v = window.getComputedStyle(e.target).getPropertyValue(energyExtension.drag.cssDragProperty);
if (v) {
v = v.trim();
if (v !== energyExtension.drag.cssDragValue || e.buttons !== 1) {
return false;
}
return e.detail === 1;
}
return false;
}
energyExtension.drag.mouseMove = function (e) {
if (!energyExtension.drag.enableDrag && !energyExtension.drag.shouldDrag) {
return
}
if (energyExtension.drag.shouldDrag) {
energyExtension.drag.shouldDrag = false;
native function mouseMove();
mouseMove(e);
}
}
energyExtension.drag.mouseUp = function (e) {
if (!energyExtension.drag.enableDrag) {
return
}
energyExtension.drag.shouldDrag = false;
//document.body.style.cursor = "default";
native function mouseUp();
mouseUp(e);
}
energyExtension.drag.mouseDown = function (e) {
if (!energyExtension.drag.enableDrag && ((e.offsetX > e.target.clientWidth || e.offsetY > e.target.clientHeight))) {
return
}
if (energyExtension.drag.war(e)) {
console.log('mouseDown');
e.preventDefault();
energyExtension.drag.shouldDrag = true;
native function mouseDown();
mouseDown(e);
} else {
energyExtension.drag.shouldDrag = false;
}
}
energyExtension.drag.setEnableDrag = function (v) {
console.log('drag.setEnableDrag', v, energyExtension);
energyExtension.drag.enableDrag = v;
}
energyExtension.drag.setup = function () {
console.log('drag.setup', energyExtension);
window.addEventListener("mousemove", energyExtension.drag.mouseMove);
window.addEventListener("mousedown", energyExtension.drag.mouseDown);
window.addEventListener("mouseup", energyExtension.drag.mouseUp);
}
})();
`
// 注册 EnergyExtension JS
RegisterExtension
(
"energyExtension"
,
code
,
energyExtensionHandler
)
}
// renderProcessMessageReceived 渲染进程消息 - 默认实现
...
...
cef/application-run.go
浏览文件 @
fb1924c9
...
...
@@ -81,6 +81,7 @@ func Run(app *TCEFApplication) {
}
appMainRunCallback
()
if
consts
.
IsMessageLoop
{
lcl
.
Application
.
Initialize
()
// VF窗口消息轮询
app
.
RunMessageLoop
()
}
else
{
...
...
cef/browser-window-lcl.go
浏览文件 @
fb1924c9
...
...
@@ -22,8 +22,10 @@ import (
"github.com/energye/golcl/energy/emfs"
"github.com/energye/golcl/energy/tools"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/rtl"
"github.com/energye/golcl/lcl/types"
"runtime"
"time"
)
...
...
@@ -132,6 +134,20 @@ func (m *LCLBrowserWindow) Handle() types.HWND {
return
m
.
hWnd
}
// RunOnMainThread
// 在主线程中运行
func
(
m
*
LCLBrowserWindow
)
RunOnMainThread
(
fn
func
())
{
runtime
.
LockOSThread
()
defer
runtime
.
UnlockOSThread
()
if
api
.
DMainThreadId
()
==
api
.
DCurrentThreadId
()
{
fn
()
}
else
{
lcl
.
ThreadSync
(
func
()
{
fn
()
})
}
}
// BrowserWindow 返回LCL窗口组件实例对象
func
(
m
*
LCLBrowserWindow
)
BrowserWindow
()
*
LCLBrowserWindow
{
return
m
...
...
cef/browser-window-lcl_other.go
浏览文件 @
fb1924c9
...
...
@@ -111,3 +111,7 @@ func (m *LCLBrowserWindow) Maximize() {
}
})
}
func
(
m
*
LCLBrowserWindow
)
drag
()
{
}
cef/browser-window-lcl_windows.go
浏览文件 @
fb1924c9
...
...
@@ -357,3 +357,9 @@ func (m *LCLBrowserWindow) Maximize() {
// //LWA_ALPHA | LWA_COLORKEY: crKey的地方全透明,其它地方根据bAlpha确定透明度
// win.LWA_ALPHA|win.LWA_COLORKEY)
//}
func
(
m
*
LCLBrowserWindow
)
drag
()
{
if
win
.
ReleaseCapture
()
{
win
.
PostMessage
(
m
.
Handle
(),
consts
.
WM_NCLBUTTONDOWN
,
consts
.
HTCAPTION
,
0
)
}
}
cef/browser-window-views-framework.go
浏览文件 @
fb1924c9
...
...
@@ -22,7 +22,9 @@ import (
"github.com/energye/golcl/energy/emfs"
"github.com/energye/golcl/energy/tools"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/types"
"runtime"
)
// ViewsFrameworkBrowserWindow 基于CEF views framework 窗口组件
...
...
@@ -598,3 +600,17 @@ func (m *ViewsFrameworkBrowserWindow) WindowComponent() *TCEFWindowComponent {
func
(
m
*
ViewsFrameworkBrowserWindow
)
BrowserViewComponent
()
*
TCEFBrowserViewComponent
{
return
m
.
browserViewComponent
}
// RunOnMainThread
// 在主线程中运行
func
(
m
*
ViewsFrameworkBrowserWindow
)
RunOnMainThread
(
fn
func
())
{
runtime
.
LockOSThread
()
defer
runtime
.
UnlockOSThread
()
if
api
.
DMainThreadId
()
==
api
.
DCurrentThreadId
()
{
fn
()
}
else
{
lcl
.
ThreadSync
(
func
()
{
fn
()
})
}
}
cef/browser-window.go
浏览文件 @
fb1924c9
...
...
@@ -103,6 +103,7 @@ type IBrowserWindow interface {
NewCefTray
(
width
,
height
int32
,
url
string
)
ITray
//仅支持windows托盘LCL+[CEF|VF](使用web端技术自定义实现,如使用LCL窗口组件该托盘实现是LCL+CEF,如使用VF窗口组件该托盘实现是LCL+VF)
NewSysTray
()
ITray
//systray系统原生
SetCreateBrowserExtraInfo
(
windowName
string
,
context
*
ICefRequestContext
,
extraInfo
*
ICefDictionaryValue
)
//设置 Chromium 创建浏览器时设置的扩展信息
RunOnMainThread
(
fn
func
())
//在主线程中运行
}
// ILCLBrowserWindow
...
...
cef/ipc-browser.go
浏览文件 @
fb1924c9
...
...
@@ -13,11 +13,13 @@
package
cef
import
(
"fmt"
"github.com/energye/energy/v2/cef/internal/ipc"
ipcArgument
"github.com/energye/energy/v2/cef/ipc/argument"
"github.com/energye/energy/v2/cef/ipc/context"
"github.com/energye/energy/v2/consts"
"github.com/energye/energy/v2/pkgs/json"
"github.com/energye/golcl/lcl/api"
)
// ipcBrowserProcess 主进程
...
...
@@ -140,7 +142,23 @@ func (m *ipcBrowserProcess) registerEvent() {
}
return
false
})
// drag
ipc
.
BrowserChan
()
.
AddCallback
(
func
(
channelId
int64
,
argument
ipcArgument
.
IList
)
bool
{
if
argument
!=
nil
{
if
argument
.
GetName
()
==
internalIPCDRAG
{
if
wi
:=
BrowserWindow
.
GetWindowInfo
(
argument
.
BrowserId
());
wi
!=
nil
{
if
wi
.
IsLCL
()
{
wi
.
RunOnMainThread
(
func
()
{
fmt
.
Println
(
"call-1-DMainThreadId:"
,
api
.
DMainThreadId
(),
api
.
DCurrentThreadId
())
wi
.
AsLCLBrowserWindow
()
.
BrowserWindow
()
.
drag
()
})
}
}
return
true
}
}
return
false
})
}
// jsExecuteGoSyncMethodMessage JS执行Go事件 - 同步消息处理
...
...
cef/ipc.go
浏览文件 @
fb1924c9
...
...
@@ -25,6 +25,7 @@ const (
internalIPCEmit
=
"emit"
// JavaScript -> ipc.emit 在 JavaScript 触发 GO 监听事件函数名, 异步
internalIPCEmitSync
=
"emitSync"
// JavaScript -> ipc.emitSync 在 JavaScript 触发 GO 监听事件函数名, 同步
internalIPCOn
=
"on"
// JavaScript -> ipc.on 在 JavaScript 监听事件, 提供给 GO 调用
internalIPCDRAG
=
"drag"
// JavaScript -> ipc.on drag
)
// ipc message name
...
...
@@ -77,7 +78,7 @@ type ipcCallback struct {
// isIPCInternalKey IPC 内部定义使用 key 不允许使用
func
isIPCInternalKey
(
key
string
)
bool
{
return
key
==
internalIPC
||
key
==
internalIPCEmit
||
key
==
internalIPCOn
||
key
==
internalIPCEmitSync
||
return
key
==
internalIPC
||
key
==
internalIPCEmit
||
key
==
internalIPCOn
||
key
==
internalIPC
DRAG
||
key
==
internalIPC
EmitSync
||
key
==
internalIPCJSExecuteGoEvent
||
key
==
internalIPCJSExecuteGoEventReplay
||
key
==
internalIPCGoExecuteJSEvent
||
key
==
internalIPCGoExecuteJSEventReplay
||
key
==
internalIPCJSExecuteGoSyncEvent
||
key
==
internalIPCJSExecuteGoSyncEventReplay
...
...
cef/types-browser.go
浏览文件 @
fb1924c9
...
...
@@ -80,8 +80,10 @@ func (m *ICefBrowser) HostWindowHandle() types.HWND {
if
!
m
.
IsValid
()
{
return
0
}
r1
,
_
,
_
:=
imports
.
Proc
(
def
.
CEFBrowser_GetHostWindowHandle
)
.
Call
(
m
.
Instance
())
return
r1
if
m
.
windowHandle
==
0
{
m
.
windowHandle
,
_
,
_
=
imports
.
Proc
(
def
.
CEFBrowser_GetHostWindowHandle
)
.
Call
(
m
.
Instance
())
}
return
m
.
windowHandle
}
// CloseBrowser 关闭浏览器,同时关闭窗口
...
...
cef/types.go
浏览文件 @
fb1924c9
...
...
@@ -20,6 +20,7 @@ import (
.
"github.com/energye/energy/v2/types"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/types"
"time"
"unsafe"
)
...
...
@@ -263,6 +264,7 @@ type ICefBrowser struct {
instance
unsafe
.
Pointer
mainFrame
*
ICefFrame
requestContext
*
ICefRequestContext
windowHandle
types
.
HWND
idFrames
map
[
int64
]
*
ICefFrame
nameFrames
map
[
string
]
*
ICefFrame
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录