| // Copyright 2014 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| import Cocoa | |
| import FlutterMacOS | |
| extension NSWindow { | |
| var titlebarHeight: CGFloat { | |
| frame.height - contentRect(forFrameRect: frame).height | |
| } | |
| } | |
| class MainFlutterWindow: NSWindow { | |
| override func awakeFromNib() { | |
| let flutterViewController = FlutterViewController() | |
| let windowFrame = self.frame | |
| self.contentViewController = flutterViewController | |
| self.setFrame(windowFrame, display: true) | |
| RegisterMethodChannel(registry: flutterViewController) | |
| RegisterGeneratedPlugins(registry: flutterViewController) | |
| super.awakeFromNib() | |
| } | |
| func RegisterMethodChannel(registry: FlutterPluginRegistry) { | |
| let registrar = registry.registrar(forPlugin: "resize") | |
| let channel = FlutterMethodChannel(name: "samples.flutter.dev/resize", | |
| binaryMessenger: registrar.messenger) | |
| channel.setMethodCallHandler({ (call, result) in | |
| if call.method == "resize" { | |
| if let args = call.arguments as? Dictionary<String, Any>, | |
| let width = args["width"] as? Double, | |
| var height = args["height"] as? Double { | |
| height += self.titlebarHeight | |
| let currentFrame: NSRect = self.frame | |
| let nextFrame: NSRect = NSMakeRect( | |
| currentFrame.minX - (width - currentFrame.width) / 2, | |
| currentFrame.minY - (height - currentFrame.height) / 2, | |
| width, | |
| height | |
| ) | |
| self.setFrame(nextFrame, display: true, animate: false) | |
| result(true) | |
| } else { | |
| result(FlutterError.init(code: "bad args", message: nil, details: nil)) | |
| } | |
| } | |
| }) | |
| } | |
| } |