mirror of
https://github.com/tiny-craft/tiny-rdm.git
synced 2025-10-29 17:51:53 +08:00
perf: use goroutine to implement window resize events.
perf: optimized window display in fullscreen and maximized modes. #19
This commit is contained in:
105
backend/services/system_service.go
Normal file
105
backend/services/system_service.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/wailsapp/wails/v2/pkg/runtime"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
"tinyrdm/backend/types"
|
||||
)
|
||||
|
||||
type systemService struct {
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
var system *systemService
|
||||
var onceSystem sync.Once
|
||||
|
||||
func System() *systemService {
|
||||
if system == nil {
|
||||
onceSystem.Do(func() {
|
||||
system = &systemService{}
|
||||
go system.loopWindowEvent()
|
||||
})
|
||||
}
|
||||
return system
|
||||
}
|
||||
|
||||
func (s *systemService) Start(ctx context.Context) {
|
||||
s.ctx = ctx
|
||||
}
|
||||
|
||||
// SelectFile open file dialog to select a file
|
||||
func (s *systemService) SelectFile(title string) (resp types.JSResp) {
|
||||
filepath, err := runtime.OpenFileDialog(s.ctx, runtime.OpenDialogOptions{
|
||||
Title: title,
|
||||
ShowHiddenFiles: true,
|
||||
})
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
resp.Msg = err.Error()
|
||||
return
|
||||
}
|
||||
resp.Success = true
|
||||
resp.Data = map[string]any{
|
||||
"path": filepath,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *systemService) loopWindowEvent() {
|
||||
var fullscreen, maximised, minimised, normal bool
|
||||
var width, height int
|
||||
var dirty bool
|
||||
for {
|
||||
time.Sleep(300 * time.Millisecond)
|
||||
if s.ctx == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
dirty = false
|
||||
if f := runtime.WindowIsFullscreen(s.ctx); f != fullscreen {
|
||||
// full-screen switched
|
||||
fullscreen = f
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if w, h := runtime.WindowGetSize(s.ctx); w != width || h != height {
|
||||
// window size changed
|
||||
width, height = w, h
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if m := runtime.WindowIsMaximised(s.ctx); m != maximised {
|
||||
maximised = m
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if m := runtime.WindowIsMinimised(s.ctx); m != minimised {
|
||||
minimised = m
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if n := runtime.WindowIsNormal(s.ctx); n != normal {
|
||||
normal = n
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if dirty {
|
||||
runtime.EventsEmit(s.ctx, "window_changed", map[string]any{
|
||||
"fullscreen": fullscreen,
|
||||
"width": width,
|
||||
"height": height,
|
||||
"maximised": maximised,
|
||||
"minimised": minimised,
|
||||
"normal": normal,
|
||||
})
|
||||
|
||||
if !fullscreen && !minimised {
|
||||
// save window size
|
||||
Preferences().SaveWindowSize(width, height)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user