mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
internal/ui: use the cursor position to choose the initial monitor
Updates #1982
This commit is contained in:
parent
126dc81a96
commit
cafb71719c
@ -169,21 +169,32 @@ func initialize() error {
|
|||||||
glfw.WindowHint(glfw.Visible, glfw.False)
|
glfw.WindowHint(glfw.Visible, glfw.False)
|
||||||
glfw.WindowHint(glfw.ClientAPI, glfw.NoAPI)
|
glfw.WindowHint(glfw.ClientAPI, glfw.NoAPI)
|
||||||
|
|
||||||
// Create a window to set the initial monitor.
|
var m *glfw.Monitor
|
||||||
// TODO: Instead of a dummy window, get a mouse cursor position and get a monitor from it (#1982).
|
if runtime.GOOS == "darwin" {
|
||||||
w, err := glfw.CreateWindow(16, 16, "", nil, nil)
|
m = initialMonitorByOS()
|
||||||
if err != nil {
|
if m == nil {
|
||||||
return err
|
m = glfw.GetPrimaryMonitor()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Create a window to set the initial monitor.
|
||||||
|
// TODO: Instead of a dummy window, get a mouse cursor position and get a monitor from it (#1982).
|
||||||
|
w, err := glfw.CreateWindow(16, 16, "", nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if w == nil {
|
||||||
|
// This can happen on Windows Remote Desktop (#903).
|
||||||
|
panic("ui: glfw.CreateWindow must not return nil")
|
||||||
|
}
|
||||||
|
defer w.Destroy()
|
||||||
|
initializeWindowAfterCreation(w)
|
||||||
|
theUI.waitForFramebufferSizeCallback(w, nil)
|
||||||
|
m = initialMonitorByOS()
|
||||||
|
if m == nil {
|
||||||
|
m = currentMonitorImpl(w)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if w == nil {
|
|
||||||
// This can happen on Windows Remote Desktop (#903).
|
|
||||||
panic("ui: glfw.CreateWindow must not return nil")
|
|
||||||
}
|
|
||||||
defer w.Destroy()
|
|
||||||
initializeWindowAfterCreation(w)
|
|
||||||
theUI.waitForFramebufferSizeCallback(w, nil)
|
|
||||||
|
|
||||||
m := initialMonitor(w)
|
|
||||||
theUI.initMonitor = m
|
theUI.initMonitor = m
|
||||||
// GetVideoMode must be called from the main thread, then call this here and record
|
// GetVideoMode must be called from the main thread, then call this here and record
|
||||||
// initFullscreen{Width,Height}InDIP.
|
// initFullscreen{Width,Height}InDIP.
|
||||||
@ -914,8 +925,10 @@ func (u *UserInterface) init() error {
|
|||||||
// Set the window size and the window position in this order on Linux or other UNIX using X (#1118),
|
// Set the window size and the window position in this order on Linux or other UNIX using X (#1118),
|
||||||
// but this should be inverted on Windows. This is very tricky, but there is no obvious way to solve
|
// but this should be inverted on Windows. This is very tricky, but there is no obvious way to solve
|
||||||
// this. This doesn't matter on macOS.
|
// this. This doesn't matter on macOS.
|
||||||
|
// TODO: Set the position first even on X. setWindowSizeInDIP uses the monitor of the window, and
|
||||||
|
// if the window position is not reliable, the device scale factor is also not reliable (#1118, #1982).
|
||||||
wx, wy := u.getInitWindowPositionInDIP()
|
wx, wy := u.getInitWindowPositionInDIP()
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
|
||||||
u.setWindowPositionInDIP(wx, wy, u.initMonitor)
|
u.setWindowPositionInDIP(wx, wy, u.initMonitor)
|
||||||
setSize()
|
setSize()
|
||||||
} else {
|
} else {
|
||||||
@ -1345,18 +1358,6 @@ func (u *UserInterface) updateVsync() {
|
|||||||
Graphics().SetVsyncEnabled(u.fpsMode == FPSModeVsyncOn)
|
Graphics().SetVsyncEnabled(u.fpsMode == FPSModeVsyncOn)
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialMonitor returns the initial monitor to show the window.
|
|
||||||
//
|
|
||||||
// The given window is just a hint and might not be used to determine the initial monitor.
|
|
||||||
//
|
|
||||||
// initialMonitor must be called on the main thread.
|
|
||||||
func initialMonitor(window *glfw.Window) *glfw.Monitor {
|
|
||||||
if m := initialMonitorByOS(); m != nil {
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
return currentMonitorImpl(window)
|
|
||||||
}
|
|
||||||
|
|
||||||
// currentMonitor returns the current active monitor.
|
// currentMonitor returns the current active monitor.
|
||||||
//
|
//
|
||||||
// currentMonitor must be called on the main thread.
|
// currentMonitor must be called on the main thread.
|
||||||
|
@ -120,6 +120,12 @@ package ui
|
|||||||
// }
|
// }
|
||||||
// [cursor push];
|
// [cursor push];
|
||||||
// }
|
// }
|
||||||
|
//
|
||||||
|
// static void currentMouseLocation(int* x, int* y) {
|
||||||
|
// NSPoint location = [NSEvent mouseLocation];
|
||||||
|
// *x = (int)(location.x);
|
||||||
|
// *y = (int)(location.y);
|
||||||
|
// }
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -153,12 +159,32 @@ func (u *UserInterface) adjustWindowPosition(x, y int) (int, int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initialMonitorByOS() *glfw.Monitor {
|
func initialMonitorByOS() *glfw.Monitor {
|
||||||
|
var cx, cy C.int
|
||||||
|
C.currentMouseLocation(&cx, &cy)
|
||||||
|
x, y := int(cx), int(cy)
|
||||||
|
|
||||||
|
// Flip Y.
|
||||||
|
for _, m := range ensureMonitors() {
|
||||||
|
if m.x == 0 && m.y == 0 {
|
||||||
|
y = -y
|
||||||
|
y += m.vm.Height
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the monitor including the cursor.
|
||||||
|
for _, m := range ensureMonitors() {
|
||||||
|
w, h := m.vm.Width, m.vm.Height
|
||||||
|
if x >= m.x && x < m.x+w && y >= m.y && y < m.y+h {
|
||||||
|
return m.m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func currentMonitorByOS(w *glfw.Window) *glfw.Monitor {
|
func currentMonitorByOS(w *glfw.Window) *glfw.Monitor {
|
||||||
x := C.int(0)
|
var x, y C.int
|
||||||
y := C.int(0)
|
|
||||||
// Note: [NSApp mainWindow] is nil when it doesn't have its border. Use w here.
|
// Note: [NSApp mainWindow] is nil when it doesn't have its border. Use w here.
|
||||||
win := w.GetCocoaWindow()
|
win := w.GetCocoaWindow()
|
||||||
C.currentMonitorPos(C.uintptr_t(win), &x, &y)
|
C.currentMonitorPos(C.uintptr_t(win), &x, &y)
|
||||||
|
Loading…
Reference in New Issue
Block a user