33//
44
55import CGtk
6+ import Foundation
7+
8+ public class Application : GObject , GActionMap {
9+ var applicationPointer : UnsafeMutablePointer < GtkApplication > {
10+ UnsafeMutablePointer ( OpaquePointer ( gobjectPointer) )
11+ }
612
7- public class Application : GActionMap {
8- public let applicationPointer : UnsafeMutablePointer < GtkApplication >
9- private( set) var applicationWindow : ApplicationWindow ?
1013 private var windowCallback : ( ( ApplicationWindow ) -> Void ) ?
14+ private var hasActivated = false
1115
1216 public var actionMapPointer : OpaquePointer {
1317 OpaquePointer ( applicationPointer)
@@ -27,43 +31,66 @@ public class Application: GActionMap {
2731 }
2832 }
2933
30- public init ( applicationId: String ) {
31- // Ignore the deprecation warning, making the change breaks support for platforms such as
32- // Ubuntu (before Lunar). This is due to Ubuntu coming with an older version of Gtk in apt.
33- #if GTK_4_10_PLUS
34- applicationPointer = gtk_application_new ( applicationId, G_APPLICATION_DEFAULT_FLAGS)
35- #else
36- applicationPointer = gtk_application_new ( applicationId, G_APPLICATION_FLAGS_NONE)
37- #endif
34+ @GObjectProperty ( named: " register-session " ) public var registerSession : Bool
35+
36+ public init ( applicationId: String , flags: GApplicationFlags = . init( rawValue: 0 ) ) {
37+ super. init (
38+ gtk_application_new ( applicationId, flags)
39+ )
40+ registerSignals ( )
3841 }
3942
40- @discardableResult
41- public func run( _ windowCallback: @escaping ( ApplicationWindow ) -> Void ) -> Int {
42- self . windowCallback = windowCallback
43+ public override func registerSignals( ) {
44+ addSignal ( name: " activate " ) {
45+ self . activate ( )
46+ }
4347
44- let handler :
48+ let handler1 :
4549 @convention ( c) (
50+ UnsafeMutableRawPointer ,
51+ UnsafeMutablePointer < OpaquePointer > ,
52+ gint ,
4653 UnsafeMutableRawPointer ,
4754 UnsafeMutableRawPointer
48- ) -> Void = { _, data in
49- let app = unsafeBitCast ( data, to: Application . self)
50- app. activate ( )
55+ ) -> Void = { _, files, nFiles, _, data in
56+ SignalBox2 < UnsafeMutablePointer < OpaquePointer > , Int > . run ( data, files, Int ( nFiles) )
5157 }
5258
53- connectSignal (
54- applicationPointer,
55- name: " activate " ,
56- data: Unmanaged . passUnretained ( self ) . toOpaque ( ) ,
57- handler: unsafeBitCast ( handler, to: GCallback . self)
58- )
59+ addSignal ( name: " open " , handler: gCallback ( handler1) ) {
60+ [ weak self] ( files: UnsafeMutablePointer < OpaquePointer > , nFiles: Int ) in
61+ guard let self = self else { return }
62+ var uris : [ URL ] = [ ]
63+ for i in 0 ..< nFiles {
64+ uris. append (
65+ GFile ( files [ i] ) . uri
66+ )
67+ }
68+ self . onOpen ? ( uris)
69+ }
70+ }
71+
72+ @discardableResult
73+ public func run( _ windowCallback: @escaping ( ApplicationWindow ) -> Void ) -> Int {
74+ self . windowCallback = windowCallback
75+
5976 let status = g_application_run ( applicationPointer. cast ( ) , 0 , nil )
6077 g_object_unref ( applicationPointer)
6178 return Int ( status)
6279 }
6380
6481 private func activate( ) {
82+ // When set up as a DBusActivatable application on Linux and launched
83+ // the GNOME app launcher, the activate signal triggers twice, causing
84+ // two instances of the application's main window unless we ignore the
85+ // second activation.
86+ guard !hasActivated else {
87+ return
88+ }
89+
90+ hasActivated = true
6591 let window = ApplicationWindow ( application: self )
6692 windowCallback ? ( window)
67- self . applicationWindow = window
6893 }
94+
95+ public var onOpen : ( ( [ URL ] ) -> Void ) ?
6996}
0 commit comments