mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-04 08:55:35 +00:00
app,app/internal/window: [macOS] add app.Window.Close for closing a window
Recently support was added for multiple top-level windows. Add support for closing those windows. macOS only; all others stubbed out. Signed-off-by: Larry Clapp <larry@theclapp.org>
This commit is contained in:
@@ -650,6 +650,9 @@ func (w *window) ReadClipboard() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the window. Not implemented for Android.
|
||||||
|
func (w *window) Close() {}
|
||||||
|
|
||||||
// RunOnMain is the exported version of runOnMain without a JNI
|
// RunOnMain is the exported version of runOnMain without a JNI
|
||||||
// environement.
|
// environement.
|
||||||
func RunOnMain(f func()) {
|
func RunOnMain(f func()) {
|
||||||
|
|||||||
@@ -299,6 +299,9 @@ func (w *window) ShowTextInput(show bool) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the window. Not implemented for iOS.
|
||||||
|
func (w *window) Close() {}
|
||||||
|
|
||||||
func NewWindow(win Callbacks, opts *Options) error {
|
func NewWindow(win Callbacks, opts *Options) error {
|
||||||
mainWindow.in <- windowAndOptions{win, opts}
|
mainWindow.in <- windowAndOptions{win, opts}
|
||||||
return <-mainWindow.errs
|
return <-mainWindow.errs
|
||||||
|
|||||||
@@ -406,6 +406,9 @@ func (w *window) ShowTextInput(show bool) {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the window. Not implemented for js.
|
||||||
|
func (w *window) Close() {}
|
||||||
|
|
||||||
func (w *window) draw(sync bool) {
|
func (w *window) draw(sync bool) {
|
||||||
width, height, scale, cfg := w.config()
|
width, height, scale, cfg := w.config()
|
||||||
if cfg == (unit.Metric{}) || width == 0 || height == 0 {
|
if cfg == (unit.Metric{}) || width == 0 || height == 0 {
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ __attribute__ ((visibility ("hidden"))) void gio_appTerminate(void);
|
|||||||
__attribute__ ((visibility ("hidden"))) CFTypeRef gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CGFloat height);
|
__attribute__ ((visibility ("hidden"))) CFTypeRef gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CGFloat height);
|
||||||
__attribute__ ((visibility ("hidden"))) void gio_makeKeyAndOrderFront(CFTypeRef windowRef);
|
__attribute__ ((visibility ("hidden"))) void gio_makeKeyAndOrderFront(CFTypeRef windowRef);
|
||||||
__attribute__ ((visibility ("hidden"))) NSPoint gio_cascadeTopLeftFromPoint(CFTypeRef windowRef, NSPoint topLeft);
|
__attribute__ ((visibility ("hidden"))) NSPoint gio_cascadeTopLeftFromPoint(CFTypeRef windowRef, NSPoint topLeft);
|
||||||
|
__attribute__ ((visibility ("hidden"))) void gio_close(CFTypeRef windowRef);
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
@@ -132,6 +133,17 @@ func (w *window) SetAnimating(anim bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the window. Only implemented for macOS.
|
||||||
|
func (w *window) Close() {
|
||||||
|
runOnMain(func() {
|
||||||
|
// Make sure the view is still valid. The window might've been closed
|
||||||
|
// during the switch to the main thread.
|
||||||
|
if w.view != 0 {
|
||||||
|
C.gio_close(w.window)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (w *window) setStage(stage system.Stage) {
|
func (w *window) setStage(stage system.Stage) {
|
||||||
if stage == w.stage {
|
if stage == w.stage {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -153,6 +153,11 @@ void gio_appTerminate(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gio_close(CFTypeRef windowRef) {
|
||||||
|
NSWindow* window = (__bridge NSWindow *)windowRef;
|
||||||
|
[window performClose:nil];
|
||||||
|
}
|
||||||
|
|
||||||
@implementation GioAppDelegate
|
@implementation GioAppDelegate
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||||
[[NSRunningApplication currentApplication] activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
|
[[NSRunningApplication currentApplication] activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
|
||||||
|
|||||||
@@ -1426,6 +1426,9 @@ func (w *window) surface() (*C.struct_wl_surface, int, int) {
|
|||||||
|
|
||||||
func (w *window) ShowTextInput(show bool) {}
|
func (w *window) ShowTextInput(show bool) {}
|
||||||
|
|
||||||
|
// Close the window. Not implemented for Wayland.
|
||||||
|
func (w *window) Close() {}
|
||||||
|
|
||||||
// detectUIScale reports the system UI scale, or 1.0 if it fails.
|
// detectUIScale reports the system UI scale, or 1.0 if it fails.
|
||||||
func detectUIScale() float32 {
|
func detectUIScale() float32 {
|
||||||
// TODO: What about other window environments?
|
// TODO: What about other window environments?
|
||||||
|
|||||||
@@ -501,6 +501,9 @@ func (w *window) HWND() (syscall.Handle, int, int) {
|
|||||||
return w.hwnd, w.width, w.height
|
return w.hwnd, w.width, w.height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the window. Not implemented for Windows.
|
||||||
|
func (w *window) Close() {}
|
||||||
|
|
||||||
func convertKeyCode(code uintptr) (string, bool) {
|
func convertKeyCode(code uintptr) (string, bool) {
|
||||||
if '0' <= code && code <= '9' || 'A' <= code && code <= 'Z' {
|
if '0' <= code && code <= '9' || 'A' <= code && code <= 'Z' {
|
||||||
return string(rune(code)), true
|
return string(rune(code)), true
|
||||||
|
|||||||
@@ -110,6 +110,9 @@ func (w *x11Window) WriteClipboard(s string) {
|
|||||||
|
|
||||||
func (w *x11Window) ShowTextInput(show bool) {}
|
func (w *x11Window) ShowTextInput(show bool) {}
|
||||||
|
|
||||||
|
// Close the window. Not implemented for X11.
|
||||||
|
func (w *x11Window) Close() {}
|
||||||
|
|
||||||
var x11OneByte = make([]byte, 1)
|
var x11OneByte = make([]byte, 1)
|
||||||
|
|
||||||
func (w *x11Window) wakeup() {
|
func (w *x11Window) wakeup() {
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ type Driver interface {
|
|||||||
ReadClipboard()
|
ReadClipboard()
|
||||||
// WriteClipboard requests a clipboard write.
|
// WriteClipboard requests a clipboard write.
|
||||||
WriteClipboard(s string)
|
WriteClipboard(s string)
|
||||||
|
|
||||||
|
// Close the window.
|
||||||
|
Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
type windowRendezvous struct {
|
type windowRendezvous struct {
|
||||||
|
|||||||
@@ -208,6 +208,17 @@ func (w *Window) WriteClipboard(s string) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the window. The window's event loop should exit when it receives
|
||||||
|
// system.DestroyEvent.
|
||||||
|
//
|
||||||
|
// Currently, only the macOS driver implements this functionality, all others
|
||||||
|
// are stubbed.
|
||||||
|
func (w *Window) Close() {
|
||||||
|
w.driverDo(func() {
|
||||||
|
w.driver.Close()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// driverDo calls f as soon as the window has a valid driver attached,
|
// driverDo calls f as soon as the window has a valid driver attached,
|
||||||
// or does nothing if the window is destroyed while waiting.
|
// or does nothing if the window is destroyed while waiting.
|
||||||
func (w *Window) driverDo(f func()) {
|
func (w *Window) driverDo(f func()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user