GUI fields now trim leading and trailing whitespace:
This commit is contained in:
@@ -3,6 +3,8 @@ package imgui
|
||||
import (
|
||||
"time"
|
||||
|
||||
"mxl-player/internal/sdl"
|
||||
|
||||
cimgui "github.com/AllenDang/cimgui-go/imgui"
|
||||
)
|
||||
|
||||
@@ -17,9 +19,20 @@ func New() *Context {
|
||||
ctx := cimgui.CreateContext()
|
||||
cimgui.SetCurrentContext(ctx)
|
||||
io := cimgui.CurrentIO()
|
||||
cimgui.CurrentPlatformIO().SetClipboardHandler(sdlClipboardHandler{})
|
||||
return &Context{ctx: ctx, io: io}
|
||||
}
|
||||
|
||||
type sdlClipboardHandler struct{}
|
||||
|
||||
func (sdlClipboardHandler) GetClipboard() string {
|
||||
return sdl.GetClipboardText()
|
||||
}
|
||||
|
||||
func (sdlClipboardHandler) SetClipboard(text string) {
|
||||
sdl.SetClipboardText(text)
|
||||
}
|
||||
|
||||
func (c *Context) Destroy() {
|
||||
cimgui.DestroyContext()
|
||||
}
|
||||
|
||||
@@ -7,6 +7,13 @@ import (
|
||||
cimgui "github.com/AllenDang/cimgui-go/imgui"
|
||||
)
|
||||
|
||||
const (
|
||||
sdlKModShift uint16 = 0x0001 | 0x0002
|
||||
sdlKModCtrl uint16 = 0x0040 | 0x0080
|
||||
sdlKModAlt uint16 = 0x0100 | 0x0200
|
||||
sdlKModGUI uint16 = 0x0400 | 0x0800
|
||||
)
|
||||
|
||||
// SDL3 event (128 byte raw buffer) -> imgui
|
||||
func (c *Context) ProcessEvent(event *[128]byte) {
|
||||
eventType := *(*uint32)(unsafe.Pointer(&event[0]))
|
||||
@@ -15,7 +22,9 @@ func (c *Context) ProcessEvent(event *[128]byte) {
|
||||
switch eventType {
|
||||
case sdl.EventKeyDown, sdl.EventKeyUp:
|
||||
scancode := *(*uint32)(unsafe.Pointer(&event[24]))
|
||||
modifiers := *(*uint16)(unsafe.Pointer(&event[32]))
|
||||
down := eventType == sdl.EventKeyDown
|
||||
c.addKeyModifiers(modifiers)
|
||||
key := sdlScancodeToImGuiKey(scancode)
|
||||
if key >= 0 {
|
||||
c.io.AddKeyEvent(key, down)
|
||||
@@ -47,6 +56,13 @@ func (c *Context) ProcessEvent(event *[128]byte) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Context) addKeyModifiers(modifiers uint16) {
|
||||
c.io.AddKeyEvent(cimgui.ModCtrl, modifiers&sdlKModCtrl != 0)
|
||||
c.io.AddKeyEvent(cimgui.ModShift, modifiers&sdlKModShift != 0)
|
||||
c.io.AddKeyEvent(cimgui.ModAlt, modifiers&sdlKModAlt != 0)
|
||||
c.io.AddKeyEvent(cimgui.ModSuper, modifiers&sdlKModGUI != 0)
|
||||
}
|
||||
|
||||
func sdlScancodeToImGuiKey(scancode uint32) cimgui.Key {
|
||||
switch scancode {
|
||||
case 40: // SDL_SCANCODE_RETURN
|
||||
@@ -79,6 +95,10 @@ func sdlScancodeToImGuiKey(scancode uint32) cimgui.Key {
|
||||
return cimgui.KeyLeftAlt
|
||||
case 230: // SDL_SCANCODE_RALT
|
||||
return cimgui.KeyRightAlt
|
||||
case 227: // SDL_SCANCODE_LGUI
|
||||
return cimgui.KeyLeftSuper
|
||||
case 231: // SDL_SCANCODE_RGUI
|
||||
return cimgui.KeyRightSuper
|
||||
default:
|
||||
// Letters A-Z: scancodes 4-29 map to ImGui KeyA-KeyZ
|
||||
if scancode >= 4 && scancode <= 29 {
|
||||
|
||||
@@ -455,7 +455,12 @@ func validateFramePayload(
|
||||
|
||||
// DrawFrame acquires an image, records commands, submits, and presents.
|
||||
// Returns ErrOutOfDate if the swapchain needs recreation
|
||||
func (r *Renderer) DrawFrame(videoW, videoH, stride uint32) error {
|
||||
func (r *Renderer) DrawFrame(
|
||||
videoW uint32,
|
||||
videoH uint32,
|
||||
stride uint32,
|
||||
showVideo bool,
|
||||
) error {
|
||||
imageIndex, res := r.dev.AcquireNextImage(r.swapchain, r.imageAvailable, ^uint64(0))
|
||||
if res == vk.ErrorOutOfDateKHR || res == vk.SuboptimalKHR {
|
||||
return ErrOutOfDate
|
||||
@@ -483,7 +488,7 @@ func (r *Renderer) DrawFrame(videoW, videoH, stride uint32) error {
|
||||
r.fbs[imageIndex],
|
||||
vk.Rect2D{Offset: vk.Offset2D{X: 0, Y: 0}, Extent: r.extent},
|
||||
[]vk.ClearValue{
|
||||
vk.ClearColor(0.0, 0.0, 0.0, 1.0),
|
||||
vk.ClearColor(0.025, 0.03, 0.04, 1.0),
|
||||
vk.ClearDepthStencil(1.0, 0),
|
||||
},
|
||||
)
|
||||
@@ -494,17 +499,19 @@ func (r *Renderer) DrawFrame(videoW, videoH, stride uint32) error {
|
||||
MinDepth: 0, MaxDepth: 1,
|
||||
})
|
||||
cmd.SetScissor(vk.Rect2D{Offset: vk.Offset2D{X: 0, Y: 0}, Extent: r.extent})
|
||||
cmd.BindPipeline(r.decodePipeline)
|
||||
cmd.BindDescriptorSet(r.decodeLayout, 0, r.decodeSet)
|
||||
pc := PushConstants{
|
||||
Width: videoW,
|
||||
Height: videoH,
|
||||
StrideBytes: stride,
|
||||
WinW: r.extent.Width,
|
||||
WinH: r.extent.Height,
|
||||
if showVideo {
|
||||
cmd.BindPipeline(r.decodePipeline)
|
||||
cmd.BindDescriptorSet(r.decodeLayout, 0, r.decodeSet)
|
||||
pc := PushConstants{
|
||||
Width: videoW,
|
||||
Height: videoH,
|
||||
StrideBytes: stride,
|
||||
WinW: r.extent.Width,
|
||||
WinH: r.extent.Height,
|
||||
}
|
||||
cmd.PushConstants(r.decodeLayout, vk.ShaderStageFragment, 0, unsafe.Pointer(&pc), 20)
|
||||
cmd.Draw(3, 1, 0, 0)
|
||||
}
|
||||
cmd.PushConstants(r.decodeLayout, vk.ShaderStageFragment, 0, unsafe.Pointer(&pc), 20)
|
||||
cmd.Draw(3, 1, 0, 0)
|
||||
if r.ImGuiDraw != nil {
|
||||
r.ImGuiDraw(cmd)
|
||||
}
|
||||
|
||||
+26
-2
@@ -63,8 +63,11 @@ var (
|
||||
sdlGetAudioPlaybackDevices func(count *int32) uintptr
|
||||
sdlGetAudioDeviceName func(devid uint32) uintptr
|
||||
|
||||
sdlStartTextInput func(window uintptr)
|
||||
sdlStopTextInput func(window uintptr)
|
||||
sdlStartTextInput func(window uintptr)
|
||||
sdlStopTextInput func(window uintptr)
|
||||
sdlGetClipboardText func() uintptr
|
||||
sdlSetClipboardText func(text *byte) bool
|
||||
sdlFree func(memory uintptr)
|
||||
)
|
||||
|
||||
var loaded = false
|
||||
@@ -98,6 +101,9 @@ func Load() error {
|
||||
// input
|
||||
purego.RegisterLibFunc(&sdlStartTextInput, h, "SDL_StartTextInput")
|
||||
purego.RegisterLibFunc(&sdlStopTextInput, h, "SDL_StopTextInput")
|
||||
purego.RegisterLibFunc(&sdlGetClipboardText, h, "SDL_GetClipboardText")
|
||||
purego.RegisterLibFunc(&sdlSetClipboardText, h, "SDL_SetClipboardText")
|
||||
purego.RegisterLibFunc(&sdlFree, h, "SDL_free")
|
||||
loaded = true
|
||||
return nil
|
||||
}
|
||||
@@ -197,3 +203,21 @@ func GetAudioPlaybackDevices() []AudioDevice {
|
||||
// Input wrappers
|
||||
func StartTextInput(window uintptr) { sdlStartTextInput(window) }
|
||||
func StopTextInput(window uintptr) { sdlStopTextInput(window) }
|
||||
|
||||
func GetClipboardText() string {
|
||||
text := sdlGetClipboardText()
|
||||
if text == 0 {
|
||||
return ""
|
||||
}
|
||||
result := cstr(text)
|
||||
sdlFree(text)
|
||||
return result
|
||||
}
|
||||
|
||||
func SetClipboardText(text string) bool {
|
||||
bytes := make([]byte, len(text)+1)
|
||||
copy(bytes, text)
|
||||
result := sdlSetClipboardText(&bytes[0])
|
||||
runtime.KeepAlive(bytes)
|
||||
return result
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user