A Flutter based music player for Jellyfin

Initial commit

Bryan e0876c48

Changed files
+4699
android
ios
lib
linux
macos
web
windows
+45
.gitignore
··· 1 + # Miscellaneous 2 + *.class 3 + *.log 4 + *.pyc 5 + *.swp 6 + .DS_Store 7 + .atom/ 8 + .build/ 9 + .buildlog/ 10 + .history 11 + .svn/ 12 + .swiftpm/ 13 + migrate_working_dir/ 14 + 15 + # IntelliJ related 16 + *.iml 17 + *.ipr 18 + *.iws 19 + .idea/ 20 + 21 + # The .vscode folder contains launch configuration and tasks you configure in 22 + # VS Code which you may wish to be included in version control, so this line 23 + # is commented out by default. 24 + #.vscode/ 25 + 26 + # Flutter/Dart/Pub related 27 + **/doc/api/ 28 + **/ios/Flutter/.last_build_id 29 + .dart_tool/ 30 + .flutter-plugins-dependencies 31 + .pub-cache/ 32 + .pub/ 33 + /build/ 34 + /coverage/ 35 + 36 + # Symbolication related 37 + app.*.symbols 38 + 39 + # Obfuscation related 40 + app.*.map.json 41 + 42 + # Android Studio will place build artifacts here 43 + /android/app/debug 44 + /android/app/profile 45 + /android/app/release
+45
.metadata
··· 1 + # This file tracks properties of this Flutter project. 2 + # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 + # 4 + # This file should be version controlled and should not be manually edited. 5 + 6 + version: 7 + revision: "adc901062556672b4138e18a4dc62a4be8f4b3c2" 8 + channel: "stable" 9 + 10 + project_type: app 11 + 12 + # Tracks metadata for the flutter migrate command 13 + migration: 14 + platforms: 15 + - platform: root 16 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 17 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 18 + - platform: android 19 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 20 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 21 + - platform: ios 22 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 23 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 24 + - platform: linux 25 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 26 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 27 + - platform: macos 28 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 29 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 30 + - platform: web 31 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 32 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 33 + - platform: windows 34 + create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 35 + base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2 36 + 37 + # User provided section 38 + 39 + # List of Local paths (relative to this file) that should be 40 + # ignored by the migrate tool. 41 + # 42 + # Files that are not part of the templates will be ignored by default. 43 + unmanaged_files: 44 + - 'lib/main.dart' 45 + - 'ios/Runner.xcodeproj/project.pbxproj'
+3
README.md
··· 1 + # pudge 2 + 3 + A new Flutter project.
+1
analysis_options.yaml
··· 1 + include: package:flutter_lints/flutter.yaml
+14
android/.gitignore
··· 1 + gradle-wrapper.jar 2 + /.gradle 3 + /captures/ 4 + /gradlew 5 + /gradlew.bat 6 + /local.properties 7 + GeneratedPluginRegistrant.java 8 + .cxx/ 9 + 10 + # Remember to never publicly share your keystore. 11 + # See https://flutter.dev/to/reference-keystore 12 + key.properties 13 + **/*.keystore 14 + **/*.jks
+44
android/app/build.gradle.kts
··· 1 + plugins { 2 + id("com.android.application") 3 + id("kotlin-android") 4 + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. 5 + id("dev.flutter.flutter-gradle-plugin") 6 + } 7 + 8 + android { 9 + namespace = "com.example.pudge" 10 + compileSdk = flutter.compileSdkVersion 11 + ndkVersion = flutter.ndkVersion 12 + 13 + compileOptions { 14 + sourceCompatibility = JavaVersion.VERSION_11 15 + targetCompatibility = JavaVersion.VERSION_11 16 + } 17 + 18 + kotlinOptions { 19 + jvmTarget = JavaVersion.VERSION_11.toString() 20 + } 21 + 22 + defaultConfig { 23 + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 24 + applicationId = "com.example.pudge" 25 + // You can update the following values to match your application needs. 26 + // For more information, see: https://flutter.dev/to/review-gradle-config. 27 + minSdk = flutter.minSdkVersion 28 + targetSdk = flutter.targetSdkVersion 29 + versionCode = flutter.versionCode 30 + versionName = flutter.versionName 31 + } 32 + 33 + buildTypes { 34 + release { 35 + // TODO: Add your own signing config for the release build. 36 + // Signing with the debug keys for now, so `flutter run --release` works. 37 + signingConfig = signingConfigs.getByName("debug") 38 + } 39 + } 40 + } 41 + 42 + flutter { 43 + source = "../.." 44 + }
+7
android/app/src/debug/AndroidManifest.xml
··· 1 + <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 + <!-- The INTERNET permission is required for development. Specifically, 3 + the Flutter tool needs it to communicate with the running application 4 + to allow setting breakpoints, to provide hot reload, etc. 5 + --> 6 + <uses-permission android:name="android.permission.INTERNET"/> 7 + </manifest>
+45
android/app/src/main/AndroidManifest.xml
··· 1 + <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 + <application 3 + android:label="pudge" 4 + android:name="${applicationName}" 5 + android:icon="@mipmap/ic_launcher"> 6 + <activity 7 + android:name=".MainActivity" 8 + android:exported="true" 9 + android:launchMode="singleTop" 10 + android:taskAffinity="" 11 + android:theme="@style/LaunchTheme" 12 + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" 13 + android:hardwareAccelerated="true" 14 + android:windowSoftInputMode="adjustResize"> 15 + <!-- Specifies an Android theme to apply to this Activity as soon as 16 + the Android process has started. This theme is visible to the user 17 + while the Flutter UI initializes. After that, this theme continues 18 + to determine the Window background behind the Flutter UI. --> 19 + <meta-data 20 + android:name="io.flutter.embedding.android.NormalTheme" 21 + android:resource="@style/NormalTheme" 22 + /> 23 + <intent-filter> 24 + <action android:name="android.intent.action.MAIN"/> 25 + <category android:name="android.intent.category.LAUNCHER"/> 26 + </intent-filter> 27 + </activity> 28 + <!-- Don't delete the meta-data below. 29 + This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> 30 + <meta-data 31 + android:name="flutterEmbedding" 32 + android:value="2" /> 33 + </application> 34 + <!-- Required to query activities that can process text, see: 35 + https://developer.android.com/training/package-visibility and 36 + https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. 37 + 38 + In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> 39 + <queries> 40 + <intent> 41 + <action android:name="android.intent.action.PROCESS_TEXT"/> 42 + <data android:mimeType="text/plain"/> 43 + </intent> 44 + </queries> 45 + </manifest>
+5
android/app/src/main/kotlin/com/example/pudge/MainActivity.kt
··· 1 + package com.example.pudge 2 + 3 + import io.flutter.embedding.android.FlutterActivity 4 + 5 + class MainActivity : FlutterActivity()
+12
android/app/src/main/res/drawable-v21/launch_background.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <!-- Modify this file to customize your launch splash screen --> 3 + <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 4 + <item android:drawable="?android:colorBackground" /> 5 + 6 + <!-- You can insert your own image assets here --> 7 + <!-- <item> 8 + <bitmap 9 + android:gravity="center" 10 + android:src="@mipmap/launch_image" /> 11 + </item> --> 12 + </layer-list>
+12
android/app/src/main/res/drawable/launch_background.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <!-- Modify this file to customize your launch splash screen --> 3 + <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 4 + <item android:drawable="@android:color/white" /> 5 + 6 + <!-- You can insert your own image assets here --> 7 + <!-- <item> 8 + <bitmap 9 + android:gravity="center" 10 + android:src="@mipmap/launch_image" /> 11 + </item> --> 12 + </layer-list>
android/app/src/main/res/mipmap-hdpi/ic_launcher.png

This is a binary file and will not be displayed.

android/app/src/main/res/mipmap-mdpi/ic_launcher.png

This is a binary file and will not be displayed.

android/app/src/main/res/mipmap-xhdpi/ic_launcher.png

This is a binary file and will not be displayed.

android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png

This is a binary file and will not be displayed.

android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png

This is a binary file and will not be displayed.

+18
android/app/src/main/res/values-night/styles.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <resources> 3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> 4 + <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> 5 + <!-- Show a splash screen on the activity. Automatically removed when 6 + the Flutter engine draws its first frame --> 7 + <item name="android:windowBackground">@drawable/launch_background</item> 8 + </style> 9 + <!-- Theme applied to the Android Window as soon as the process has started. 10 + This theme determines the color of the Android Window while your 11 + Flutter UI initializes, as well as behind your Flutter UI while its 12 + running. 13 + 14 + This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 + <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> 16 + <item name="android:windowBackground">?android:colorBackground</item> 17 + </style> 18 + </resources>
+18
android/app/src/main/res/values/styles.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <resources> 3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> 4 + <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> 5 + <!-- Show a splash screen on the activity. Automatically removed when 6 + the Flutter engine draws its first frame --> 7 + <item name="android:windowBackground">@drawable/launch_background</item> 8 + </style> 9 + <!-- Theme applied to the Android Window as soon as the process has started. 10 + This theme determines the color of the Android Window while your 11 + Flutter UI initializes, as well as behind your Flutter UI while its 12 + running. 13 + 14 + This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 + <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> 16 + <item name="android:windowBackground">?android:colorBackground</item> 17 + </style> 18 + </resources>
+7
android/app/src/profile/AndroidManifest.xml
··· 1 + <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 + <!-- The INTERNET permission is required for development. Specifically, 3 + the Flutter tool needs it to communicate with the running application 4 + to allow setting breakpoints, to provide hot reload, etc. 5 + --> 6 + <uses-permission android:name="android.permission.INTERNET"/> 7 + </manifest>
+24
android/build.gradle.kts
··· 1 + allprojects { 2 + repositories { 3 + google() 4 + mavenCentral() 5 + } 6 + } 7 + 8 + val newBuildDir: Directory = 9 + rootProject.layout.buildDirectory 10 + .dir("../../build") 11 + .get() 12 + rootProject.layout.buildDirectory.value(newBuildDir) 13 + 14 + subprojects { 15 + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) 16 + project.layout.buildDirectory.value(newSubprojectBuildDir) 17 + } 18 + subprojects { 19 + project.evaluationDependsOn(":app") 20 + } 21 + 22 + tasks.register<Delete>("clean") { 23 + delete(rootProject.layout.buildDirectory) 24 + }
+3
android/gradle.properties
··· 1 + org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError 2 + android.useAndroidX=true 3 + android.enableJetifier=true
+5
android/gradle/wrapper/gradle-wrapper.properties
··· 1 + distributionBase=GRADLE_USER_HOME 2 + distributionPath=wrapper/dists 3 + zipStoreBase=GRADLE_USER_HOME 4 + zipStorePath=wrapper/dists 5 + distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
+26
android/settings.gradle.kts
··· 1 + pluginManagement { 2 + val flutterSdkPath = 3 + run { 4 + val properties = java.util.Properties() 5 + file("local.properties").inputStream().use { properties.load(it) } 6 + val flutterSdkPath = properties.getProperty("flutter.sdk") 7 + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } 8 + flutterSdkPath 9 + } 10 + 11 + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 12 + 13 + repositories { 14 + google() 15 + mavenCentral() 16 + gradlePluginPortal() 17 + } 18 + } 19 + 20 + plugins { 21 + id("dev.flutter.flutter-plugin-loader") version "1.0.0" 22 + id("com.android.application") version "8.9.1" apply false 23 + id("org.jetbrains.kotlin.android") version "2.1.0" apply false 24 + } 25 + 26 + include(":app")
+34
ios/.gitignore
··· 1 + **/dgph 2 + *.mode1v3 3 + *.mode2v3 4 + *.moved-aside 5 + *.pbxuser 6 + *.perspectivev3 7 + **/*sync/ 8 + .sconsign.dblite 9 + .tags* 10 + **/.vagrant/ 11 + **/DerivedData/ 12 + Icon? 13 + **/Pods/ 14 + **/.symlinks/ 15 + profile 16 + xcuserdata 17 + **/.generated/ 18 + Flutter/App.framework 19 + Flutter/Flutter.framework 20 + Flutter/Flutter.podspec 21 + Flutter/Generated.xcconfig 22 + Flutter/ephemeral/ 23 + Flutter/app.flx 24 + Flutter/app.zip 25 + Flutter/flutter_assets/ 26 + Flutter/flutter_export_environment.sh 27 + ServiceDefinitions.json 28 + Runner/GeneratedPluginRegistrant.* 29 + 30 + # Exceptions to above rules. 31 + !default.mode1v3 32 + !default.mode2v3 33 + !default.pbxuser 34 + !default.perspectivev3
+26
ios/Flutter/AppFrameworkInfo.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>CFBundleDevelopmentRegion</key> 6 + <string>en</string> 7 + <key>CFBundleExecutable</key> 8 + <string>App</string> 9 + <key>CFBundleIdentifier</key> 10 + <string>io.flutter.flutter.app</string> 11 + <key>CFBundleInfoDictionaryVersion</key> 12 + <string>6.0</string> 13 + <key>CFBundleName</key> 14 + <string>App</string> 15 + <key>CFBundlePackageType</key> 16 + <string>FMWK</string> 17 + <key>CFBundleShortVersionString</key> 18 + <string>1.0</string> 19 + <key>CFBundleSignature</key> 20 + <string>????</string> 21 + <key>CFBundleVersion</key> 22 + <string>1.0</string> 23 + <key>MinimumOSVersion</key> 24 + <string>13.0</string> 25 + </dict> 26 + </plist>
+1
ios/Flutter/Debug.xcconfig
··· 1 + #include "Generated.xcconfig"
+1
ios/Flutter/Release.xcconfig
··· 1 + #include "Generated.xcconfig"
+616
ios/Runner.xcodeproj/project.pbxproj
··· 1 + // !$*UTF8*$! 2 + { 3 + archiveVersion = 1; 4 + classes = { 5 + }; 6 + objectVersion = 54; 7 + objects = { 8 + 9 + /* Begin PBXBuildFile section */ 10 + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 12 + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 + /* End PBXBuildFile section */ 18 + 19 + /* Begin PBXContainerItemProxy section */ 20 + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { 21 + isa = PBXContainerItemProxy; 22 + containerPortal = 97C146E61CF9000F007C117D /* Project object */; 23 + proxyType = 1; 24 + remoteGlobalIDString = 97C146ED1CF9000F007C117D; 25 + remoteInfo = Runner; 26 + }; 27 + /* End PBXContainerItemProxy section */ 28 + 29 + /* Begin PBXCopyFilesBuildPhase section */ 30 + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 31 + isa = PBXCopyFilesBuildPhase; 32 + buildActionMask = 2147483647; 33 + dstPath = ""; 34 + dstSubfolderSpec = 10; 35 + files = ( 36 + ); 37 + name = "Embed Frameworks"; 38 + runOnlyForDeploymentPostprocessing = 0; 39 + }; 40 + /* End PBXCopyFilesBuildPhase section */ 41 + 42 + /* Begin PBXFileReference section */ 43 + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 44 + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 45 + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; 46 + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 47 + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 48 + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 49 + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 50 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 51 + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 52 + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 53 + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 54 + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 55 + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 56 + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 57 + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 58 + /* End PBXFileReference section */ 59 + 60 + /* Begin PBXFrameworksBuildPhase section */ 61 + 97C146EB1CF9000F007C117D /* Frameworks */ = { 62 + isa = PBXFrameworksBuildPhase; 63 + buildActionMask = 2147483647; 64 + files = ( 65 + ); 66 + runOnlyForDeploymentPostprocessing = 0; 67 + }; 68 + /* End PBXFrameworksBuildPhase section */ 69 + 70 + /* Begin PBXGroup section */ 71 + 331C8082294A63A400263BE5 /* RunnerTests */ = { 72 + isa = PBXGroup; 73 + children = ( 74 + 331C807B294A618700263BE5 /* RunnerTests.swift */, 75 + ); 76 + path = RunnerTests; 77 + sourceTree = "<group>"; 78 + }; 79 + 9740EEB11CF90186004384FC /* Flutter */ = { 80 + isa = PBXGroup; 81 + children = ( 82 + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 83 + 9740EEB21CF90195004384FC /* Debug.xcconfig */, 84 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 85 + 9740EEB31CF90195004384FC /* Generated.xcconfig */, 86 + ); 87 + name = Flutter; 88 + sourceTree = "<group>"; 89 + }; 90 + 97C146E51CF9000F007C117D = { 91 + isa = PBXGroup; 92 + children = ( 93 + 9740EEB11CF90186004384FC /* Flutter */, 94 + 97C146F01CF9000F007C117D /* Runner */, 95 + 97C146EF1CF9000F007C117D /* Products */, 96 + 331C8082294A63A400263BE5 /* RunnerTests */, 97 + ); 98 + sourceTree = "<group>"; 99 + }; 100 + 97C146EF1CF9000F007C117D /* Products */ = { 101 + isa = PBXGroup; 102 + children = ( 103 + 97C146EE1CF9000F007C117D /* Runner.app */, 104 + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, 105 + ); 106 + name = Products; 107 + sourceTree = "<group>"; 108 + }; 109 + 97C146F01CF9000F007C117D /* Runner */ = { 110 + isa = PBXGroup; 111 + children = ( 112 + 97C146FA1CF9000F007C117D /* Main.storyboard */, 113 + 97C146FD1CF9000F007C117D /* Assets.xcassets */, 114 + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 115 + 97C147021CF9000F007C117D /* Info.plist */, 116 + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 117 + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 118 + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 119 + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 120 + ); 121 + path = Runner; 122 + sourceTree = "<group>"; 123 + }; 124 + /* End PBXGroup section */ 125 + 126 + /* Begin PBXNativeTarget section */ 127 + 331C8080294A63A400263BE5 /* RunnerTests */ = { 128 + isa = PBXNativeTarget; 129 + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; 130 + buildPhases = ( 131 + 331C807D294A63A400263BE5 /* Sources */, 132 + 331C807F294A63A400263BE5 /* Resources */, 133 + ); 134 + buildRules = ( 135 + ); 136 + dependencies = ( 137 + 331C8086294A63A400263BE5 /* PBXTargetDependency */, 138 + ); 139 + name = RunnerTests; 140 + productName = RunnerTests; 141 + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; 142 + productType = "com.apple.product-type.bundle.unit-test"; 143 + }; 144 + 97C146ED1CF9000F007C117D /* Runner */ = { 145 + isa = PBXNativeTarget; 146 + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 147 + buildPhases = ( 148 + 9740EEB61CF901F6004384FC /* Run Script */, 149 + 97C146EA1CF9000F007C117D /* Sources */, 150 + 97C146EB1CF9000F007C117D /* Frameworks */, 151 + 97C146EC1CF9000F007C117D /* Resources */, 152 + 9705A1C41CF9048500538489 /* Embed Frameworks */, 153 + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 154 + ); 155 + buildRules = ( 156 + ); 157 + dependencies = ( 158 + ); 159 + name = Runner; 160 + productName = Runner; 161 + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 162 + productType = "com.apple.product-type.application"; 163 + }; 164 + /* End PBXNativeTarget section */ 165 + 166 + /* Begin PBXProject section */ 167 + 97C146E61CF9000F007C117D /* Project object */ = { 168 + isa = PBXProject; 169 + attributes = { 170 + BuildIndependentTargetsInParallel = YES; 171 + LastUpgradeCheck = 1510; 172 + ORGANIZATIONNAME = ""; 173 + TargetAttributes = { 174 + 331C8080294A63A400263BE5 = { 175 + CreatedOnToolsVersion = 14.0; 176 + TestTargetID = 97C146ED1CF9000F007C117D; 177 + }; 178 + 97C146ED1CF9000F007C117D = { 179 + CreatedOnToolsVersion = 7.3.1; 180 + LastSwiftMigration = 1100; 181 + }; 182 + }; 183 + }; 184 + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 185 + compatibilityVersion = "Xcode 9.3"; 186 + developmentRegion = en; 187 + hasScannedForEncodings = 0; 188 + knownRegions = ( 189 + en, 190 + Base, 191 + ); 192 + mainGroup = 97C146E51CF9000F007C117D; 193 + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 194 + projectDirPath = ""; 195 + projectRoot = ""; 196 + targets = ( 197 + 97C146ED1CF9000F007C117D /* Runner */, 198 + 331C8080294A63A400263BE5 /* RunnerTests */, 199 + ); 200 + }; 201 + /* End PBXProject section */ 202 + 203 + /* Begin PBXResourcesBuildPhase section */ 204 + 331C807F294A63A400263BE5 /* Resources */ = { 205 + isa = PBXResourcesBuildPhase; 206 + buildActionMask = 2147483647; 207 + files = ( 208 + ); 209 + runOnlyForDeploymentPostprocessing = 0; 210 + }; 211 + 97C146EC1CF9000F007C117D /* Resources */ = { 212 + isa = PBXResourcesBuildPhase; 213 + buildActionMask = 2147483647; 214 + files = ( 215 + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 216 + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 217 + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 218 + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 219 + ); 220 + runOnlyForDeploymentPostprocessing = 0; 221 + }; 222 + /* End PBXResourcesBuildPhase section */ 223 + 224 + /* Begin PBXShellScriptBuildPhase section */ 225 + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 226 + isa = PBXShellScriptBuildPhase; 227 + alwaysOutOfDate = 1; 228 + buildActionMask = 2147483647; 229 + files = ( 230 + ); 231 + inputPaths = ( 232 + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", 233 + ); 234 + name = "Thin Binary"; 235 + outputPaths = ( 236 + ); 237 + runOnlyForDeploymentPostprocessing = 0; 238 + shellPath = /bin/sh; 239 + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 240 + }; 241 + 9740EEB61CF901F6004384FC /* Run Script */ = { 242 + isa = PBXShellScriptBuildPhase; 243 + alwaysOutOfDate = 1; 244 + buildActionMask = 2147483647; 245 + files = ( 246 + ); 247 + inputPaths = ( 248 + ); 249 + name = "Run Script"; 250 + outputPaths = ( 251 + ); 252 + runOnlyForDeploymentPostprocessing = 0; 253 + shellPath = /bin/sh; 254 + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 255 + }; 256 + /* End PBXShellScriptBuildPhase section */ 257 + 258 + /* Begin PBXSourcesBuildPhase section */ 259 + 331C807D294A63A400263BE5 /* Sources */ = { 260 + isa = PBXSourcesBuildPhase; 261 + buildActionMask = 2147483647; 262 + files = ( 263 + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, 264 + ); 265 + runOnlyForDeploymentPostprocessing = 0; 266 + }; 267 + 97C146EA1CF9000F007C117D /* Sources */ = { 268 + isa = PBXSourcesBuildPhase; 269 + buildActionMask = 2147483647; 270 + files = ( 271 + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 272 + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 273 + ); 274 + runOnlyForDeploymentPostprocessing = 0; 275 + }; 276 + /* End PBXSourcesBuildPhase section */ 277 + 278 + /* Begin PBXTargetDependency section */ 279 + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { 280 + isa = PBXTargetDependency; 281 + target = 97C146ED1CF9000F007C117D /* Runner */; 282 + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; 283 + }; 284 + /* End PBXTargetDependency section */ 285 + 286 + /* Begin PBXVariantGroup section */ 287 + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 288 + isa = PBXVariantGroup; 289 + children = ( 290 + 97C146FB1CF9000F007C117D /* Base */, 291 + ); 292 + name = Main.storyboard; 293 + sourceTree = "<group>"; 294 + }; 295 + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 296 + isa = PBXVariantGroup; 297 + children = ( 298 + 97C147001CF9000F007C117D /* Base */, 299 + ); 300 + name = LaunchScreen.storyboard; 301 + sourceTree = "<group>"; 302 + }; 303 + /* End PBXVariantGroup section */ 304 + 305 + /* Begin XCBuildConfiguration section */ 306 + 249021D3217E4FDB00AE95B9 /* Profile */ = { 307 + isa = XCBuildConfiguration; 308 + buildSettings = { 309 + ALWAYS_SEARCH_USER_PATHS = NO; 310 + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 311 + CLANG_ANALYZER_NONNULL = YES; 312 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 313 + CLANG_CXX_LIBRARY = "libc++"; 314 + CLANG_ENABLE_MODULES = YES; 315 + CLANG_ENABLE_OBJC_ARC = YES; 316 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 317 + CLANG_WARN_BOOL_CONVERSION = YES; 318 + CLANG_WARN_COMMA = YES; 319 + CLANG_WARN_CONSTANT_CONVERSION = YES; 320 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 321 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 322 + CLANG_WARN_EMPTY_BODY = YES; 323 + CLANG_WARN_ENUM_CONVERSION = YES; 324 + CLANG_WARN_INFINITE_RECURSION = YES; 325 + CLANG_WARN_INT_CONVERSION = YES; 326 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 327 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 328 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 329 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 330 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 331 + CLANG_WARN_STRICT_PROTOTYPES = YES; 332 + CLANG_WARN_SUSPICIOUS_MOVE = YES; 333 + CLANG_WARN_UNREACHABLE_CODE = YES; 334 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 335 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 336 + COPY_PHASE_STRIP = NO; 337 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 338 + ENABLE_NS_ASSERTIONS = NO; 339 + ENABLE_STRICT_OBJC_MSGSEND = YES; 340 + ENABLE_USER_SCRIPT_SANDBOXING = NO; 341 + GCC_C_LANGUAGE_STANDARD = gnu99; 342 + GCC_NO_COMMON_BLOCKS = YES; 343 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 + GCC_WARN_UNDECLARED_SELECTOR = YES; 346 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 + GCC_WARN_UNUSED_FUNCTION = YES; 348 + GCC_WARN_UNUSED_VARIABLE = YES; 349 + IPHONEOS_DEPLOYMENT_TARGET = 13.0; 350 + MTL_ENABLE_DEBUG_INFO = NO; 351 + SDKROOT = iphoneos; 352 + SUPPORTED_PLATFORMS = iphoneos; 353 + TARGETED_DEVICE_FAMILY = "1,2"; 354 + VALIDATE_PRODUCT = YES; 355 + }; 356 + name = Profile; 357 + }; 358 + 249021D4217E4FDB00AE95B9 /* Profile */ = { 359 + isa = XCBuildConfiguration; 360 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 361 + buildSettings = { 362 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 363 + CLANG_ENABLE_MODULES = YES; 364 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 365 + ENABLE_BITCODE = NO; 366 + INFOPLIST_FILE = Runner/Info.plist; 367 + LD_RUNPATH_SEARCH_PATHS = ( 368 + "$(inherited)", 369 + "@executable_path/Frameworks", 370 + ); 371 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge; 372 + PRODUCT_NAME = "$(TARGET_NAME)"; 373 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 374 + SWIFT_VERSION = 5.0; 375 + VERSIONING_SYSTEM = "apple-generic"; 376 + }; 377 + name = Profile; 378 + }; 379 + 331C8088294A63A400263BE5 /* Debug */ = { 380 + isa = XCBuildConfiguration; 381 + buildSettings = { 382 + BUNDLE_LOADER = "$(TEST_HOST)"; 383 + CODE_SIGN_STYLE = Automatic; 384 + CURRENT_PROJECT_VERSION = 1; 385 + GENERATE_INFOPLIST_FILE = YES; 386 + MARKETING_VERSION = 1.0; 387 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge.RunnerTests; 388 + PRODUCT_NAME = "$(TARGET_NAME)"; 389 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 390 + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 391 + SWIFT_VERSION = 5.0; 392 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 393 + }; 394 + name = Debug; 395 + }; 396 + 331C8089294A63A400263BE5 /* Release */ = { 397 + isa = XCBuildConfiguration; 398 + buildSettings = { 399 + BUNDLE_LOADER = "$(TEST_HOST)"; 400 + CODE_SIGN_STYLE = Automatic; 401 + CURRENT_PROJECT_VERSION = 1; 402 + GENERATE_INFOPLIST_FILE = YES; 403 + MARKETING_VERSION = 1.0; 404 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge.RunnerTests; 405 + PRODUCT_NAME = "$(TARGET_NAME)"; 406 + SWIFT_VERSION = 5.0; 407 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 408 + }; 409 + name = Release; 410 + }; 411 + 331C808A294A63A400263BE5 /* Profile */ = { 412 + isa = XCBuildConfiguration; 413 + buildSettings = { 414 + BUNDLE_LOADER = "$(TEST_HOST)"; 415 + CODE_SIGN_STYLE = Automatic; 416 + CURRENT_PROJECT_VERSION = 1; 417 + GENERATE_INFOPLIST_FILE = YES; 418 + MARKETING_VERSION = 1.0; 419 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge.RunnerTests; 420 + PRODUCT_NAME = "$(TARGET_NAME)"; 421 + SWIFT_VERSION = 5.0; 422 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 423 + }; 424 + name = Profile; 425 + }; 426 + 97C147031CF9000F007C117D /* Debug */ = { 427 + isa = XCBuildConfiguration; 428 + buildSettings = { 429 + ALWAYS_SEARCH_USER_PATHS = NO; 430 + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 431 + CLANG_ANALYZER_NONNULL = YES; 432 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 433 + CLANG_CXX_LIBRARY = "libc++"; 434 + CLANG_ENABLE_MODULES = YES; 435 + CLANG_ENABLE_OBJC_ARC = YES; 436 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 437 + CLANG_WARN_BOOL_CONVERSION = YES; 438 + CLANG_WARN_COMMA = YES; 439 + CLANG_WARN_CONSTANT_CONVERSION = YES; 440 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 441 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 442 + CLANG_WARN_EMPTY_BODY = YES; 443 + CLANG_WARN_ENUM_CONVERSION = YES; 444 + CLANG_WARN_INFINITE_RECURSION = YES; 445 + CLANG_WARN_INT_CONVERSION = YES; 446 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 447 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 448 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 449 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 450 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 451 + CLANG_WARN_STRICT_PROTOTYPES = YES; 452 + CLANG_WARN_SUSPICIOUS_MOVE = YES; 453 + CLANG_WARN_UNREACHABLE_CODE = YES; 454 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 455 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 456 + COPY_PHASE_STRIP = NO; 457 + DEBUG_INFORMATION_FORMAT = dwarf; 458 + ENABLE_STRICT_OBJC_MSGSEND = YES; 459 + ENABLE_TESTABILITY = YES; 460 + ENABLE_USER_SCRIPT_SANDBOXING = NO; 461 + GCC_C_LANGUAGE_STANDARD = gnu99; 462 + GCC_DYNAMIC_NO_PIC = NO; 463 + GCC_NO_COMMON_BLOCKS = YES; 464 + GCC_OPTIMIZATION_LEVEL = 0; 465 + GCC_PREPROCESSOR_DEFINITIONS = ( 466 + "DEBUG=1", 467 + "$(inherited)", 468 + ); 469 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 470 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 471 + GCC_WARN_UNDECLARED_SELECTOR = YES; 472 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 473 + GCC_WARN_UNUSED_FUNCTION = YES; 474 + GCC_WARN_UNUSED_VARIABLE = YES; 475 + IPHONEOS_DEPLOYMENT_TARGET = 13.0; 476 + MTL_ENABLE_DEBUG_INFO = YES; 477 + ONLY_ACTIVE_ARCH = YES; 478 + SDKROOT = iphoneos; 479 + TARGETED_DEVICE_FAMILY = "1,2"; 480 + }; 481 + name = Debug; 482 + }; 483 + 97C147041CF9000F007C117D /* Release */ = { 484 + isa = XCBuildConfiguration; 485 + buildSettings = { 486 + ALWAYS_SEARCH_USER_PATHS = NO; 487 + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 488 + CLANG_ANALYZER_NONNULL = YES; 489 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 490 + CLANG_CXX_LIBRARY = "libc++"; 491 + CLANG_ENABLE_MODULES = YES; 492 + CLANG_ENABLE_OBJC_ARC = YES; 493 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 494 + CLANG_WARN_BOOL_CONVERSION = YES; 495 + CLANG_WARN_COMMA = YES; 496 + CLANG_WARN_CONSTANT_CONVERSION = YES; 497 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 498 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 499 + CLANG_WARN_EMPTY_BODY = YES; 500 + CLANG_WARN_ENUM_CONVERSION = YES; 501 + CLANG_WARN_INFINITE_RECURSION = YES; 502 + CLANG_WARN_INT_CONVERSION = YES; 503 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 504 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 505 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 506 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 507 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 508 + CLANG_WARN_STRICT_PROTOTYPES = YES; 509 + CLANG_WARN_SUSPICIOUS_MOVE = YES; 510 + CLANG_WARN_UNREACHABLE_CODE = YES; 511 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 512 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 513 + COPY_PHASE_STRIP = NO; 514 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 515 + ENABLE_NS_ASSERTIONS = NO; 516 + ENABLE_STRICT_OBJC_MSGSEND = YES; 517 + ENABLE_USER_SCRIPT_SANDBOXING = NO; 518 + GCC_C_LANGUAGE_STANDARD = gnu99; 519 + GCC_NO_COMMON_BLOCKS = YES; 520 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 521 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 522 + GCC_WARN_UNDECLARED_SELECTOR = YES; 523 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 524 + GCC_WARN_UNUSED_FUNCTION = YES; 525 + GCC_WARN_UNUSED_VARIABLE = YES; 526 + IPHONEOS_DEPLOYMENT_TARGET = 13.0; 527 + MTL_ENABLE_DEBUG_INFO = NO; 528 + SDKROOT = iphoneos; 529 + SUPPORTED_PLATFORMS = iphoneos; 530 + SWIFT_COMPILATION_MODE = wholemodule; 531 + SWIFT_OPTIMIZATION_LEVEL = "-O"; 532 + TARGETED_DEVICE_FAMILY = "1,2"; 533 + VALIDATE_PRODUCT = YES; 534 + }; 535 + name = Release; 536 + }; 537 + 97C147061CF9000F007C117D /* Debug */ = { 538 + isa = XCBuildConfiguration; 539 + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 540 + buildSettings = { 541 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 542 + CLANG_ENABLE_MODULES = YES; 543 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 544 + ENABLE_BITCODE = NO; 545 + INFOPLIST_FILE = Runner/Info.plist; 546 + LD_RUNPATH_SEARCH_PATHS = ( 547 + "$(inherited)", 548 + "@executable_path/Frameworks", 549 + ); 550 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge; 551 + PRODUCT_NAME = "$(TARGET_NAME)"; 552 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 553 + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 554 + SWIFT_VERSION = 5.0; 555 + VERSIONING_SYSTEM = "apple-generic"; 556 + }; 557 + name = Debug; 558 + }; 559 + 97C147071CF9000F007C117D /* Release */ = { 560 + isa = XCBuildConfiguration; 561 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 562 + buildSettings = { 563 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 564 + CLANG_ENABLE_MODULES = YES; 565 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 566 + ENABLE_BITCODE = NO; 567 + INFOPLIST_FILE = Runner/Info.plist; 568 + LD_RUNPATH_SEARCH_PATHS = ( 569 + "$(inherited)", 570 + "@executable_path/Frameworks", 571 + ); 572 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge; 573 + PRODUCT_NAME = "$(TARGET_NAME)"; 574 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 575 + SWIFT_VERSION = 5.0; 576 + VERSIONING_SYSTEM = "apple-generic"; 577 + }; 578 + name = Release; 579 + }; 580 + /* End XCBuildConfiguration section */ 581 + 582 + /* Begin XCConfigurationList section */ 583 + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { 584 + isa = XCConfigurationList; 585 + buildConfigurations = ( 586 + 331C8088294A63A400263BE5 /* Debug */, 587 + 331C8089294A63A400263BE5 /* Release */, 588 + 331C808A294A63A400263BE5 /* Profile */, 589 + ); 590 + defaultConfigurationIsVisible = 0; 591 + defaultConfigurationName = Release; 592 + }; 593 + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 594 + isa = XCConfigurationList; 595 + buildConfigurations = ( 596 + 97C147031CF9000F007C117D /* Debug */, 597 + 97C147041CF9000F007C117D /* Release */, 598 + 249021D3217E4FDB00AE95B9 /* Profile */, 599 + ); 600 + defaultConfigurationIsVisible = 0; 601 + defaultConfigurationName = Release; 602 + }; 603 + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 604 + isa = XCConfigurationList; 605 + buildConfigurations = ( 606 + 97C147061CF9000F007C117D /* Debug */, 607 + 97C147071CF9000F007C117D /* Release */, 608 + 249021D4217E4FDB00AE95B9 /* Profile */, 609 + ); 610 + defaultConfigurationIsVisible = 0; 611 + defaultConfigurationName = Release; 612 + }; 613 + /* End XCConfigurationList section */ 614 + }; 615 + rootObject = 97C146E61CF9000F007C117D /* Project object */; 616 + }
+7
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <Workspace 3 + version = "1.0"> 4 + <FileRef 5 + location = "self:"> 6 + </FileRef> 7 + </Workspace>
+8
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>IDEDidComputeMac32BitWarning</key> 6 + <true/> 7 + </dict> 8 + </plist>
+8
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>PreviewsEnabled</key> 6 + <false/> 7 + </dict> 8 + </plist>
+101
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <Scheme 3 + LastUpgradeVersion = "1510" 4 + version = "1.3"> 5 + <BuildAction 6 + parallelizeBuildables = "YES" 7 + buildImplicitDependencies = "YES"> 8 + <BuildActionEntries> 9 + <BuildActionEntry 10 + buildForTesting = "YES" 11 + buildForRunning = "YES" 12 + buildForProfiling = "YES" 13 + buildForArchiving = "YES" 14 + buildForAnalyzing = "YES"> 15 + <BuildableReference 16 + BuildableIdentifier = "primary" 17 + BlueprintIdentifier = "97C146ED1CF9000F007C117D" 18 + BuildableName = "Runner.app" 19 + BlueprintName = "Runner" 20 + ReferencedContainer = "container:Runner.xcodeproj"> 21 + </BuildableReference> 22 + </BuildActionEntry> 23 + </BuildActionEntries> 24 + </BuildAction> 25 + <TestAction 26 + buildConfiguration = "Debug" 27 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 28 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 29 + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" 30 + shouldUseLaunchSchemeArgsEnv = "YES"> 31 + <MacroExpansion> 32 + <BuildableReference 33 + BuildableIdentifier = "primary" 34 + BlueprintIdentifier = "97C146ED1CF9000F007C117D" 35 + BuildableName = "Runner.app" 36 + BlueprintName = "Runner" 37 + ReferencedContainer = "container:Runner.xcodeproj"> 38 + </BuildableReference> 39 + </MacroExpansion> 40 + <Testables> 41 + <TestableReference 42 + skipped = "NO" 43 + parallelizable = "YES"> 44 + <BuildableReference 45 + BuildableIdentifier = "primary" 46 + BlueprintIdentifier = "331C8080294A63A400263BE5" 47 + BuildableName = "RunnerTests.xctest" 48 + BlueprintName = "RunnerTests" 49 + ReferencedContainer = "container:Runner.xcodeproj"> 50 + </BuildableReference> 51 + </TestableReference> 52 + </Testables> 53 + </TestAction> 54 + <LaunchAction 55 + buildConfiguration = "Debug" 56 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 57 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 58 + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" 59 + launchStyle = "0" 60 + useCustomWorkingDirectory = "NO" 61 + ignoresPersistentStateOnLaunch = "NO" 62 + debugDocumentVersioning = "YES" 63 + debugServiceExtension = "internal" 64 + enableGPUValidationMode = "1" 65 + allowLocationSimulation = "YES"> 66 + <BuildableProductRunnable 67 + runnableDebuggingMode = "0"> 68 + <BuildableReference 69 + BuildableIdentifier = "primary" 70 + BlueprintIdentifier = "97C146ED1CF9000F007C117D" 71 + BuildableName = "Runner.app" 72 + BlueprintName = "Runner" 73 + ReferencedContainer = "container:Runner.xcodeproj"> 74 + </BuildableReference> 75 + </BuildableProductRunnable> 76 + </LaunchAction> 77 + <ProfileAction 78 + buildConfiguration = "Profile" 79 + shouldUseLaunchSchemeArgsEnv = "YES" 80 + savedToolIdentifier = "" 81 + useCustomWorkingDirectory = "NO" 82 + debugDocumentVersioning = "YES"> 83 + <BuildableProductRunnable 84 + runnableDebuggingMode = "0"> 85 + <BuildableReference 86 + BuildableIdentifier = "primary" 87 + BlueprintIdentifier = "97C146ED1CF9000F007C117D" 88 + BuildableName = "Runner.app" 89 + BlueprintName = "Runner" 90 + ReferencedContainer = "container:Runner.xcodeproj"> 91 + </BuildableReference> 92 + </BuildableProductRunnable> 93 + </ProfileAction> 94 + <AnalyzeAction 95 + buildConfiguration = "Debug"> 96 + </AnalyzeAction> 97 + <ArchiveAction 98 + buildConfiguration = "Release" 99 + revealArchiveInOrganizer = "YES"> 100 + </ArchiveAction> 101 + </Scheme>
+7
ios/Runner.xcworkspace/contents.xcworkspacedata
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <Workspace 3 + version = "1.0"> 4 + <FileRef 5 + location = "group:Runner.xcodeproj"> 6 + </FileRef> 7 + </Workspace>
+8
ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>IDEDidComputeMac32BitWarning</key> 6 + <true/> 7 + </dict> 8 + </plist>
+8
ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>PreviewsEnabled</key> 6 + <false/> 7 + </dict> 8 + </plist>
+13
ios/Runner/AppDelegate.swift
··· 1 + import Flutter 2 + import UIKit 3 + 4 + @main 5 + @objc class AppDelegate: FlutterAppDelegate { 6 + override func application( 7 + _ application: UIApplication, 8 + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 + ) -> Bool { 10 + GeneratedPluginRegistrant.register(with: self) 11 + return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 + } 13 + }
+122
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
··· 1 + { 2 + "images" : [ 3 + { 4 + "size" : "20x20", 5 + "idiom" : "iphone", 6 + "filename" : "Icon-App-20x20@2x.png", 7 + "scale" : "2x" 8 + }, 9 + { 10 + "size" : "20x20", 11 + "idiom" : "iphone", 12 + "filename" : "Icon-App-20x20@3x.png", 13 + "scale" : "3x" 14 + }, 15 + { 16 + "size" : "29x29", 17 + "idiom" : "iphone", 18 + "filename" : "Icon-App-29x29@1x.png", 19 + "scale" : "1x" 20 + }, 21 + { 22 + "size" : "29x29", 23 + "idiom" : "iphone", 24 + "filename" : "Icon-App-29x29@2x.png", 25 + "scale" : "2x" 26 + }, 27 + { 28 + "size" : "29x29", 29 + "idiom" : "iphone", 30 + "filename" : "Icon-App-29x29@3x.png", 31 + "scale" : "3x" 32 + }, 33 + { 34 + "size" : "40x40", 35 + "idiom" : "iphone", 36 + "filename" : "Icon-App-40x40@2x.png", 37 + "scale" : "2x" 38 + }, 39 + { 40 + "size" : "40x40", 41 + "idiom" : "iphone", 42 + "filename" : "Icon-App-40x40@3x.png", 43 + "scale" : "3x" 44 + }, 45 + { 46 + "size" : "60x60", 47 + "idiom" : "iphone", 48 + "filename" : "Icon-App-60x60@2x.png", 49 + "scale" : "2x" 50 + }, 51 + { 52 + "size" : "60x60", 53 + "idiom" : "iphone", 54 + "filename" : "Icon-App-60x60@3x.png", 55 + "scale" : "3x" 56 + }, 57 + { 58 + "size" : "20x20", 59 + "idiom" : "ipad", 60 + "filename" : "Icon-App-20x20@1x.png", 61 + "scale" : "1x" 62 + }, 63 + { 64 + "size" : "20x20", 65 + "idiom" : "ipad", 66 + "filename" : "Icon-App-20x20@2x.png", 67 + "scale" : "2x" 68 + }, 69 + { 70 + "size" : "29x29", 71 + "idiom" : "ipad", 72 + "filename" : "Icon-App-29x29@1x.png", 73 + "scale" : "1x" 74 + }, 75 + { 76 + "size" : "29x29", 77 + "idiom" : "ipad", 78 + "filename" : "Icon-App-29x29@2x.png", 79 + "scale" : "2x" 80 + }, 81 + { 82 + "size" : "40x40", 83 + "idiom" : "ipad", 84 + "filename" : "Icon-App-40x40@1x.png", 85 + "scale" : "1x" 86 + }, 87 + { 88 + "size" : "40x40", 89 + "idiom" : "ipad", 90 + "filename" : "Icon-App-40x40@2x.png", 91 + "scale" : "2x" 92 + }, 93 + { 94 + "size" : "76x76", 95 + "idiom" : "ipad", 96 + "filename" : "Icon-App-76x76@1x.png", 97 + "scale" : "1x" 98 + }, 99 + { 100 + "size" : "76x76", 101 + "idiom" : "ipad", 102 + "filename" : "Icon-App-76x76@2x.png", 103 + "scale" : "2x" 104 + }, 105 + { 106 + "size" : "83.5x83.5", 107 + "idiom" : "ipad", 108 + "filename" : "Icon-App-83.5x83.5@2x.png", 109 + "scale" : "2x" 110 + }, 111 + { 112 + "size" : "1024x1024", 113 + "idiom" : "ios-marketing", 114 + "filename" : "Icon-App-1024x1024@1x.png", 115 + "scale" : "1x" 116 + } 117 + ], 118 + "info" : { 119 + "version" : 1, 120 + "author" : "xcode" 121 + } 122 + }
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png

This is a binary file and will not be displayed.

+23
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
··· 1 + { 2 + "images" : [ 3 + { 4 + "idiom" : "universal", 5 + "filename" : "LaunchImage.png", 6 + "scale" : "1x" 7 + }, 8 + { 9 + "idiom" : "universal", 10 + "filename" : "LaunchImage@2x.png", 11 + "scale" : "2x" 12 + }, 13 + { 14 + "idiom" : "universal", 15 + "filename" : "LaunchImage@3x.png", 16 + "scale" : "3x" 17 + } 18 + ], 19 + "info" : { 20 + "version" : 1, 21 + "author" : "xcode" 22 + } 23 + }
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png

This is a binary file and will not be displayed.

ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png

This is a binary file and will not be displayed.

+5
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
··· 1 + # Launch Screen Assets 2 + 3 + You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 + 5 + You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
+37
ios/Runner/Base.lproj/LaunchScreen.storyboard
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> 3 + <dependencies> 4 + <deployment identifier="iOS"/> 5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> 6 + </dependencies> 7 + <scenes> 8 + <!--View Controller--> 9 + <scene sceneID="EHf-IW-A2E"> 10 + <objects> 11 + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> 12 + <layoutGuides> 13 + <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> 14 + <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> 15 + </layoutGuides> 16 + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> 17 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 18 + <subviews> 19 + <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> 20 + </imageView> 21 + </subviews> 22 + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 23 + <constraints> 24 + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> 25 + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> 26 + </constraints> 27 + </view> 28 + </viewController> 29 + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> 30 + </objects> 31 + <point key="canvasLocation" x="53" y="375"/> 32 + </scene> 33 + </scenes> 34 + <resources> 35 + <image name="LaunchImage" width="168" height="185"/> 36 + </resources> 37 + </document>
+26
ios/Runner/Base.lproj/Main.storyboard
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> 3 + <dependencies> 4 + <deployment identifier="iOS"/> 5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> 6 + </dependencies> 7 + <scenes> 8 + <!--Flutter View Controller--> 9 + <scene sceneID="tne-QT-ifu"> 10 + <objects> 11 + <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> 12 + <layoutGuides> 13 + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> 14 + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> 15 + </layoutGuides> 16 + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> 17 + <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 18 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 19 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 20 + </view> 21 + </viewController> 22 + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> 23 + </objects> 24 + </scene> 25 + </scenes> 26 + </document>
+49
ios/Runner/Info.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>CFBundleDevelopmentRegion</key> 6 + <string>$(DEVELOPMENT_LANGUAGE)</string> 7 + <key>CFBundleDisplayName</key> 8 + <string>Pudge</string> 9 + <key>CFBundleExecutable</key> 10 + <string>$(EXECUTABLE_NAME)</string> 11 + <key>CFBundleIdentifier</key> 12 + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> 13 + <key>CFBundleInfoDictionaryVersion</key> 14 + <string>6.0</string> 15 + <key>CFBundleName</key> 16 + <string>pudge</string> 17 + <key>CFBundlePackageType</key> 18 + <string>APPL</string> 19 + <key>CFBundleShortVersionString</key> 20 + <string>$(FLUTTER_BUILD_NAME)</string> 21 + <key>CFBundleSignature</key> 22 + <string>????</string> 23 + <key>CFBundleVersion</key> 24 + <string>$(FLUTTER_BUILD_NUMBER)</string> 25 + <key>LSRequiresIPhoneOS</key> 26 + <true/> 27 + <key>UILaunchStoryboardName</key> 28 + <string>LaunchScreen</string> 29 + <key>UIMainStoryboardFile</key> 30 + <string>Main</string> 31 + <key>UISupportedInterfaceOrientations</key> 32 + <array> 33 + <string>UIInterfaceOrientationPortrait</string> 34 + <string>UIInterfaceOrientationLandscapeLeft</string> 35 + <string>UIInterfaceOrientationLandscapeRight</string> 36 + </array> 37 + <key>UISupportedInterfaceOrientations~ipad</key> 38 + <array> 39 + <string>UIInterfaceOrientationPortrait</string> 40 + <string>UIInterfaceOrientationPortraitUpsideDown</string> 41 + <string>UIInterfaceOrientationLandscapeLeft</string> 42 + <string>UIInterfaceOrientationLandscapeRight</string> 43 + </array> 44 + <key>CADisableMinimumFrameDurationOnPhone</key> 45 + <true/> 46 + <key>UIApplicationSupportsIndirectInputEvents</key> 47 + <true/> 48 + </dict> 49 + </plist>
+1
ios/Runner/Runner-Bridging-Header.h
··· 1 + #import "GeneratedPluginRegistrant.h"
+12
ios/RunnerTests/RunnerTests.swift
··· 1 + import Flutter 2 + import UIKit 3 + import XCTest 4 + 5 + class RunnerTests: XCTestCase { 6 + 7 + func testExample() { 8 + // If you add code to the Runner application, consider adding tests here. 9 + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 + } 11 + 12 + }
+20
lib/main.dart
··· 1 + import 'package:flutter/material.dart'; 2 + 3 + void main() { 4 + runApp(const MainApp()); 5 + } 6 + 7 + class MainApp extends StatelessWidget { 8 + const MainApp({super.key}); 9 + 10 + @override 11 + Widget build(BuildContext context) { 12 + return const MaterialApp( 13 + home: Scaffold( 14 + body: Center( 15 + child: Text('Hello World!'), 16 + ), 17 + ), 18 + ); 19 + } 20 + }
+1
linux/.gitignore
··· 1 + flutter/ephemeral
+128
linux/CMakeLists.txt
··· 1 + # Project-level configuration. 2 + cmake_minimum_required(VERSION 3.13) 3 + project(runner LANGUAGES CXX) 4 + 5 + # The name of the executable created for the application. Change this to change 6 + # the on-disk name of your application. 7 + set(BINARY_NAME "pudge") 8 + # The unique GTK application identifier for this application. See: 9 + # https://wiki.gnome.org/HowDoI/ChooseApplicationID 10 + set(APPLICATION_ID "com.example.pudge") 11 + 12 + # Explicitly opt in to modern CMake behaviors to avoid warnings with recent 13 + # versions of CMake. 14 + cmake_policy(SET CMP0063 NEW) 15 + 16 + # Load bundled libraries from the lib/ directory relative to the binary. 17 + set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") 18 + 19 + # Root filesystem for cross-building. 20 + if(FLUTTER_TARGET_PLATFORM_SYSROOT) 21 + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) 22 + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) 23 + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 24 + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 25 + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 26 + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 27 + endif() 28 + 29 + # Define build configuration options. 30 + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 31 + set(CMAKE_BUILD_TYPE "Debug" CACHE 32 + STRING "Flutter build mode" FORCE) 33 + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS 34 + "Debug" "Profile" "Release") 35 + endif() 36 + 37 + # Compilation settings that should be applied to most targets. 38 + # 39 + # Be cautious about adding new options here, as plugins use this function by 40 + # default. In most cases, you should add new options to specific targets instead 41 + # of modifying this function. 42 + function(APPLY_STANDARD_SETTINGS TARGET) 43 + target_compile_features(${TARGET} PUBLIC cxx_std_14) 44 + target_compile_options(${TARGET} PRIVATE -Wall -Werror) 45 + target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>") 46 + target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>") 47 + endfunction() 48 + 49 + # Flutter library and tool build rules. 50 + set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") 51 + add_subdirectory(${FLUTTER_MANAGED_DIR}) 52 + 53 + # System-level dependencies. 54 + find_package(PkgConfig REQUIRED) 55 + pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) 56 + 57 + # Application build; see runner/CMakeLists.txt. 58 + add_subdirectory("runner") 59 + 60 + # Run the Flutter tool portions of the build. This must not be removed. 61 + add_dependencies(${BINARY_NAME} flutter_assemble) 62 + 63 + # Only the install-generated bundle's copy of the executable will launch 64 + # correctly, since the resources must in the right relative locations. To avoid 65 + # people trying to run the unbundled copy, put it in a subdirectory instead of 66 + # the default top-level location. 67 + set_target_properties(${BINARY_NAME} 68 + PROPERTIES 69 + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" 70 + ) 71 + 72 + 73 + # Generated plugin build rules, which manage building the plugins and adding 74 + # them to the application. 75 + include(flutter/generated_plugins.cmake) 76 + 77 + 78 + # === Installation === 79 + # By default, "installing" just makes a relocatable bundle in the build 80 + # directory. 81 + set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") 82 + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 83 + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) 84 + endif() 85 + 86 + # Start with a clean build bundle directory every time. 87 + install(CODE " 88 + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") 89 + " COMPONENT Runtime) 90 + 91 + set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") 92 + set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") 93 + 94 + install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" 95 + COMPONENT Runtime) 96 + 97 + install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" 98 + COMPONENT Runtime) 99 + 100 + install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 101 + COMPONENT Runtime) 102 + 103 + foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) 104 + install(FILES "${bundled_library}" 105 + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 106 + COMPONENT Runtime) 107 + endforeach(bundled_library) 108 + 109 + # Copy the native assets provided by the build.dart from all packages. 110 + set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") 111 + install(DIRECTORY "${NATIVE_ASSETS_DIR}" 112 + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 113 + COMPONENT Runtime) 114 + 115 + # Fully re-copy the assets directory on each build to avoid having stale files 116 + # from a previous install. 117 + set(FLUTTER_ASSET_DIR_NAME "flutter_assets") 118 + install(CODE " 119 + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") 120 + " COMPONENT Runtime) 121 + install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" 122 + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) 123 + 124 + # Install the AOT library on non-Debug builds only. 125 + if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") 126 + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 127 + COMPONENT Runtime) 128 + endif()
+88
linux/flutter/CMakeLists.txt
··· 1 + # This file controls Flutter-level build steps. It should not be edited. 2 + cmake_minimum_required(VERSION 3.10) 3 + 4 + set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") 5 + 6 + # Configuration provided via flutter tool. 7 + include(${EPHEMERAL_DIR}/generated_config.cmake) 8 + 9 + # TODO: Move the rest of this into files in ephemeral. See 10 + # https://github.com/flutter/flutter/issues/57146. 11 + 12 + # Serves the same purpose as list(TRANSFORM ... PREPEND ...), 13 + # which isn't available in 3.10. 14 + function(list_prepend LIST_NAME PREFIX) 15 + set(NEW_LIST "") 16 + foreach(element ${${LIST_NAME}}) 17 + list(APPEND NEW_LIST "${PREFIX}${element}") 18 + endforeach(element) 19 + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) 20 + endfunction() 21 + 22 + # === Flutter Library === 23 + # System-level dependencies. 24 + find_package(PkgConfig REQUIRED) 25 + pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) 26 + pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) 27 + pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) 28 + 29 + set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") 30 + 31 + # Published to parent scope for install step. 32 + set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) 33 + set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) 34 + set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) 35 + set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) 36 + 37 + list(APPEND FLUTTER_LIBRARY_HEADERS 38 + "fl_basic_message_channel.h" 39 + "fl_binary_codec.h" 40 + "fl_binary_messenger.h" 41 + "fl_dart_project.h" 42 + "fl_engine.h" 43 + "fl_json_message_codec.h" 44 + "fl_json_method_codec.h" 45 + "fl_message_codec.h" 46 + "fl_method_call.h" 47 + "fl_method_channel.h" 48 + "fl_method_codec.h" 49 + "fl_method_response.h" 50 + "fl_plugin_registrar.h" 51 + "fl_plugin_registry.h" 52 + "fl_standard_message_codec.h" 53 + "fl_standard_method_codec.h" 54 + "fl_string_codec.h" 55 + "fl_value.h" 56 + "fl_view.h" 57 + "flutter_linux.h" 58 + ) 59 + list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") 60 + add_library(flutter INTERFACE) 61 + target_include_directories(flutter INTERFACE 62 + "${EPHEMERAL_DIR}" 63 + ) 64 + target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") 65 + target_link_libraries(flutter INTERFACE 66 + PkgConfig::GTK 67 + PkgConfig::GLIB 68 + PkgConfig::GIO 69 + ) 70 + add_dependencies(flutter flutter_assemble) 71 + 72 + # === Flutter tool backend === 73 + # _phony_ is a non-existent file to force this command to run every time, 74 + # since currently there's no way to get a full input/output list from the 75 + # flutter tool. 76 + add_custom_command( 77 + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} 78 + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ 79 + COMMAND ${CMAKE_COMMAND} -E env 80 + ${FLUTTER_TOOL_ENVIRONMENT} 81 + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" 82 + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} 83 + VERBATIM 84 + ) 85 + add_custom_target(flutter_assemble DEPENDS 86 + "${FLUTTER_LIBRARY}" 87 + ${FLUTTER_LIBRARY_HEADERS} 88 + )
+11
linux/flutter/generated_plugin_registrant.cc
··· 1 + // 2 + // Generated file. Do not edit. 3 + // 4 + 5 + // clang-format off 6 + 7 + #include "generated_plugin_registrant.h" 8 + 9 + 10 + void fl_register_plugins(FlPluginRegistry* registry) { 11 + }
+15
linux/flutter/generated_plugin_registrant.h
··· 1 + // 2 + // Generated file. Do not edit. 3 + // 4 + 5 + // clang-format off 6 + 7 + #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 + #define GENERATED_PLUGIN_REGISTRANT_ 9 + 10 + #include <flutter_linux/flutter_linux.h> 11 + 12 + // Registers Flutter plugins. 13 + void fl_register_plugins(FlPluginRegistry* registry); 14 + 15 + #endif // GENERATED_PLUGIN_REGISTRANT_
+23
linux/flutter/generated_plugins.cmake
··· 1 + # 2 + # Generated file, do not edit. 3 + # 4 + 5 + list(APPEND FLUTTER_PLUGIN_LIST 6 + ) 7 + 8 + list(APPEND FLUTTER_FFI_PLUGIN_LIST 9 + ) 10 + 11 + set(PLUGIN_BUNDLED_LIBRARIES) 12 + 13 + foreach(plugin ${FLUTTER_PLUGIN_LIST}) 14 + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) 15 + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 16 + list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) 17 + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 18 + endforeach(plugin) 19 + 20 + foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 21 + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) 22 + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 23 + endforeach(ffi_plugin)
+26
linux/runner/CMakeLists.txt
··· 1 + cmake_minimum_required(VERSION 3.13) 2 + project(runner LANGUAGES CXX) 3 + 4 + # Define the application target. To change its name, change BINARY_NAME in the 5 + # top-level CMakeLists.txt, not the value here, or `flutter run` will no longer 6 + # work. 7 + # 8 + # Any new source files that you add to the application should be added here. 9 + add_executable(${BINARY_NAME} 10 + "main.cc" 11 + "my_application.cc" 12 + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" 13 + ) 14 + 15 + # Apply the standard set of build settings. This can be removed for applications 16 + # that need different build settings. 17 + apply_standard_settings(${BINARY_NAME}) 18 + 19 + # Add preprocessor definitions for the application ID. 20 + add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") 21 + 22 + # Add dependency libraries. Add any application-specific dependencies here. 23 + target_link_libraries(${BINARY_NAME} PRIVATE flutter) 24 + target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) 25 + 26 + target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+6
linux/runner/main.cc
··· 1 + #include "my_application.h" 2 + 3 + int main(int argc, char** argv) { 4 + g_autoptr(MyApplication) app = my_application_new(); 5 + return g_application_run(G_APPLICATION(app), argc, argv); 6 + }
+144
linux/runner/my_application.cc
··· 1 + #include "my_application.h" 2 + 3 + #include <flutter_linux/flutter_linux.h> 4 + #ifdef GDK_WINDOWING_X11 5 + #include <gdk/gdkx.h> 6 + #endif 7 + 8 + #include "flutter/generated_plugin_registrant.h" 9 + 10 + struct _MyApplication { 11 + GtkApplication parent_instance; 12 + char** dart_entrypoint_arguments; 13 + }; 14 + 15 + G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) 16 + 17 + // Called when first Flutter frame received. 18 + static void first_frame_cb(MyApplication* self, FlView *view) 19 + { 20 + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); 21 + } 22 + 23 + // Implements GApplication::activate. 24 + static void my_application_activate(GApplication* application) { 25 + MyApplication* self = MY_APPLICATION(application); 26 + GtkWindow* window = 27 + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); 28 + 29 + // Use a header bar when running in GNOME as this is the common style used 30 + // by applications and is the setup most users will be using (e.g. Ubuntu 31 + // desktop). 32 + // If running on X and not using GNOME then just use a traditional title bar 33 + // in case the window manager does more exotic layout, e.g. tiling. 34 + // If running on Wayland assume the header bar will work (may need changing 35 + // if future cases occur). 36 + gboolean use_header_bar = TRUE; 37 + #ifdef GDK_WINDOWING_X11 38 + GdkScreen* screen = gtk_window_get_screen(window); 39 + if (GDK_IS_X11_SCREEN(screen)) { 40 + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); 41 + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { 42 + use_header_bar = FALSE; 43 + } 44 + } 45 + #endif 46 + if (use_header_bar) { 47 + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); 48 + gtk_widget_show(GTK_WIDGET(header_bar)); 49 + gtk_header_bar_set_title(header_bar, "pudge"); 50 + gtk_header_bar_set_show_close_button(header_bar, TRUE); 51 + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); 52 + } else { 53 + gtk_window_set_title(window, "pudge"); 54 + } 55 + 56 + gtk_window_set_default_size(window, 1280, 720); 57 + 58 + g_autoptr(FlDartProject) project = fl_dart_project_new(); 59 + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); 60 + 61 + FlView* view = fl_view_new(project); 62 + GdkRGBA background_color; 63 + // Background defaults to black, override it here if necessary, e.g. #00000000 for transparent. 64 + gdk_rgba_parse(&background_color, "#000000"); 65 + fl_view_set_background_color(view, &background_color); 66 + gtk_widget_show(GTK_WIDGET(view)); 67 + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); 68 + 69 + // Show the window when Flutter renders. 70 + // Requires the view to be realized so we can start rendering. 71 + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), self); 72 + gtk_widget_realize(GTK_WIDGET(view)); 73 + 74 + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); 75 + 76 + gtk_widget_grab_focus(GTK_WIDGET(view)); 77 + } 78 + 79 + // Implements GApplication::local_command_line. 80 + static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { 81 + MyApplication* self = MY_APPLICATION(application); 82 + // Strip out the first argument as it is the binary name. 83 + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); 84 + 85 + g_autoptr(GError) error = nullptr; 86 + if (!g_application_register(application, nullptr, &error)) { 87 + g_warning("Failed to register: %s", error->message); 88 + *exit_status = 1; 89 + return TRUE; 90 + } 91 + 92 + g_application_activate(application); 93 + *exit_status = 0; 94 + 95 + return TRUE; 96 + } 97 + 98 + // Implements GApplication::startup. 99 + static void my_application_startup(GApplication* application) { 100 + //MyApplication* self = MY_APPLICATION(object); 101 + 102 + // Perform any actions required at application startup. 103 + 104 + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); 105 + } 106 + 107 + // Implements GApplication::shutdown. 108 + static void my_application_shutdown(GApplication* application) { 109 + //MyApplication* self = MY_APPLICATION(object); 110 + 111 + // Perform any actions required at application shutdown. 112 + 113 + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); 114 + } 115 + 116 + // Implements GObject::dispose. 117 + static void my_application_dispose(GObject* object) { 118 + MyApplication* self = MY_APPLICATION(object); 119 + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); 120 + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); 121 + } 122 + 123 + static void my_application_class_init(MyApplicationClass* klass) { 124 + G_APPLICATION_CLASS(klass)->activate = my_application_activate; 125 + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; 126 + G_APPLICATION_CLASS(klass)->startup = my_application_startup; 127 + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; 128 + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; 129 + } 130 + 131 + static void my_application_init(MyApplication* self) {} 132 + 133 + MyApplication* my_application_new() { 134 + // Set the program name to the application ID, which helps various systems 135 + // like GTK and desktop environments map this running application to its 136 + // corresponding .desktop file. This ensures better integration by allowing 137 + // the application to be recognized beyond its binary name. 138 + g_set_prgname(APPLICATION_ID); 139 + 140 + return MY_APPLICATION(g_object_new(my_application_get_type(), 141 + "application-id", APPLICATION_ID, 142 + "flags", G_APPLICATION_NON_UNIQUE, 143 + nullptr)); 144 + }
+18
linux/runner/my_application.h
··· 1 + #ifndef FLUTTER_MY_APPLICATION_H_ 2 + #define FLUTTER_MY_APPLICATION_H_ 3 + 4 + #include <gtk/gtk.h> 5 + 6 + G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 + GtkApplication) 8 + 9 + /** 10 + * my_application_new: 11 + * 12 + * Creates a new Flutter-based application. 13 + * 14 + * Returns: a new #MyApplication. 15 + */ 16 + MyApplication* my_application_new(); 17 + 18 + #endif // FLUTTER_MY_APPLICATION_H_
+7
macos/.gitignore
··· 1 + # Flutter-related 2 + **/Flutter/ephemeral/ 3 + **/Pods/ 4 + 5 + # Xcode-related 6 + **/dgph 7 + **/xcuserdata/
+1
macos/Flutter/Flutter-Debug.xcconfig
··· 1 + #include "ephemeral/Flutter-Generated.xcconfig"
+1
macos/Flutter/Flutter-Release.xcconfig
··· 1 + #include "ephemeral/Flutter-Generated.xcconfig"
+10
macos/Flutter/GeneratedPluginRegistrant.swift
··· 1 + // 2 + // Generated file. Do not edit. 3 + // 4 + 5 + import FlutterMacOS 6 + import Foundation 7 + 8 + 9 + func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 10 + }
+705
macos/Runner.xcodeproj/project.pbxproj
··· 1 + // !$*UTF8*$! 2 + { 3 + archiveVersion = 1; 4 + classes = { 5 + }; 6 + objectVersion = 54; 7 + objects = { 8 + 9 + /* Begin PBXAggregateTarget section */ 10 + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { 11 + isa = PBXAggregateTarget; 12 + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; 13 + buildPhases = ( 14 + 33CC111E2044C6BF0003C045 /* ShellScript */, 15 + ); 16 + dependencies = ( 17 + ); 18 + name = "Flutter Assemble"; 19 + productName = FLX; 20 + }; 21 + /* End PBXAggregateTarget section */ 22 + 23 + /* Begin PBXBuildFile section */ 24 + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 25 + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 26 + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 27 + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 28 + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 29 + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 30 + /* End PBXBuildFile section */ 31 + 32 + /* Begin PBXContainerItemProxy section */ 33 + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { 34 + isa = PBXContainerItemProxy; 35 + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; 36 + proxyType = 1; 37 + remoteGlobalIDString = 33CC10EC2044A3C60003C045; 38 + remoteInfo = Runner; 39 + }; 40 + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { 41 + isa = PBXContainerItemProxy; 42 + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; 43 + proxyType = 1; 44 + remoteGlobalIDString = 33CC111A2044C6BA0003C045; 45 + remoteInfo = FLX; 46 + }; 47 + /* End PBXContainerItemProxy section */ 48 + 49 + /* Begin PBXCopyFilesBuildPhase section */ 50 + 33CC110E2044A8840003C045 /* Bundle Framework */ = { 51 + isa = PBXCopyFilesBuildPhase; 52 + buildActionMask = 2147483647; 53 + dstPath = ""; 54 + dstSubfolderSpec = 10; 55 + files = ( 56 + ); 57 + name = "Bundle Framework"; 58 + runOnlyForDeploymentPostprocessing = 0; 59 + }; 60 + /* End PBXCopyFilesBuildPhase section */ 61 + 62 + /* Begin PBXFileReference section */ 63 + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 64 + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; 65 + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; }; 66 + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; }; 67 + 33CC10ED2044A3C60003C045 /* pudge.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "pudge.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 68 + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 69 + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; }; 70 + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; }; 71 + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; }; 72 + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; }; 73 + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; }; 74 + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; }; 75 + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; }; 76 + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; }; 77 + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; }; 78 + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; }; 79 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; }; 80 + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; }; 81 + /* End PBXFileReference section */ 82 + 83 + /* Begin PBXFrameworksBuildPhase section */ 84 + 331C80D2294CF70F00263BE5 /* Frameworks */ = { 85 + isa = PBXFrameworksBuildPhase; 86 + buildActionMask = 2147483647; 87 + files = ( 88 + ); 89 + runOnlyForDeploymentPostprocessing = 0; 90 + }; 91 + 33CC10EA2044A3C60003C045 /* Frameworks */ = { 92 + isa = PBXFrameworksBuildPhase; 93 + buildActionMask = 2147483647; 94 + files = ( 95 + ); 96 + runOnlyForDeploymentPostprocessing = 0; 97 + }; 98 + /* End PBXFrameworksBuildPhase section */ 99 + 100 + /* Begin PBXGroup section */ 101 + 331C80D6294CF71000263BE5 /* RunnerTests */ = { 102 + isa = PBXGroup; 103 + children = ( 104 + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, 105 + ); 106 + path = RunnerTests; 107 + sourceTree = "<group>"; 108 + }; 109 + 33BA886A226E78AF003329D5 /* Configs */ = { 110 + isa = PBXGroup; 111 + children = ( 112 + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, 113 + 9740EEB21CF90195004384FC /* Debug.xcconfig */, 114 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 115 + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, 116 + ); 117 + path = Configs; 118 + sourceTree = "<group>"; 119 + }; 120 + 33CC10E42044A3C60003C045 = { 121 + isa = PBXGroup; 122 + children = ( 123 + 33FAB671232836740065AC1E /* Runner */, 124 + 33CEB47122A05771004F2AC0 /* Flutter */, 125 + 331C80D6294CF71000263BE5 /* RunnerTests */, 126 + 33CC10EE2044A3C60003C045 /* Products */, 127 + D73912EC22F37F3D000D13A0 /* Frameworks */, 128 + ); 129 + sourceTree = "<group>"; 130 + }; 131 + 33CC10EE2044A3C60003C045 /* Products */ = { 132 + isa = PBXGroup; 133 + children = ( 134 + 33CC10ED2044A3C60003C045 /* pudge.app */, 135 + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, 136 + ); 137 + name = Products; 138 + sourceTree = "<group>"; 139 + }; 140 + 33CC11242044D66E0003C045 /* Resources */ = { 141 + isa = PBXGroup; 142 + children = ( 143 + 33CC10F22044A3C60003C045 /* Assets.xcassets */, 144 + 33CC10F42044A3C60003C045 /* MainMenu.xib */, 145 + 33CC10F72044A3C60003C045 /* Info.plist */, 146 + ); 147 + name = Resources; 148 + path = ..; 149 + sourceTree = "<group>"; 150 + }; 151 + 33CEB47122A05771004F2AC0 /* Flutter */ = { 152 + isa = PBXGroup; 153 + children = ( 154 + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 155 + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 156 + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, 157 + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, 158 + ); 159 + path = Flutter; 160 + sourceTree = "<group>"; 161 + }; 162 + 33FAB671232836740065AC1E /* Runner */ = { 163 + isa = PBXGroup; 164 + children = ( 165 + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, 166 + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, 167 + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, 168 + 33E51914231749380026EE4D /* Release.entitlements */, 169 + 33CC11242044D66E0003C045 /* Resources */, 170 + 33BA886A226E78AF003329D5 /* Configs */, 171 + ); 172 + path = Runner; 173 + sourceTree = "<group>"; 174 + }; 175 + D73912EC22F37F3D000D13A0 /* Frameworks */ = { 176 + isa = PBXGroup; 177 + children = ( 178 + ); 179 + name = Frameworks; 180 + sourceTree = "<group>"; 181 + }; 182 + /* End PBXGroup section */ 183 + 184 + /* Begin PBXNativeTarget section */ 185 + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { 186 + isa = PBXNativeTarget; 187 + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; 188 + buildPhases = ( 189 + 331C80D1294CF70F00263BE5 /* Sources */, 190 + 331C80D2294CF70F00263BE5 /* Frameworks */, 191 + 331C80D3294CF70F00263BE5 /* Resources */, 192 + ); 193 + buildRules = ( 194 + ); 195 + dependencies = ( 196 + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, 197 + ); 198 + name = RunnerTests; 199 + productName = RunnerTests; 200 + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; 201 + productType = "com.apple.product-type.bundle.unit-test"; 202 + }; 203 + 33CC10EC2044A3C60003C045 /* Runner */ = { 204 + isa = PBXNativeTarget; 205 + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; 206 + buildPhases = ( 207 + 33CC10E92044A3C60003C045 /* Sources */, 208 + 33CC10EA2044A3C60003C045 /* Frameworks */, 209 + 33CC10EB2044A3C60003C045 /* Resources */, 210 + 33CC110E2044A8840003C045 /* Bundle Framework */, 211 + 3399D490228B24CF009A79C7 /* ShellScript */, 212 + ); 213 + buildRules = ( 214 + ); 215 + dependencies = ( 216 + 33CC11202044C79F0003C045 /* PBXTargetDependency */, 217 + ); 218 + name = Runner; 219 + productName = Runner; 220 + productReference = 33CC10ED2044A3C60003C045 /* pudge.app */; 221 + productType = "com.apple.product-type.application"; 222 + }; 223 + /* End PBXNativeTarget section */ 224 + 225 + /* Begin PBXProject section */ 226 + 33CC10E52044A3C60003C045 /* Project object */ = { 227 + isa = PBXProject; 228 + attributes = { 229 + BuildIndependentTargetsInParallel = YES; 230 + LastSwiftUpdateCheck = 0920; 231 + LastUpgradeCheck = 1510; 232 + ORGANIZATIONNAME = ""; 233 + TargetAttributes = { 234 + 331C80D4294CF70F00263BE5 = { 235 + CreatedOnToolsVersion = 14.0; 236 + TestTargetID = 33CC10EC2044A3C60003C045; 237 + }; 238 + 33CC10EC2044A3C60003C045 = { 239 + CreatedOnToolsVersion = 9.2; 240 + LastSwiftMigration = 1100; 241 + ProvisioningStyle = Automatic; 242 + SystemCapabilities = { 243 + com.apple.Sandbox = { 244 + enabled = 1; 245 + }; 246 + }; 247 + }; 248 + 33CC111A2044C6BA0003C045 = { 249 + CreatedOnToolsVersion = 9.2; 250 + ProvisioningStyle = Manual; 251 + }; 252 + }; 253 + }; 254 + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; 255 + compatibilityVersion = "Xcode 9.3"; 256 + developmentRegion = en; 257 + hasScannedForEncodings = 0; 258 + knownRegions = ( 259 + en, 260 + Base, 261 + ); 262 + mainGroup = 33CC10E42044A3C60003C045; 263 + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; 264 + projectDirPath = ""; 265 + projectRoot = ""; 266 + targets = ( 267 + 33CC10EC2044A3C60003C045 /* Runner */, 268 + 331C80D4294CF70F00263BE5 /* RunnerTests */, 269 + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, 270 + ); 271 + }; 272 + /* End PBXProject section */ 273 + 274 + /* Begin PBXResourcesBuildPhase section */ 275 + 331C80D3294CF70F00263BE5 /* Resources */ = { 276 + isa = PBXResourcesBuildPhase; 277 + buildActionMask = 2147483647; 278 + files = ( 279 + ); 280 + runOnlyForDeploymentPostprocessing = 0; 281 + }; 282 + 33CC10EB2044A3C60003C045 /* Resources */ = { 283 + isa = PBXResourcesBuildPhase; 284 + buildActionMask = 2147483647; 285 + files = ( 286 + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 287 + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, 288 + ); 289 + runOnlyForDeploymentPostprocessing = 0; 290 + }; 291 + /* End PBXResourcesBuildPhase section */ 292 + 293 + /* Begin PBXShellScriptBuildPhase section */ 294 + 3399D490228B24CF009A79C7 /* ShellScript */ = { 295 + isa = PBXShellScriptBuildPhase; 296 + alwaysOutOfDate = 1; 297 + buildActionMask = 2147483647; 298 + files = ( 299 + ); 300 + inputFileListPaths = ( 301 + ); 302 + inputPaths = ( 303 + ); 304 + outputFileListPaths = ( 305 + ); 306 + outputPaths = ( 307 + ); 308 + runOnlyForDeploymentPostprocessing = 0; 309 + shellPath = /bin/sh; 310 + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; 311 + }; 312 + 33CC111E2044C6BF0003C045 /* ShellScript */ = { 313 + isa = PBXShellScriptBuildPhase; 314 + buildActionMask = 2147483647; 315 + files = ( 316 + ); 317 + inputFileListPaths = ( 318 + Flutter/ephemeral/FlutterInputs.xcfilelist, 319 + ); 320 + inputPaths = ( 321 + Flutter/ephemeral/tripwire, 322 + ); 323 + outputFileListPaths = ( 324 + Flutter/ephemeral/FlutterOutputs.xcfilelist, 325 + ); 326 + outputPaths = ( 327 + ); 328 + runOnlyForDeploymentPostprocessing = 0; 329 + shellPath = /bin/sh; 330 + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; 331 + }; 332 + /* End PBXShellScriptBuildPhase section */ 333 + 334 + /* Begin PBXSourcesBuildPhase section */ 335 + 331C80D1294CF70F00263BE5 /* Sources */ = { 336 + isa = PBXSourcesBuildPhase; 337 + buildActionMask = 2147483647; 338 + files = ( 339 + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, 340 + ); 341 + runOnlyForDeploymentPostprocessing = 0; 342 + }; 343 + 33CC10E92044A3C60003C045 /* Sources */ = { 344 + isa = PBXSourcesBuildPhase; 345 + buildActionMask = 2147483647; 346 + files = ( 347 + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, 348 + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, 349 + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, 350 + ); 351 + runOnlyForDeploymentPostprocessing = 0; 352 + }; 353 + /* End PBXSourcesBuildPhase section */ 354 + 355 + /* Begin PBXTargetDependency section */ 356 + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { 357 + isa = PBXTargetDependency; 358 + target = 33CC10EC2044A3C60003C045 /* Runner */; 359 + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; 360 + }; 361 + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { 362 + isa = PBXTargetDependency; 363 + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; 364 + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; 365 + }; 366 + /* End PBXTargetDependency section */ 367 + 368 + /* Begin PBXVariantGroup section */ 369 + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { 370 + isa = PBXVariantGroup; 371 + children = ( 372 + 33CC10F52044A3C60003C045 /* Base */, 373 + ); 374 + name = MainMenu.xib; 375 + path = Runner; 376 + sourceTree = "<group>"; 377 + }; 378 + /* End PBXVariantGroup section */ 379 + 380 + /* Begin XCBuildConfiguration section */ 381 + 331C80DB294CF71000263BE5 /* Debug */ = { 382 + isa = XCBuildConfiguration; 383 + buildSettings = { 384 + BUNDLE_LOADER = "$(TEST_HOST)"; 385 + CURRENT_PROJECT_VERSION = 1; 386 + GENERATE_INFOPLIST_FILE = YES; 387 + MARKETING_VERSION = 1.0; 388 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge.RunnerTests; 389 + PRODUCT_NAME = "$(TARGET_NAME)"; 390 + SWIFT_VERSION = 5.0; 391 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pudge.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/pudge"; 392 + }; 393 + name = Debug; 394 + }; 395 + 331C80DC294CF71000263BE5 /* Release */ = { 396 + isa = XCBuildConfiguration; 397 + buildSettings = { 398 + BUNDLE_LOADER = "$(TEST_HOST)"; 399 + CURRENT_PROJECT_VERSION = 1; 400 + GENERATE_INFOPLIST_FILE = YES; 401 + MARKETING_VERSION = 1.0; 402 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge.RunnerTests; 403 + PRODUCT_NAME = "$(TARGET_NAME)"; 404 + SWIFT_VERSION = 5.0; 405 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pudge.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/pudge"; 406 + }; 407 + name = Release; 408 + }; 409 + 331C80DD294CF71000263BE5 /* Profile */ = { 410 + isa = XCBuildConfiguration; 411 + buildSettings = { 412 + BUNDLE_LOADER = "$(TEST_HOST)"; 413 + CURRENT_PROJECT_VERSION = 1; 414 + GENERATE_INFOPLIST_FILE = YES; 415 + MARKETING_VERSION = 1.0; 416 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge.RunnerTests; 417 + PRODUCT_NAME = "$(TARGET_NAME)"; 418 + SWIFT_VERSION = 5.0; 419 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pudge.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/pudge"; 420 + }; 421 + name = Profile; 422 + }; 423 + 338D0CE9231458BD00FA5F75 /* Profile */ = { 424 + isa = XCBuildConfiguration; 425 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 426 + buildSettings = { 427 + ALWAYS_SEARCH_USER_PATHS = NO; 428 + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 429 + CLANG_ANALYZER_NONNULL = YES; 430 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 431 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 432 + CLANG_CXX_LIBRARY = "libc++"; 433 + CLANG_ENABLE_MODULES = YES; 434 + CLANG_ENABLE_OBJC_ARC = YES; 435 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 436 + CLANG_WARN_BOOL_CONVERSION = YES; 437 + CLANG_WARN_CONSTANT_CONVERSION = YES; 438 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 439 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 440 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 441 + CLANG_WARN_EMPTY_BODY = YES; 442 + CLANG_WARN_ENUM_CONVERSION = YES; 443 + CLANG_WARN_INFINITE_RECURSION = YES; 444 + CLANG_WARN_INT_CONVERSION = YES; 445 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 446 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 447 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 448 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 449 + CLANG_WARN_SUSPICIOUS_MOVE = YES; 450 + CODE_SIGN_IDENTITY = "-"; 451 + COPY_PHASE_STRIP = NO; 452 + DEAD_CODE_STRIPPING = YES; 453 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 454 + ENABLE_NS_ASSERTIONS = NO; 455 + ENABLE_STRICT_OBJC_MSGSEND = YES; 456 + ENABLE_USER_SCRIPT_SANDBOXING = NO; 457 + GCC_C_LANGUAGE_STANDARD = gnu11; 458 + GCC_NO_COMMON_BLOCKS = YES; 459 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 460 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 461 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 462 + GCC_WARN_UNUSED_FUNCTION = YES; 463 + GCC_WARN_UNUSED_VARIABLE = YES; 464 + MACOSX_DEPLOYMENT_TARGET = 10.15; 465 + MTL_ENABLE_DEBUG_INFO = NO; 466 + SDKROOT = macosx; 467 + SWIFT_COMPILATION_MODE = wholemodule; 468 + SWIFT_OPTIMIZATION_LEVEL = "-O"; 469 + }; 470 + name = Profile; 471 + }; 472 + 338D0CEA231458BD00FA5F75 /* Profile */ = { 473 + isa = XCBuildConfiguration; 474 + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 475 + buildSettings = { 476 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 477 + CLANG_ENABLE_MODULES = YES; 478 + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 479 + CODE_SIGN_STYLE = Automatic; 480 + COMBINE_HIDPI_IMAGES = YES; 481 + INFOPLIST_FILE = Runner/Info.plist; 482 + LD_RUNPATH_SEARCH_PATHS = ( 483 + "$(inherited)", 484 + "@executable_path/../Frameworks", 485 + ); 486 + PROVISIONING_PROFILE_SPECIFIER = ""; 487 + SWIFT_VERSION = 5.0; 488 + }; 489 + name = Profile; 490 + }; 491 + 338D0CEB231458BD00FA5F75 /* Profile */ = { 492 + isa = XCBuildConfiguration; 493 + buildSettings = { 494 + CODE_SIGN_STYLE = Manual; 495 + PRODUCT_NAME = "$(TARGET_NAME)"; 496 + }; 497 + name = Profile; 498 + }; 499 + 33CC10F92044A3C60003C045 /* Debug */ = { 500 + isa = XCBuildConfiguration; 501 + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 502 + buildSettings = { 503 + ALWAYS_SEARCH_USER_PATHS = NO; 504 + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 505 + CLANG_ANALYZER_NONNULL = YES; 506 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 507 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 508 + CLANG_CXX_LIBRARY = "libc++"; 509 + CLANG_ENABLE_MODULES = YES; 510 + CLANG_ENABLE_OBJC_ARC = YES; 511 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 512 + CLANG_WARN_BOOL_CONVERSION = YES; 513 + CLANG_WARN_CONSTANT_CONVERSION = YES; 514 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 515 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 516 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 517 + CLANG_WARN_EMPTY_BODY = YES; 518 + CLANG_WARN_ENUM_CONVERSION = YES; 519 + CLANG_WARN_INFINITE_RECURSION = YES; 520 + CLANG_WARN_INT_CONVERSION = YES; 521 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 522 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 523 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 524 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 525 + CLANG_WARN_SUSPICIOUS_MOVE = YES; 526 + CODE_SIGN_IDENTITY = "-"; 527 + COPY_PHASE_STRIP = NO; 528 + DEAD_CODE_STRIPPING = YES; 529 + DEBUG_INFORMATION_FORMAT = dwarf; 530 + ENABLE_STRICT_OBJC_MSGSEND = YES; 531 + ENABLE_TESTABILITY = YES; 532 + ENABLE_USER_SCRIPT_SANDBOXING = NO; 533 + GCC_C_LANGUAGE_STANDARD = gnu11; 534 + GCC_DYNAMIC_NO_PIC = NO; 535 + GCC_NO_COMMON_BLOCKS = YES; 536 + GCC_OPTIMIZATION_LEVEL = 0; 537 + GCC_PREPROCESSOR_DEFINITIONS = ( 538 + "DEBUG=1", 539 + "$(inherited)", 540 + ); 541 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 542 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 543 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 544 + GCC_WARN_UNUSED_FUNCTION = YES; 545 + GCC_WARN_UNUSED_VARIABLE = YES; 546 + MACOSX_DEPLOYMENT_TARGET = 10.15; 547 + MTL_ENABLE_DEBUG_INFO = YES; 548 + ONLY_ACTIVE_ARCH = YES; 549 + SDKROOT = macosx; 550 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 551 + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 552 + }; 553 + name = Debug; 554 + }; 555 + 33CC10FA2044A3C60003C045 /* Release */ = { 556 + isa = XCBuildConfiguration; 557 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 558 + buildSettings = { 559 + ALWAYS_SEARCH_USER_PATHS = NO; 560 + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 561 + CLANG_ANALYZER_NONNULL = YES; 562 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 563 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 564 + CLANG_CXX_LIBRARY = "libc++"; 565 + CLANG_ENABLE_MODULES = YES; 566 + CLANG_ENABLE_OBJC_ARC = YES; 567 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 568 + CLANG_WARN_BOOL_CONVERSION = YES; 569 + CLANG_WARN_CONSTANT_CONVERSION = YES; 570 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 571 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 572 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 573 + CLANG_WARN_EMPTY_BODY = YES; 574 + CLANG_WARN_ENUM_CONVERSION = YES; 575 + CLANG_WARN_INFINITE_RECURSION = YES; 576 + CLANG_WARN_INT_CONVERSION = YES; 577 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 578 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 579 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 580 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 581 + CLANG_WARN_SUSPICIOUS_MOVE = YES; 582 + CODE_SIGN_IDENTITY = "-"; 583 + COPY_PHASE_STRIP = NO; 584 + DEAD_CODE_STRIPPING = YES; 585 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 586 + ENABLE_NS_ASSERTIONS = NO; 587 + ENABLE_STRICT_OBJC_MSGSEND = YES; 588 + ENABLE_USER_SCRIPT_SANDBOXING = NO; 589 + GCC_C_LANGUAGE_STANDARD = gnu11; 590 + GCC_NO_COMMON_BLOCKS = YES; 591 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 592 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 593 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 594 + GCC_WARN_UNUSED_FUNCTION = YES; 595 + GCC_WARN_UNUSED_VARIABLE = YES; 596 + MACOSX_DEPLOYMENT_TARGET = 10.15; 597 + MTL_ENABLE_DEBUG_INFO = NO; 598 + SDKROOT = macosx; 599 + SWIFT_COMPILATION_MODE = wholemodule; 600 + SWIFT_OPTIMIZATION_LEVEL = "-O"; 601 + }; 602 + name = Release; 603 + }; 604 + 33CC10FC2044A3C60003C045 /* Debug */ = { 605 + isa = XCBuildConfiguration; 606 + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 607 + buildSettings = { 608 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 609 + CLANG_ENABLE_MODULES = YES; 610 + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 611 + CODE_SIGN_STYLE = Automatic; 612 + COMBINE_HIDPI_IMAGES = YES; 613 + INFOPLIST_FILE = Runner/Info.plist; 614 + LD_RUNPATH_SEARCH_PATHS = ( 615 + "$(inherited)", 616 + "@executable_path/../Frameworks", 617 + ); 618 + PROVISIONING_PROFILE_SPECIFIER = ""; 619 + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 620 + SWIFT_VERSION = 5.0; 621 + }; 622 + name = Debug; 623 + }; 624 + 33CC10FD2044A3C60003C045 /* Release */ = { 625 + isa = XCBuildConfiguration; 626 + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 627 + buildSettings = { 628 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 629 + CLANG_ENABLE_MODULES = YES; 630 + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; 631 + CODE_SIGN_STYLE = Automatic; 632 + COMBINE_HIDPI_IMAGES = YES; 633 + INFOPLIST_FILE = Runner/Info.plist; 634 + LD_RUNPATH_SEARCH_PATHS = ( 635 + "$(inherited)", 636 + "@executable_path/../Frameworks", 637 + ); 638 + PROVISIONING_PROFILE_SPECIFIER = ""; 639 + SWIFT_VERSION = 5.0; 640 + }; 641 + name = Release; 642 + }; 643 + 33CC111C2044C6BA0003C045 /* Debug */ = { 644 + isa = XCBuildConfiguration; 645 + buildSettings = { 646 + CODE_SIGN_STYLE = Manual; 647 + PRODUCT_NAME = "$(TARGET_NAME)"; 648 + }; 649 + name = Debug; 650 + }; 651 + 33CC111D2044C6BA0003C045 /* Release */ = { 652 + isa = XCBuildConfiguration; 653 + buildSettings = { 654 + CODE_SIGN_STYLE = Automatic; 655 + PRODUCT_NAME = "$(TARGET_NAME)"; 656 + }; 657 + name = Release; 658 + }; 659 + /* End XCBuildConfiguration section */ 660 + 661 + /* Begin XCConfigurationList section */ 662 + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { 663 + isa = XCConfigurationList; 664 + buildConfigurations = ( 665 + 331C80DB294CF71000263BE5 /* Debug */, 666 + 331C80DC294CF71000263BE5 /* Release */, 667 + 331C80DD294CF71000263BE5 /* Profile */, 668 + ); 669 + defaultConfigurationIsVisible = 0; 670 + defaultConfigurationName = Release; 671 + }; 672 + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { 673 + isa = XCConfigurationList; 674 + buildConfigurations = ( 675 + 33CC10F92044A3C60003C045 /* Debug */, 676 + 33CC10FA2044A3C60003C045 /* Release */, 677 + 338D0CE9231458BD00FA5F75 /* Profile */, 678 + ); 679 + defaultConfigurationIsVisible = 0; 680 + defaultConfigurationName = Release; 681 + }; 682 + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { 683 + isa = XCConfigurationList; 684 + buildConfigurations = ( 685 + 33CC10FC2044A3C60003C045 /* Debug */, 686 + 33CC10FD2044A3C60003C045 /* Release */, 687 + 338D0CEA231458BD00FA5F75 /* Profile */, 688 + ); 689 + defaultConfigurationIsVisible = 0; 690 + defaultConfigurationName = Release; 691 + }; 692 + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { 693 + isa = XCConfigurationList; 694 + buildConfigurations = ( 695 + 33CC111C2044C6BA0003C045 /* Debug */, 696 + 33CC111D2044C6BA0003C045 /* Release */, 697 + 338D0CEB231458BD00FA5F75 /* Profile */, 698 + ); 699 + defaultConfigurationIsVisible = 0; 700 + defaultConfigurationName = Release; 701 + }; 702 + /* End XCConfigurationList section */ 703 + }; 704 + rootObject = 33CC10E52044A3C60003C045 /* Project object */; 705 + }
+8
macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>IDEDidComputeMac32BitWarning</key> 6 + <true/> 7 + </dict> 8 + </plist>
+99
macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <Scheme 3 + LastUpgradeVersion = "1510" 4 + version = "1.3"> 5 + <BuildAction 6 + parallelizeBuildables = "YES" 7 + buildImplicitDependencies = "YES"> 8 + <BuildActionEntries> 9 + <BuildActionEntry 10 + buildForTesting = "YES" 11 + buildForRunning = "YES" 12 + buildForProfiling = "YES" 13 + buildForArchiving = "YES" 14 + buildForAnalyzing = "YES"> 15 + <BuildableReference 16 + BuildableIdentifier = "primary" 17 + BlueprintIdentifier = "33CC10EC2044A3C60003C045" 18 + BuildableName = "pudge.app" 19 + BlueprintName = "Runner" 20 + ReferencedContainer = "container:Runner.xcodeproj"> 21 + </BuildableReference> 22 + </BuildActionEntry> 23 + </BuildActionEntries> 24 + </BuildAction> 25 + <TestAction 26 + buildConfiguration = "Debug" 27 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 28 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 29 + shouldUseLaunchSchemeArgsEnv = "YES"> 30 + <MacroExpansion> 31 + <BuildableReference 32 + BuildableIdentifier = "primary" 33 + BlueprintIdentifier = "33CC10EC2044A3C60003C045" 34 + BuildableName = "pudge.app" 35 + BlueprintName = "Runner" 36 + ReferencedContainer = "container:Runner.xcodeproj"> 37 + </BuildableReference> 38 + </MacroExpansion> 39 + <Testables> 40 + <TestableReference 41 + skipped = "NO" 42 + parallelizable = "YES"> 43 + <BuildableReference 44 + BuildableIdentifier = "primary" 45 + BlueprintIdentifier = "331C80D4294CF70F00263BE5" 46 + BuildableName = "RunnerTests.xctest" 47 + BlueprintName = "RunnerTests" 48 + ReferencedContainer = "container:Runner.xcodeproj"> 49 + </BuildableReference> 50 + </TestableReference> 51 + </Testables> 52 + </TestAction> 53 + <LaunchAction 54 + buildConfiguration = "Debug" 55 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 56 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 57 + launchStyle = "0" 58 + useCustomWorkingDirectory = "NO" 59 + ignoresPersistentStateOnLaunch = "NO" 60 + debugDocumentVersioning = "YES" 61 + debugServiceExtension = "internal" 62 + enableGPUValidationMode = "1" 63 + allowLocationSimulation = "YES"> 64 + <BuildableProductRunnable 65 + runnableDebuggingMode = "0"> 66 + <BuildableReference 67 + BuildableIdentifier = "primary" 68 + BlueprintIdentifier = "33CC10EC2044A3C60003C045" 69 + BuildableName = "pudge.app" 70 + BlueprintName = "Runner" 71 + ReferencedContainer = "container:Runner.xcodeproj"> 72 + </BuildableReference> 73 + </BuildableProductRunnable> 74 + </LaunchAction> 75 + <ProfileAction 76 + buildConfiguration = "Profile" 77 + shouldUseLaunchSchemeArgsEnv = "YES" 78 + savedToolIdentifier = "" 79 + useCustomWorkingDirectory = "NO" 80 + debugDocumentVersioning = "YES"> 81 + <BuildableProductRunnable 82 + runnableDebuggingMode = "0"> 83 + <BuildableReference 84 + BuildableIdentifier = "primary" 85 + BlueprintIdentifier = "33CC10EC2044A3C60003C045" 86 + BuildableName = "pudge.app" 87 + BlueprintName = "Runner" 88 + ReferencedContainer = "container:Runner.xcodeproj"> 89 + </BuildableReference> 90 + </BuildableProductRunnable> 91 + </ProfileAction> 92 + <AnalyzeAction 93 + buildConfiguration = "Debug"> 94 + </AnalyzeAction> 95 + <ArchiveAction 96 + buildConfiguration = "Release" 97 + revealArchiveInOrganizer = "YES"> 98 + </ArchiveAction> 99 + </Scheme>
+7
macos/Runner.xcworkspace/contents.xcworkspacedata
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <Workspace 3 + version = "1.0"> 4 + <FileRef 5 + location = "group:Runner.xcodeproj"> 6 + </FileRef> 7 + </Workspace>
+8
macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>IDEDidComputeMac32BitWarning</key> 6 + <true/> 7 + </dict> 8 + </plist>
+13
macos/Runner/AppDelegate.swift
··· 1 + import Cocoa 2 + import FlutterMacOS 3 + 4 + @main 5 + class AppDelegate: FlutterAppDelegate { 6 + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 + return true 8 + } 9 + 10 + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { 11 + return true 12 + } 13 + }
+68
macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
··· 1 + { 2 + "images" : [ 3 + { 4 + "size" : "16x16", 5 + "idiom" : "mac", 6 + "filename" : "app_icon_16.png", 7 + "scale" : "1x" 8 + }, 9 + { 10 + "size" : "16x16", 11 + "idiom" : "mac", 12 + "filename" : "app_icon_32.png", 13 + "scale" : "2x" 14 + }, 15 + { 16 + "size" : "32x32", 17 + "idiom" : "mac", 18 + "filename" : "app_icon_32.png", 19 + "scale" : "1x" 20 + }, 21 + { 22 + "size" : "32x32", 23 + "idiom" : "mac", 24 + "filename" : "app_icon_64.png", 25 + "scale" : "2x" 26 + }, 27 + { 28 + "size" : "128x128", 29 + "idiom" : "mac", 30 + "filename" : "app_icon_128.png", 31 + "scale" : "1x" 32 + }, 33 + { 34 + "size" : "128x128", 35 + "idiom" : "mac", 36 + "filename" : "app_icon_256.png", 37 + "scale" : "2x" 38 + }, 39 + { 40 + "size" : "256x256", 41 + "idiom" : "mac", 42 + "filename" : "app_icon_256.png", 43 + "scale" : "1x" 44 + }, 45 + { 46 + "size" : "256x256", 47 + "idiom" : "mac", 48 + "filename" : "app_icon_512.png", 49 + "scale" : "2x" 50 + }, 51 + { 52 + "size" : "512x512", 53 + "idiom" : "mac", 54 + "filename" : "app_icon_512.png", 55 + "scale" : "1x" 56 + }, 57 + { 58 + "size" : "512x512", 59 + "idiom" : "mac", 60 + "filename" : "app_icon_1024.png", 61 + "scale" : "2x" 62 + } 63 + ], 64 + "info" : { 65 + "version" : 1, 66 + "author" : "xcode" 67 + } 68 + }
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png

This is a binary file and will not be displayed.

macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png

This is a binary file and will not be displayed.

macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png

This is a binary file and will not be displayed.

macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png

This is a binary file and will not be displayed.

macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png

This is a binary file and will not be displayed.

macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png

This is a binary file and will not be displayed.

macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png

This is a binary file and will not be displayed.

+343
macos/Runner/Base.lproj/MainMenu.xib
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> 3 + <dependencies> 4 + <deployment identifier="macosx"/> 5 + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/> 6 + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 7 + </dependencies> 8 + <objects> 9 + <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> 10 + <connections> 11 + <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/> 12 + </connections> 13 + </customObject> 14 + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> 15 + <customObject id="-3" userLabel="Application" customClass="NSObject"/> 16 + <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target"> 17 + <connections> 18 + <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/> 19 + <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/> 20 + </connections> 21 + </customObject> 22 + <customObject id="YLy-65-1bz" customClass="NSFontManager"/> 23 + <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6"> 24 + <items> 25 + <menuItem title="APP_NAME" id="1Xt-HY-uBw"> 26 + <modifierMask key="keyEquivalentModifierMask"/> 27 + <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr"> 28 + <items> 29 + <menuItem title="About APP_NAME" id="5kV-Vb-QxS"> 30 + <modifierMask key="keyEquivalentModifierMask"/> 31 + <connections> 32 + <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/> 33 + </connections> 34 + </menuItem> 35 + <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/> 36 + <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/> 37 + <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/> 38 + <menuItem title="Services" id="NMo-om-nkz"> 39 + <modifierMask key="keyEquivalentModifierMask"/> 40 + <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/> 41 + </menuItem> 42 + <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/> 43 + <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN"> 44 + <connections> 45 + <action selector="hide:" target="-1" id="PnN-Uc-m68"/> 46 + </connections> 47 + </menuItem> 48 + <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO"> 49 + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> 50 + <connections> 51 + <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/> 52 + </connections> 53 + </menuItem> 54 + <menuItem title="Show All" id="Kd2-mp-pUS"> 55 + <modifierMask key="keyEquivalentModifierMask"/> 56 + <connections> 57 + <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/> 58 + </connections> 59 + </menuItem> 60 + <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/> 61 + <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi"> 62 + <connections> 63 + <action selector="terminate:" target="-1" id="Te7-pn-YzF"/> 64 + </connections> 65 + </menuItem> 66 + </items> 67 + </menu> 68 + </menuItem> 69 + <menuItem title="Edit" id="5QF-Oa-p0T"> 70 + <modifierMask key="keyEquivalentModifierMask"/> 71 + <menu key="submenu" title="Edit" id="W48-6f-4Dl"> 72 + <items> 73 + <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg"> 74 + <connections> 75 + <action selector="undo:" target="-1" id="M6e-cu-g7V"/> 76 + </connections> 77 + </menuItem> 78 + <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam"> 79 + <connections> 80 + <action selector="redo:" target="-1" id="oIA-Rs-6OD"/> 81 + </connections> 82 + </menuItem> 83 + <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/> 84 + <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG"> 85 + <connections> 86 + <action selector="cut:" target="-1" id="YJe-68-I9s"/> 87 + </connections> 88 + </menuItem> 89 + <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU"> 90 + <connections> 91 + <action selector="copy:" target="-1" id="G1f-GL-Joy"/> 92 + </connections> 93 + </menuItem> 94 + <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL"> 95 + <connections> 96 + <action selector="paste:" target="-1" id="UvS-8e-Qdg"/> 97 + </connections> 98 + </menuItem> 99 + <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk"> 100 + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> 101 + <connections> 102 + <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/> 103 + </connections> 104 + </menuItem> 105 + <menuItem title="Delete" id="pa3-QI-u2k"> 106 + <modifierMask key="keyEquivalentModifierMask"/> 107 + <connections> 108 + <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/> 109 + </connections> 110 + </menuItem> 111 + <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m"> 112 + <connections> 113 + <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/> 114 + </connections> 115 + </menuItem> 116 + <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/> 117 + <menuItem title="Find" id="4EN-yA-p0u"> 118 + <modifierMask key="keyEquivalentModifierMask"/> 119 + <menu key="submenu" title="Find" id="1b7-l0-nxx"> 120 + <items> 121 + <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W"> 122 + <connections> 123 + <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/> 124 + </connections> 125 + </menuItem> 126 + <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz"> 127 + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> 128 + <connections> 129 + <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/> 130 + </connections> 131 + </menuItem> 132 + <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye"> 133 + <connections> 134 + <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/> 135 + </connections> 136 + </menuItem> 137 + <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV"> 138 + <connections> 139 + <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/> 140 + </connections> 141 + </menuItem> 142 + <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt"> 143 + <connections> 144 + <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/> 145 + </connections> 146 + </menuItem> 147 + <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd"> 148 + <connections> 149 + <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/> 150 + </connections> 151 + </menuItem> 152 + </items> 153 + </menu> 154 + </menuItem> 155 + <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7"> 156 + <modifierMask key="keyEquivalentModifierMask"/> 157 + <menu key="submenu" title="Spelling" id="3IN-sU-3Bg"> 158 + <items> 159 + <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI"> 160 + <connections> 161 + <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/> 162 + </connections> 163 + </menuItem> 164 + <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7"> 165 + <connections> 166 + <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/> 167 + </connections> 168 + </menuItem> 169 + <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/> 170 + <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN"> 171 + <modifierMask key="keyEquivalentModifierMask"/> 172 + <connections> 173 + <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/> 174 + </connections> 175 + </menuItem> 176 + <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG"> 177 + <modifierMask key="keyEquivalentModifierMask"/> 178 + <connections> 179 + <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/> 180 + </connections> 181 + </menuItem> 182 + <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v"> 183 + <modifierMask key="keyEquivalentModifierMask"/> 184 + <connections> 185 + <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/> 186 + </connections> 187 + </menuItem> 188 + </items> 189 + </menu> 190 + </menuItem> 191 + <menuItem title="Substitutions" id="9ic-FL-obx"> 192 + <modifierMask key="keyEquivalentModifierMask"/> 193 + <menu key="submenu" title="Substitutions" id="FeM-D8-WVr"> 194 + <items> 195 + <menuItem title="Show Substitutions" id="z6F-FW-3nz"> 196 + <modifierMask key="keyEquivalentModifierMask"/> 197 + <connections> 198 + <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/> 199 + </connections> 200 + </menuItem> 201 + <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/> 202 + <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM"> 203 + <modifierMask key="keyEquivalentModifierMask"/> 204 + <connections> 205 + <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/> 206 + </connections> 207 + </menuItem> 208 + <menuItem title="Smart Quotes" id="hQb-2v-fYv"> 209 + <modifierMask key="keyEquivalentModifierMask"/> 210 + <connections> 211 + <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/> 212 + </connections> 213 + </menuItem> 214 + <menuItem title="Smart Dashes" id="rgM-f4-ycn"> 215 + <modifierMask key="keyEquivalentModifierMask"/> 216 + <connections> 217 + <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/> 218 + </connections> 219 + </menuItem> 220 + <menuItem title="Smart Links" id="cwL-P1-jid"> 221 + <modifierMask key="keyEquivalentModifierMask"/> 222 + <connections> 223 + <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/> 224 + </connections> 225 + </menuItem> 226 + <menuItem title="Data Detectors" id="tRr-pd-1PS"> 227 + <modifierMask key="keyEquivalentModifierMask"/> 228 + <connections> 229 + <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/> 230 + </connections> 231 + </menuItem> 232 + <menuItem title="Text Replacement" id="HFQ-gK-NFA"> 233 + <modifierMask key="keyEquivalentModifierMask"/> 234 + <connections> 235 + <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/> 236 + </connections> 237 + </menuItem> 238 + </items> 239 + </menu> 240 + </menuItem> 241 + <menuItem title="Transformations" id="2oI-Rn-ZJC"> 242 + <modifierMask key="keyEquivalentModifierMask"/> 243 + <menu key="submenu" title="Transformations" id="c8a-y6-VQd"> 244 + <items> 245 + <menuItem title="Make Upper Case" id="vmV-6d-7jI"> 246 + <modifierMask key="keyEquivalentModifierMask"/> 247 + <connections> 248 + <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/> 249 + </connections> 250 + </menuItem> 251 + <menuItem title="Make Lower Case" id="d9M-CD-aMd"> 252 + <modifierMask key="keyEquivalentModifierMask"/> 253 + <connections> 254 + <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/> 255 + </connections> 256 + </menuItem> 257 + <menuItem title="Capitalize" id="UEZ-Bs-lqG"> 258 + <modifierMask key="keyEquivalentModifierMask"/> 259 + <connections> 260 + <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/> 261 + </connections> 262 + </menuItem> 263 + </items> 264 + </menu> 265 + </menuItem> 266 + <menuItem title="Speech" id="xrE-MZ-jX0"> 267 + <modifierMask key="keyEquivalentModifierMask"/> 268 + <menu key="submenu" title="Speech" id="3rS-ZA-NoH"> 269 + <items> 270 + <menuItem title="Start Speaking" id="Ynk-f8-cLZ"> 271 + <modifierMask key="keyEquivalentModifierMask"/> 272 + <connections> 273 + <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/> 274 + </connections> 275 + </menuItem> 276 + <menuItem title="Stop Speaking" id="Oyz-dy-DGm"> 277 + <modifierMask key="keyEquivalentModifierMask"/> 278 + <connections> 279 + <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/> 280 + </connections> 281 + </menuItem> 282 + </items> 283 + </menu> 284 + </menuItem> 285 + </items> 286 + </menu> 287 + </menuItem> 288 + <menuItem title="View" id="H8h-7b-M4v"> 289 + <modifierMask key="keyEquivalentModifierMask"/> 290 + <menu key="submenu" title="View" id="HyV-fh-RgO"> 291 + <items> 292 + <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa"> 293 + <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> 294 + <connections> 295 + <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/> 296 + </connections> 297 + </menuItem> 298 + </items> 299 + </menu> 300 + </menuItem> 301 + <menuItem title="Window" id="aUF-d1-5bR"> 302 + <modifierMask key="keyEquivalentModifierMask"/> 303 + <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo"> 304 + <items> 305 + <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV"> 306 + <connections> 307 + <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/> 308 + </connections> 309 + </menuItem> 310 + <menuItem title="Zoom" id="R4o-n2-Eq4"> 311 + <modifierMask key="keyEquivalentModifierMask"/> 312 + <connections> 313 + <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/> 314 + </connections> 315 + </menuItem> 316 + <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/> 317 + <menuItem title="Bring All to Front" id="LE2-aR-0XJ"> 318 + <modifierMask key="keyEquivalentModifierMask"/> 319 + <connections> 320 + <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/> 321 + </connections> 322 + </menuItem> 323 + </items> 324 + </menu> 325 + </menuItem> 326 + <menuItem title="Help" id="EPT-qC-fAb"> 327 + <modifierMask key="keyEquivalentModifierMask"/> 328 + <menu key="submenu" title="Help" systemMenu="help" id="rJ0-wn-3NY"/> 329 + </menuItem> 330 + </items> 331 + <point key="canvasLocation" x="142" y="-258"/> 332 + </menu> 333 + <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target"> 334 + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> 335 + <rect key="contentRect" x="335" y="390" width="800" height="600"/> 336 + <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/> 337 + <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ"> 338 + <rect key="frame" x="0.0" y="0.0" width="800" height="600"/> 339 + <autoresizingMask key="autoresizingMask"/> 340 + </view> 341 + </window> 342 + </objects> 343 + </document>
+14
macos/Runner/Configs/AppInfo.xcconfig
··· 1 + // Application-level settings for the Runner target. 2 + // 3 + // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 + // future. If not, the values below would default to using the project name when this becomes a 5 + // 'flutter create' template. 6 + 7 + // The application's name. By default this is also the title of the Flutter window. 8 + PRODUCT_NAME = pudge 9 + 10 + // The application's bundle identifier 11 + PRODUCT_BUNDLE_IDENTIFIER = com.example.pudge 12 + 13 + // The copyright displayed in application information 14 + PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved.
+2
macos/Runner/Configs/Debug.xcconfig
··· 1 + #include "../../Flutter/Flutter-Debug.xcconfig" 2 + #include "Warnings.xcconfig"
+2
macos/Runner/Configs/Release.xcconfig
··· 1 + #include "../../Flutter/Flutter-Release.xcconfig" 2 + #include "Warnings.xcconfig"
+13
macos/Runner/Configs/Warnings.xcconfig
··· 1 + WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 + GCC_WARN_UNDECLARED_SELECTOR = YES 3 + CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 + CLANG_WARN_PRAGMA_PACK = YES 7 + CLANG_WARN_STRICT_PROTOTYPES = YES 8 + CLANG_WARN_COMMA = YES 9 + GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 + GCC_WARN_SHADOW = YES 13 + CLANG_WARN_UNREACHABLE_CODE = YES
+12
macos/Runner/DebugProfile.entitlements
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>com.apple.security.app-sandbox</key> 6 + <true/> 7 + <key>com.apple.security.cs.allow-jit</key> 8 + <true/> 9 + <key>com.apple.security.network.server</key> 10 + <true/> 11 + </dict> 12 + </plist>
+32
macos/Runner/Info.plist
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>CFBundleDevelopmentRegion</key> 6 + <string>$(DEVELOPMENT_LANGUAGE)</string> 7 + <key>CFBundleExecutable</key> 8 + <string>$(EXECUTABLE_NAME)</string> 9 + <key>CFBundleIconFile</key> 10 + <string></string> 11 + <key>CFBundleIdentifier</key> 12 + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> 13 + <key>CFBundleInfoDictionaryVersion</key> 14 + <string>6.0</string> 15 + <key>CFBundleName</key> 16 + <string>$(PRODUCT_NAME)</string> 17 + <key>CFBundlePackageType</key> 18 + <string>APPL</string> 19 + <key>CFBundleShortVersionString</key> 20 + <string>$(FLUTTER_BUILD_NAME)</string> 21 + <key>CFBundleVersion</key> 22 + <string>$(FLUTTER_BUILD_NUMBER)</string> 23 + <key>LSMinimumSystemVersion</key> 24 + <string>$(MACOSX_DEPLOYMENT_TARGET)</string> 25 + <key>NSHumanReadableCopyright</key> 26 + <string>$(PRODUCT_COPYRIGHT)</string> 27 + <key>NSMainNibFile</key> 28 + <string>MainMenu</string> 29 + <key>NSPrincipalClass</key> 30 + <string>NSApplication</string> 31 + </dict> 32 + </plist>
+15
macos/Runner/MainFlutterWindow.swift
··· 1 + import Cocoa 2 + import FlutterMacOS 3 + 4 + class MainFlutterWindow: NSWindow { 5 + override func awakeFromNib() { 6 + let flutterViewController = FlutterViewController() 7 + let windowFrame = self.frame 8 + self.contentViewController = flutterViewController 9 + self.setFrame(windowFrame, display: true) 10 + 11 + RegisterGeneratedPlugins(registry: flutterViewController) 12 + 13 + super.awakeFromNib() 14 + } 15 + }
+8
macos/Runner/Release.entitlements
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 + <plist version="1.0"> 4 + <dict> 5 + <key>com.apple.security.app-sandbox</key> 6 + <true/> 7 + </dict> 8 + </plist>
+12
macos/RunnerTests/RunnerTests.swift
··· 1 + import Cocoa 2 + import FlutterMacOS 3 + import XCTest 4 + 5 + class RunnerTests: XCTestCase { 6 + 7 + func testExample() { 8 + // If you add code to the Runner application, consider adding tests here. 9 + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 + } 11 + 12 + }
+205
pubspec.lock
··· 1 + # Generated by pub 2 + # See https://dart.dev/tools/pub/glossary#lockfile 3 + packages: 4 + async: 5 + dependency: transitive 6 + description: 7 + name: async 8 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" 9 + url: "https://pub.dev" 10 + source: hosted 11 + version: "2.13.0" 12 + boolean_selector: 13 + dependency: transitive 14 + description: 15 + name: boolean_selector 16 + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 17 + url: "https://pub.dev" 18 + source: hosted 19 + version: "2.1.2" 20 + characters: 21 + dependency: transitive 22 + description: 23 + name: characters 24 + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 25 + url: "https://pub.dev" 26 + source: hosted 27 + version: "1.4.0" 28 + clock: 29 + dependency: transitive 30 + description: 31 + name: clock 32 + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 33 + url: "https://pub.dev" 34 + source: hosted 35 + version: "1.1.2" 36 + collection: 37 + dependency: transitive 38 + description: 39 + name: collection 40 + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 41 + url: "https://pub.dev" 42 + source: hosted 43 + version: "1.19.1" 44 + fake_async: 45 + dependency: transitive 46 + description: 47 + name: fake_async 48 + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" 49 + url: "https://pub.dev" 50 + source: hosted 51 + version: "1.3.3" 52 + flutter: 53 + dependency: "direct main" 54 + description: flutter 55 + source: sdk 56 + version: "0.0.0" 57 + flutter_lints: 58 + dependency: "direct dev" 59 + description: 60 + name: flutter_lints 61 + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" 62 + url: "https://pub.dev" 63 + source: hosted 64 + version: "5.0.0" 65 + flutter_test: 66 + dependency: "direct dev" 67 + description: flutter 68 + source: sdk 69 + version: "0.0.0" 70 + leak_tracker: 71 + dependency: transitive 72 + description: 73 + name: leak_tracker 74 + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" 75 + url: "https://pub.dev" 76 + source: hosted 77 + version: "11.0.2" 78 + leak_tracker_flutter_testing: 79 + dependency: transitive 80 + description: 81 + name: leak_tracker_flutter_testing 82 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" 83 + url: "https://pub.dev" 84 + source: hosted 85 + version: "3.0.10" 86 + leak_tracker_testing: 87 + dependency: transitive 88 + description: 89 + name: leak_tracker_testing 90 + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" 91 + url: "https://pub.dev" 92 + source: hosted 93 + version: "3.0.2" 94 + lints: 95 + dependency: transitive 96 + description: 97 + name: lints 98 + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 99 + url: "https://pub.dev" 100 + source: hosted 101 + version: "5.1.1" 102 + matcher: 103 + dependency: transitive 104 + description: 105 + name: matcher 106 + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 107 + url: "https://pub.dev" 108 + source: hosted 109 + version: "0.12.17" 110 + material_color_utilities: 111 + dependency: transitive 112 + description: 113 + name: material_color_utilities 114 + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 115 + url: "https://pub.dev" 116 + source: hosted 117 + version: "0.11.1" 118 + meta: 119 + dependency: transitive 120 + description: 121 + name: meta 122 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c 123 + url: "https://pub.dev" 124 + source: hosted 125 + version: "1.16.0" 126 + path: 127 + dependency: transitive 128 + description: 129 + name: path 130 + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 131 + url: "https://pub.dev" 132 + source: hosted 133 + version: "1.9.1" 134 + sky_engine: 135 + dependency: transitive 136 + description: flutter 137 + source: sdk 138 + version: "0.0.0" 139 + source_span: 140 + dependency: transitive 141 + description: 142 + name: source_span 143 + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" 144 + url: "https://pub.dev" 145 + source: hosted 146 + version: "1.10.1" 147 + stack_trace: 148 + dependency: transitive 149 + description: 150 + name: stack_trace 151 + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 152 + url: "https://pub.dev" 153 + source: hosted 154 + version: "1.12.1" 155 + stream_channel: 156 + dependency: transitive 157 + description: 158 + name: stream_channel 159 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 160 + url: "https://pub.dev" 161 + source: hosted 162 + version: "2.1.4" 163 + string_scanner: 164 + dependency: transitive 165 + description: 166 + name: string_scanner 167 + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 168 + url: "https://pub.dev" 169 + source: hosted 170 + version: "1.4.1" 171 + term_glyph: 172 + dependency: transitive 173 + description: 174 + name: term_glyph 175 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 176 + url: "https://pub.dev" 177 + source: hosted 178 + version: "1.2.2" 179 + test_api: 180 + dependency: transitive 181 + description: 182 + name: test_api 183 + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" 184 + url: "https://pub.dev" 185 + source: hosted 186 + version: "0.7.6" 187 + vector_math: 188 + dependency: transitive 189 + description: 190 + name: vector_math 191 + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b 192 + url: "https://pub.dev" 193 + source: hosted 194 + version: "2.2.0" 195 + vm_service: 196 + dependency: transitive 197 + description: 198 + name: vm_service 199 + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" 200 + url: "https://pub.dev" 201 + source: hosted 202 + version: "15.0.2" 203 + sdks: 204 + dart: ">=3.9.2 <4.0.0" 205 + flutter: ">=3.18.0-18.0.pre.54"
+19
pubspec.yaml
··· 1 + name: pudge 2 + description: "A new Flutter project." 3 + publish_to: 'none' 4 + version: 0.1.0 5 + 6 + environment: 7 + sdk: ^3.9.2 8 + 9 + dependencies: 10 + flutter: 11 + sdk: flutter 12 + 13 + dev_dependencies: 14 + flutter_test: 15 + sdk: flutter 16 + flutter_lints: ^5.0.0 17 + 18 + flutter: 19 + uses-material-design: true
web/favicon.png

This is a binary file and will not be displayed.

web/icons/Icon-192.png

This is a binary file and will not be displayed.

web/icons/Icon-512.png

This is a binary file and will not be displayed.

web/icons/Icon-maskable-192.png

This is a binary file and will not be displayed.

web/icons/Icon-maskable-512.png

This is a binary file and will not be displayed.

+38
web/index.html
··· 1 + <!DOCTYPE html> 2 + <html> 3 + <head> 4 + <!-- 5 + If you are serving your web app in a path other than the root, change the 6 + href value below to reflect the base path you are serving from. 7 + 8 + The path provided below has to start and end with a slash "/" in order for 9 + it to work correctly. 10 + 11 + For more details: 12 + * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base 13 + 14 + This is a placeholder for base href that will be replaced by the value of 15 + the `--base-href` argument provided to `flutter build`. 16 + --> 17 + <base href="$FLUTTER_BASE_HREF"> 18 + 19 + <meta charset="UTF-8"> 20 + <meta content="IE=Edge" http-equiv="X-UA-Compatible"> 21 + <meta name="description" content="A new Flutter project."> 22 + 23 + <!-- iOS meta tags & icons --> 24 + <meta name="mobile-web-app-capable" content="yes"> 25 + <meta name="apple-mobile-web-app-status-bar-style" content="black"> 26 + <meta name="apple-mobile-web-app-title" content="pudge"> 27 + <link rel="apple-touch-icon" href="icons/Icon-192.png"> 28 + 29 + <!-- Favicon --> 30 + <link rel="icon" type="image/png" href="favicon.png"/> 31 + 32 + <title>pudge</title> 33 + <link rel="manifest" href="manifest.json"> 34 + </head> 35 + <body> 36 + <script src="flutter_bootstrap.js" async></script> 37 + </body> 38 + </html>
+35
web/manifest.json
··· 1 + { 2 + "name": "pudge", 3 + "short_name": "pudge", 4 + "start_url": ".", 5 + "display": "standalone", 6 + "background_color": "#0175C2", 7 + "theme_color": "#0175C2", 8 + "description": "A new Flutter project.", 9 + "orientation": "portrait-primary", 10 + "prefer_related_applications": false, 11 + "icons": [ 12 + { 13 + "src": "icons/Icon-192.png", 14 + "sizes": "192x192", 15 + "type": "image/png" 16 + }, 17 + { 18 + "src": "icons/Icon-512.png", 19 + "sizes": "512x512", 20 + "type": "image/png" 21 + }, 22 + { 23 + "src": "icons/Icon-maskable-192.png", 24 + "sizes": "192x192", 25 + "type": "image/png", 26 + "purpose": "maskable" 27 + }, 28 + { 29 + "src": "icons/Icon-maskable-512.png", 30 + "sizes": "512x512", 31 + "type": "image/png", 32 + "purpose": "maskable" 33 + } 34 + ] 35 + }
+17
windows/.gitignore
··· 1 + flutter/ephemeral/ 2 + 3 + # Visual Studio user-specific files. 4 + *.suo 5 + *.user 6 + *.userosscache 7 + *.sln.docstates 8 + 9 + # Visual Studio build-related files. 10 + x64/ 11 + x86/ 12 + 13 + # Visual Studio cache files 14 + # files ending in .cache can be ignored 15 + *.[Cc]ache 16 + # but keep track of directories ending in .cache 17 + !*.[Cc]ache/
+108
windows/CMakeLists.txt
··· 1 + # Project-level configuration. 2 + cmake_minimum_required(VERSION 3.14) 3 + project(pudge LANGUAGES CXX) 4 + 5 + # The name of the executable created for the application. Change this to change 6 + # the on-disk name of your application. 7 + set(BINARY_NAME "pudge") 8 + 9 + # Explicitly opt in to modern CMake behaviors to avoid warnings with recent 10 + # versions of CMake. 11 + cmake_policy(VERSION 3.14...3.25) 12 + 13 + # Define build configuration option. 14 + get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) 15 + if(IS_MULTICONFIG) 16 + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" 17 + CACHE STRING "" FORCE) 18 + else() 19 + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 20 + set(CMAKE_BUILD_TYPE "Debug" CACHE 21 + STRING "Flutter build mode" FORCE) 22 + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS 23 + "Debug" "Profile" "Release") 24 + endif() 25 + endif() 26 + # Define settings for the Profile build mode. 27 + set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") 28 + set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") 29 + set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") 30 + set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") 31 + 32 + # Use Unicode for all projects. 33 + add_definitions(-DUNICODE -D_UNICODE) 34 + 35 + # Compilation settings that should be applied to most targets. 36 + # 37 + # Be cautious about adding new options here, as plugins use this function by 38 + # default. In most cases, you should add new options to specific targets instead 39 + # of modifying this function. 40 + function(APPLY_STANDARD_SETTINGS TARGET) 41 + target_compile_features(${TARGET} PUBLIC cxx_std_17) 42 + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") 43 + target_compile_options(${TARGET} PRIVATE /EHsc) 44 + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") 45 + target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>") 46 + endfunction() 47 + 48 + # Flutter library and tool build rules. 49 + set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") 50 + add_subdirectory(${FLUTTER_MANAGED_DIR}) 51 + 52 + # Application build; see runner/CMakeLists.txt. 53 + add_subdirectory("runner") 54 + 55 + 56 + # Generated plugin build rules, which manage building the plugins and adding 57 + # them to the application. 58 + include(flutter/generated_plugins.cmake) 59 + 60 + 61 + # === Installation === 62 + # Support files are copied into place next to the executable, so that it can 63 + # run in place. This is done instead of making a separate bundle (as on Linux) 64 + # so that building and running from within Visual Studio will work. 65 + set(BUILD_BUNDLE_DIR "$<TARGET_FILE_DIR:${BINARY_NAME}>") 66 + # Make the "install" step default, as it's required to run. 67 + set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) 68 + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 69 + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) 70 + endif() 71 + 72 + set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") 73 + set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") 74 + 75 + install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" 76 + COMPONENT Runtime) 77 + 78 + install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" 79 + COMPONENT Runtime) 80 + 81 + install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 82 + COMPONENT Runtime) 83 + 84 + if(PLUGIN_BUNDLED_LIBRARIES) 85 + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" 86 + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 87 + COMPONENT Runtime) 88 + endif() 89 + 90 + # Copy the native assets provided by the build.dart from all packages. 91 + set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") 92 + install(DIRECTORY "${NATIVE_ASSETS_DIR}" 93 + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 94 + COMPONENT Runtime) 95 + 96 + # Fully re-copy the assets directory on each build to avoid having stale files 97 + # from a previous install. 98 + set(FLUTTER_ASSET_DIR_NAME "flutter_assets") 99 + install(CODE " 100 + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") 101 + " COMPONENT Runtime) 102 + install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" 103 + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) 104 + 105 + # Install the AOT library on non-Debug builds only. 106 + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" 107 + CONFIGURATIONS Profile;Release 108 + COMPONENT Runtime)
+109
windows/flutter/CMakeLists.txt
··· 1 + # This file controls Flutter-level build steps. It should not be edited. 2 + cmake_minimum_required(VERSION 3.14) 3 + 4 + set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") 5 + 6 + # Configuration provided via flutter tool. 7 + include(${EPHEMERAL_DIR}/generated_config.cmake) 8 + 9 + # TODO: Move the rest of this into files in ephemeral. See 10 + # https://github.com/flutter/flutter/issues/57146. 11 + set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") 12 + 13 + # Set fallback configurations for older versions of the flutter tool. 14 + if (NOT DEFINED FLUTTER_TARGET_PLATFORM) 15 + set(FLUTTER_TARGET_PLATFORM "windows-x64") 16 + endif() 17 + 18 + # === Flutter Library === 19 + set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") 20 + 21 + # Published to parent scope for install step. 22 + set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) 23 + set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) 24 + set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) 25 + set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) 26 + 27 + list(APPEND FLUTTER_LIBRARY_HEADERS 28 + "flutter_export.h" 29 + "flutter_windows.h" 30 + "flutter_messenger.h" 31 + "flutter_plugin_registrar.h" 32 + "flutter_texture_registrar.h" 33 + ) 34 + list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") 35 + add_library(flutter INTERFACE) 36 + target_include_directories(flutter INTERFACE 37 + "${EPHEMERAL_DIR}" 38 + ) 39 + target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") 40 + add_dependencies(flutter flutter_assemble) 41 + 42 + # === Wrapper === 43 + list(APPEND CPP_WRAPPER_SOURCES_CORE 44 + "core_implementations.cc" 45 + "standard_codec.cc" 46 + ) 47 + list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") 48 + list(APPEND CPP_WRAPPER_SOURCES_PLUGIN 49 + "plugin_registrar.cc" 50 + ) 51 + list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") 52 + list(APPEND CPP_WRAPPER_SOURCES_APP 53 + "flutter_engine.cc" 54 + "flutter_view_controller.cc" 55 + ) 56 + list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") 57 + 58 + # Wrapper sources needed for a plugin. 59 + add_library(flutter_wrapper_plugin STATIC 60 + ${CPP_WRAPPER_SOURCES_CORE} 61 + ${CPP_WRAPPER_SOURCES_PLUGIN} 62 + ) 63 + apply_standard_settings(flutter_wrapper_plugin) 64 + set_target_properties(flutter_wrapper_plugin PROPERTIES 65 + POSITION_INDEPENDENT_CODE ON) 66 + set_target_properties(flutter_wrapper_plugin PROPERTIES 67 + CXX_VISIBILITY_PRESET hidden) 68 + target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) 69 + target_include_directories(flutter_wrapper_plugin PUBLIC 70 + "${WRAPPER_ROOT}/include" 71 + ) 72 + add_dependencies(flutter_wrapper_plugin flutter_assemble) 73 + 74 + # Wrapper sources needed for the runner. 75 + add_library(flutter_wrapper_app STATIC 76 + ${CPP_WRAPPER_SOURCES_CORE} 77 + ${CPP_WRAPPER_SOURCES_APP} 78 + ) 79 + apply_standard_settings(flutter_wrapper_app) 80 + target_link_libraries(flutter_wrapper_app PUBLIC flutter) 81 + target_include_directories(flutter_wrapper_app PUBLIC 82 + "${WRAPPER_ROOT}/include" 83 + ) 84 + add_dependencies(flutter_wrapper_app flutter_assemble) 85 + 86 + # === Flutter tool backend === 87 + # _phony_ is a non-existent file to force this command to run every time, 88 + # since currently there's no way to get a full input/output list from the 89 + # flutter tool. 90 + set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") 91 + set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) 92 + add_custom_command( 93 + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} 94 + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} 95 + ${CPP_WRAPPER_SOURCES_APP} 96 + ${PHONY_OUTPUT} 97 + COMMAND ${CMAKE_COMMAND} -E env 98 + ${FLUTTER_TOOL_ENVIRONMENT} 99 + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" 100 + ${FLUTTER_TARGET_PLATFORM} $<CONFIG> 101 + VERBATIM 102 + ) 103 + add_custom_target(flutter_assemble DEPENDS 104 + "${FLUTTER_LIBRARY}" 105 + ${FLUTTER_LIBRARY_HEADERS} 106 + ${CPP_WRAPPER_SOURCES_CORE} 107 + ${CPP_WRAPPER_SOURCES_PLUGIN} 108 + ${CPP_WRAPPER_SOURCES_APP} 109 + )
+11
windows/flutter/generated_plugin_registrant.cc
··· 1 + // 2 + // Generated file. Do not edit. 3 + // 4 + 5 + // clang-format off 6 + 7 + #include "generated_plugin_registrant.h" 8 + 9 + 10 + void RegisterPlugins(flutter::PluginRegistry* registry) { 11 + }
+15
windows/flutter/generated_plugin_registrant.h
··· 1 + // 2 + // Generated file. Do not edit. 3 + // 4 + 5 + // clang-format off 6 + 7 + #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 + #define GENERATED_PLUGIN_REGISTRANT_ 9 + 10 + #include <flutter/plugin_registry.h> 11 + 12 + // Registers Flutter plugins. 13 + void RegisterPlugins(flutter::PluginRegistry* registry); 14 + 15 + #endif // GENERATED_PLUGIN_REGISTRANT_
+23
windows/flutter/generated_plugins.cmake
··· 1 + # 2 + # Generated file, do not edit. 3 + # 4 + 5 + list(APPEND FLUTTER_PLUGIN_LIST 6 + ) 7 + 8 + list(APPEND FLUTTER_FFI_PLUGIN_LIST 9 + ) 10 + 11 + set(PLUGIN_BUNDLED_LIBRARIES) 12 + 13 + foreach(plugin ${FLUTTER_PLUGIN_LIST}) 14 + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) 15 + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 16 + list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) 17 + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 18 + endforeach(plugin) 19 + 20 + foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 21 + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) 22 + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 23 + endforeach(ffi_plugin)
+40
windows/runner/CMakeLists.txt
··· 1 + cmake_minimum_required(VERSION 3.14) 2 + project(runner LANGUAGES CXX) 3 + 4 + # Define the application target. To change its name, change BINARY_NAME in the 5 + # top-level CMakeLists.txt, not the value here, or `flutter run` will no longer 6 + # work. 7 + # 8 + # Any new source files that you add to the application should be added here. 9 + add_executable(${BINARY_NAME} WIN32 10 + "flutter_window.cpp" 11 + "main.cpp" 12 + "utils.cpp" 13 + "win32_window.cpp" 14 + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" 15 + "Runner.rc" 16 + "runner.exe.manifest" 17 + ) 18 + 19 + # Apply the standard set of build settings. This can be removed for applications 20 + # that need different build settings. 21 + apply_standard_settings(${BINARY_NAME}) 22 + 23 + # Add preprocessor definitions for the build version. 24 + target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") 25 + target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") 26 + target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") 27 + target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") 28 + target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") 29 + 30 + # Disable Windows macros that collide with C++ standard library functions. 31 + target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") 32 + 33 + # Add dependency libraries and include directories. Add any application-specific 34 + # dependencies here. 35 + target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) 36 + target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") 37 + target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") 38 + 39 + # Run the Flutter tool portions of the build. This must not be removed. 40 + add_dependencies(${BINARY_NAME} flutter_assemble)
+121
windows/runner/Runner.rc
··· 1 + // Microsoft Visual C++ generated resource script. 2 + // 3 + #pragma code_page(65001) 4 + #include "resource.h" 5 + 6 + #define APSTUDIO_READONLY_SYMBOLS 7 + ///////////////////////////////////////////////////////////////////////////// 8 + // 9 + // Generated from the TEXTINCLUDE 2 resource. 10 + // 11 + #include "winres.h" 12 + 13 + ///////////////////////////////////////////////////////////////////////////// 14 + #undef APSTUDIO_READONLY_SYMBOLS 15 + 16 + ///////////////////////////////////////////////////////////////////////////// 17 + // English (United States) resources 18 + 19 + #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 + LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 21 + 22 + #ifdef APSTUDIO_INVOKED 23 + ///////////////////////////////////////////////////////////////////////////// 24 + // 25 + // TEXTINCLUDE 26 + // 27 + 28 + 1 TEXTINCLUDE 29 + BEGIN 30 + "resource.h\0" 31 + END 32 + 33 + 2 TEXTINCLUDE 34 + BEGIN 35 + "#include ""winres.h""\r\n" 36 + "\0" 37 + END 38 + 39 + 3 TEXTINCLUDE 40 + BEGIN 41 + "\r\n" 42 + "\0" 43 + END 44 + 45 + #endif // APSTUDIO_INVOKED 46 + 47 + 48 + ///////////////////////////////////////////////////////////////////////////// 49 + // 50 + // Icon 51 + // 52 + 53 + // Icon with lowest ID value placed first to ensure application icon 54 + // remains consistent on all systems. 55 + IDI_APP_ICON ICON "resources\\app_icon.ico" 56 + 57 + 58 + ///////////////////////////////////////////////////////////////////////////// 59 + // 60 + // Version 61 + // 62 + 63 + #if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) 64 + #define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD 65 + #else 66 + #define VERSION_AS_NUMBER 1,0,0,0 67 + #endif 68 + 69 + #if defined(FLUTTER_VERSION) 70 + #define VERSION_AS_STRING FLUTTER_VERSION 71 + #else 72 + #define VERSION_AS_STRING "1.0.0" 73 + #endif 74 + 75 + VS_VERSION_INFO VERSIONINFO 76 + FILEVERSION VERSION_AS_NUMBER 77 + PRODUCTVERSION VERSION_AS_NUMBER 78 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK 79 + #ifdef _DEBUG 80 + FILEFLAGS VS_FF_DEBUG 81 + #else 82 + FILEFLAGS 0x0L 83 + #endif 84 + FILEOS VOS__WINDOWS32 85 + FILETYPE VFT_APP 86 + FILESUBTYPE 0x0L 87 + BEGIN 88 + BLOCK "StringFileInfo" 89 + BEGIN 90 + BLOCK "040904e4" 91 + BEGIN 92 + VALUE "CompanyName", "com.example" "\0" 93 + VALUE "FileDescription", "pudge" "\0" 94 + VALUE "FileVersion", VERSION_AS_STRING "\0" 95 + VALUE "InternalName", "pudge" "\0" 96 + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" 97 + VALUE "OriginalFilename", "pudge.exe" "\0" 98 + VALUE "ProductName", "pudge" "\0" 99 + VALUE "ProductVersion", VERSION_AS_STRING "\0" 100 + END 101 + END 102 + BLOCK "VarFileInfo" 103 + BEGIN 104 + VALUE "Translation", 0x409, 1252 105 + END 106 + END 107 + 108 + #endif // English (United States) resources 109 + ///////////////////////////////////////////////////////////////////////////// 110 + 111 + 112 + 113 + #ifndef APSTUDIO_INVOKED 114 + ///////////////////////////////////////////////////////////////////////////// 115 + // 116 + // Generated from the TEXTINCLUDE 3 resource. 117 + // 118 + 119 + 120 + ///////////////////////////////////////////////////////////////////////////// 121 + #endif // not APSTUDIO_INVOKED
+71
windows/runner/flutter_window.cpp
··· 1 + #include "flutter_window.h" 2 + 3 + #include <optional> 4 + 5 + #include "flutter/generated_plugin_registrant.h" 6 + 7 + FlutterWindow::FlutterWindow(const flutter::DartProject& project) 8 + : project_(project) {} 9 + 10 + FlutterWindow::~FlutterWindow() {} 11 + 12 + bool FlutterWindow::OnCreate() { 13 + if (!Win32Window::OnCreate()) { 14 + return false; 15 + } 16 + 17 + RECT frame = GetClientArea(); 18 + 19 + // The size here must match the window dimensions to avoid unnecessary surface 20 + // creation / destruction in the startup path. 21 + flutter_controller_ = std::make_unique<flutter::FlutterViewController>( 22 + frame.right - frame.left, frame.bottom - frame.top, project_); 23 + // Ensure that basic setup of the controller was successful. 24 + if (!flutter_controller_->engine() || !flutter_controller_->view()) { 25 + return false; 26 + } 27 + RegisterPlugins(flutter_controller_->engine()); 28 + SetChildContent(flutter_controller_->view()->GetNativeWindow()); 29 + 30 + flutter_controller_->engine()->SetNextFrameCallback([&]() { 31 + this->Show(); 32 + }); 33 + 34 + // Flutter can complete the first frame before the "show window" callback is 35 + // registered. The following call ensures a frame is pending to ensure the 36 + // window is shown. It is a no-op if the first frame hasn't completed yet. 37 + flutter_controller_->ForceRedraw(); 38 + 39 + return true; 40 + } 41 + 42 + void FlutterWindow::OnDestroy() { 43 + if (flutter_controller_) { 44 + flutter_controller_ = nullptr; 45 + } 46 + 47 + Win32Window::OnDestroy(); 48 + } 49 + 50 + LRESULT 51 + FlutterWindow::MessageHandler(HWND hwnd, UINT const message, 52 + WPARAM const wparam, 53 + LPARAM const lparam) noexcept { 54 + // Give Flutter, including plugins, an opportunity to handle window messages. 55 + if (flutter_controller_) { 56 + std::optional<LRESULT> result = 57 + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, 58 + lparam); 59 + if (result) { 60 + return *result; 61 + } 62 + } 63 + 64 + switch (message) { 65 + case WM_FONTCHANGE: 66 + flutter_controller_->engine()->ReloadSystemFonts(); 67 + break; 68 + } 69 + 70 + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); 71 + }
+33
windows/runner/flutter_window.h
··· 1 + #ifndef RUNNER_FLUTTER_WINDOW_H_ 2 + #define RUNNER_FLUTTER_WINDOW_H_ 3 + 4 + #include <flutter/dart_project.h> 5 + #include <flutter/flutter_view_controller.h> 6 + 7 + #include <memory> 8 + 9 + #include "win32_window.h" 10 + 11 + // A window that does nothing but host a Flutter view. 12 + class FlutterWindow : public Win32Window { 13 + public: 14 + // Creates a new FlutterWindow hosting a Flutter view running |project|. 15 + explicit FlutterWindow(const flutter::DartProject& project); 16 + virtual ~FlutterWindow(); 17 + 18 + protected: 19 + // Win32Window: 20 + bool OnCreate() override; 21 + void OnDestroy() override; 22 + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, 23 + LPARAM const lparam) noexcept override; 24 + 25 + private: 26 + // The project to run. 27 + flutter::DartProject project_; 28 + 29 + // The Flutter instance hosted by this window. 30 + std::unique_ptr<flutter::FlutterViewController> flutter_controller_; 31 + }; 32 + 33 + #endif // RUNNER_FLUTTER_WINDOW_H_
+43
windows/runner/main.cpp
··· 1 + #include <flutter/dart_project.h> 2 + #include <flutter/flutter_view_controller.h> 3 + #include <windows.h> 4 + 5 + #include "flutter_window.h" 6 + #include "utils.h" 7 + 8 + int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, 9 + _In_ wchar_t *command_line, _In_ int show_command) { 10 + // Attach to console when present (e.g., 'flutter run') or create a 11 + // new console when running with a debugger. 12 + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { 13 + CreateAndAttachConsole(); 14 + } 15 + 16 + // Initialize COM, so that it is available for use in the library and/or 17 + // plugins. 18 + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); 19 + 20 + flutter::DartProject project(L"data"); 21 + 22 + std::vector<std::string> command_line_arguments = 23 + GetCommandLineArguments(); 24 + 25 + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); 26 + 27 + FlutterWindow window(project); 28 + Win32Window::Point origin(10, 10); 29 + Win32Window::Size size(1280, 720); 30 + if (!window.Create(L"pudge", origin, size)) { 31 + return EXIT_FAILURE; 32 + } 33 + window.SetQuitOnClose(true); 34 + 35 + ::MSG msg; 36 + while (::GetMessage(&msg, nullptr, 0, 0)) { 37 + ::TranslateMessage(&msg); 38 + ::DispatchMessage(&msg); 39 + } 40 + 41 + ::CoUninitialize(); 42 + return EXIT_SUCCESS; 43 + }
+16
windows/runner/resource.h
··· 1 + //{{NO_DEPENDENCIES}} 2 + // Microsoft Visual C++ generated include file. 3 + // Used by Runner.rc 4 + // 5 + #define IDI_APP_ICON 101 6 + 7 + // Next default values for new objects 8 + // 9 + #ifdef APSTUDIO_INVOKED 10 + #ifndef APSTUDIO_READONLY_SYMBOLS 11 + #define _APS_NEXT_RESOURCE_VALUE 102 12 + #define _APS_NEXT_COMMAND_VALUE 40001 13 + #define _APS_NEXT_CONTROL_VALUE 1001 14 + #define _APS_NEXT_SYMED_VALUE 101 15 + #endif 16 + #endif
windows/runner/resources/app_icon.ico

This is a binary file and will not be displayed.

+14
windows/runner/runner.exe.manifest
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 2 + <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 3 + <application xmlns="urn:schemas-microsoft-com:asm.v3"> 4 + <windowsSettings> 5 + <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> 6 + </windowsSettings> 7 + </application> 8 + <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 9 + <application> 10 + <!-- Windows 10 and Windows 11 --> 11 + <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> 12 + </application> 13 + </compatibility> 14 + </assembly>
+65
windows/runner/utils.cpp
··· 1 + #include "utils.h" 2 + 3 + #include <flutter_windows.h> 4 + #include <io.h> 5 + #include <stdio.h> 6 + #include <windows.h> 7 + 8 + #include <iostream> 9 + 10 + void CreateAndAttachConsole() { 11 + if (::AllocConsole()) { 12 + FILE *unused; 13 + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { 14 + _dup2(_fileno(stdout), 1); 15 + } 16 + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { 17 + _dup2(_fileno(stdout), 2); 18 + } 19 + std::ios::sync_with_stdio(); 20 + FlutterDesktopResyncOutputStreams(); 21 + } 22 + } 23 + 24 + std::vector<std::string> GetCommandLineArguments() { 25 + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. 26 + int argc; 27 + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); 28 + if (argv == nullptr) { 29 + return std::vector<std::string>(); 30 + } 31 + 32 + std::vector<std::string> command_line_arguments; 33 + 34 + // Skip the first argument as it's the binary name. 35 + for (int i = 1; i < argc; i++) { 36 + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); 37 + } 38 + 39 + ::LocalFree(argv); 40 + 41 + return command_line_arguments; 42 + } 43 + 44 + std::string Utf8FromUtf16(const wchar_t* utf16_string) { 45 + if (utf16_string == nullptr) { 46 + return std::string(); 47 + } 48 + unsigned int target_length = ::WideCharToMultiByte( 49 + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, 50 + -1, nullptr, 0, nullptr, nullptr) 51 + -1; // remove the trailing null character 52 + int input_length = (int)wcslen(utf16_string); 53 + std::string utf8_string; 54 + if (target_length == 0 || target_length > utf8_string.max_size()) { 55 + return utf8_string; 56 + } 57 + utf8_string.resize(target_length); 58 + int converted_length = ::WideCharToMultiByte( 59 + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, 60 + input_length, utf8_string.data(), target_length, nullptr, nullptr); 61 + if (converted_length == 0) { 62 + return std::string(); 63 + } 64 + return utf8_string; 65 + }
+19
windows/runner/utils.h
··· 1 + #ifndef RUNNER_UTILS_H_ 2 + #define RUNNER_UTILS_H_ 3 + 4 + #include <string> 5 + #include <vector> 6 + 7 + // Creates a console for the process, and redirects stdout and stderr to 8 + // it for both the runner and the Flutter library. 9 + void CreateAndAttachConsole(); 10 + 11 + // Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string 12 + // encoded in UTF-8. Returns an empty std::string on failure. 13 + std::string Utf8FromUtf16(const wchar_t* utf16_string); 14 + 15 + // Gets the command line arguments passed in as a std::vector<std::string>, 16 + // encoded in UTF-8. Returns an empty std::vector<std::string> on failure. 17 + std::vector<std::string> GetCommandLineArguments(); 18 + 19 + #endif // RUNNER_UTILS_H_
+288
windows/runner/win32_window.cpp
··· 1 + #include "win32_window.h" 2 + 3 + #include <dwmapi.h> 4 + #include <flutter_windows.h> 5 + 6 + #include "resource.h" 7 + 8 + namespace { 9 + 10 + /// Window attribute that enables dark mode window decorations. 11 + /// 12 + /// Redefined in case the developer's machine has a Windows SDK older than 13 + /// version 10.0.22000.0. 14 + /// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute 15 + #ifndef DWMWA_USE_IMMERSIVE_DARK_MODE 16 + #define DWMWA_USE_IMMERSIVE_DARK_MODE 20 17 + #endif 18 + 19 + constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; 20 + 21 + /// Registry key for app theme preference. 22 + /// 23 + /// A value of 0 indicates apps should use dark mode. A non-zero or missing 24 + /// value indicates apps should use light mode. 25 + constexpr const wchar_t kGetPreferredBrightnessRegKey[] = 26 + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; 27 + constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; 28 + 29 + // The number of Win32Window objects that currently exist. 30 + static int g_active_window_count = 0; 31 + 32 + using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); 33 + 34 + // Scale helper to convert logical scaler values to physical using passed in 35 + // scale factor 36 + int Scale(int source, double scale_factor) { 37 + return static_cast<int>(source * scale_factor); 38 + } 39 + 40 + // Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. 41 + // This API is only needed for PerMonitor V1 awareness mode. 42 + void EnableFullDpiSupportIfAvailable(HWND hwnd) { 43 + HMODULE user32_module = LoadLibraryA("User32.dll"); 44 + if (!user32_module) { 45 + return; 46 + } 47 + auto enable_non_client_dpi_scaling = 48 + reinterpret_cast<EnableNonClientDpiScaling*>( 49 + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); 50 + if (enable_non_client_dpi_scaling != nullptr) { 51 + enable_non_client_dpi_scaling(hwnd); 52 + } 53 + FreeLibrary(user32_module); 54 + } 55 + 56 + } // namespace 57 + 58 + // Manages the Win32Window's window class registration. 59 + class WindowClassRegistrar { 60 + public: 61 + ~WindowClassRegistrar() = default; 62 + 63 + // Returns the singleton registrar instance. 64 + static WindowClassRegistrar* GetInstance() { 65 + if (!instance_) { 66 + instance_ = new WindowClassRegistrar(); 67 + } 68 + return instance_; 69 + } 70 + 71 + // Returns the name of the window class, registering the class if it hasn't 72 + // previously been registered. 73 + const wchar_t* GetWindowClass(); 74 + 75 + // Unregisters the window class. Should only be called if there are no 76 + // instances of the window. 77 + void UnregisterWindowClass(); 78 + 79 + private: 80 + WindowClassRegistrar() = default; 81 + 82 + static WindowClassRegistrar* instance_; 83 + 84 + bool class_registered_ = false; 85 + }; 86 + 87 + WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; 88 + 89 + const wchar_t* WindowClassRegistrar::GetWindowClass() { 90 + if (!class_registered_) { 91 + WNDCLASS window_class{}; 92 + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); 93 + window_class.lpszClassName = kWindowClassName; 94 + window_class.style = CS_HREDRAW | CS_VREDRAW; 95 + window_class.cbClsExtra = 0; 96 + window_class.cbWndExtra = 0; 97 + window_class.hInstance = GetModuleHandle(nullptr); 98 + window_class.hIcon = 99 + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); 100 + window_class.hbrBackground = 0; 101 + window_class.lpszMenuName = nullptr; 102 + window_class.lpfnWndProc = Win32Window::WndProc; 103 + RegisterClass(&window_class); 104 + class_registered_ = true; 105 + } 106 + return kWindowClassName; 107 + } 108 + 109 + void WindowClassRegistrar::UnregisterWindowClass() { 110 + UnregisterClass(kWindowClassName, nullptr); 111 + class_registered_ = false; 112 + } 113 + 114 + Win32Window::Win32Window() { 115 + ++g_active_window_count; 116 + } 117 + 118 + Win32Window::~Win32Window() { 119 + --g_active_window_count; 120 + Destroy(); 121 + } 122 + 123 + bool Win32Window::Create(const std::wstring& title, 124 + const Point& origin, 125 + const Size& size) { 126 + Destroy(); 127 + 128 + const wchar_t* window_class = 129 + WindowClassRegistrar::GetInstance()->GetWindowClass(); 130 + 131 + const POINT target_point = {static_cast<LONG>(origin.x), 132 + static_cast<LONG>(origin.y)}; 133 + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); 134 + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); 135 + double scale_factor = dpi / 96.0; 136 + 137 + HWND window = CreateWindow( 138 + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, 139 + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), 140 + Scale(size.width, scale_factor), Scale(size.height, scale_factor), 141 + nullptr, nullptr, GetModuleHandle(nullptr), this); 142 + 143 + if (!window) { 144 + return false; 145 + } 146 + 147 + UpdateTheme(window); 148 + 149 + return OnCreate(); 150 + } 151 + 152 + bool Win32Window::Show() { 153 + return ShowWindow(window_handle_, SW_SHOWNORMAL); 154 + } 155 + 156 + // static 157 + LRESULT CALLBACK Win32Window::WndProc(HWND const window, 158 + UINT const message, 159 + WPARAM const wparam, 160 + LPARAM const lparam) noexcept { 161 + if (message == WM_NCCREATE) { 162 + auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam); 163 + SetWindowLongPtr(window, GWLP_USERDATA, 164 + reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams)); 165 + 166 + auto that = static_cast<Win32Window*>(window_struct->lpCreateParams); 167 + EnableFullDpiSupportIfAvailable(window); 168 + that->window_handle_ = window; 169 + } else if (Win32Window* that = GetThisFromHandle(window)) { 170 + return that->MessageHandler(window, message, wparam, lparam); 171 + } 172 + 173 + return DefWindowProc(window, message, wparam, lparam); 174 + } 175 + 176 + LRESULT 177 + Win32Window::MessageHandler(HWND hwnd, 178 + UINT const message, 179 + WPARAM const wparam, 180 + LPARAM const lparam) noexcept { 181 + switch (message) { 182 + case WM_DESTROY: 183 + window_handle_ = nullptr; 184 + Destroy(); 185 + if (quit_on_close_) { 186 + PostQuitMessage(0); 187 + } 188 + return 0; 189 + 190 + case WM_DPICHANGED: { 191 + auto newRectSize = reinterpret_cast<RECT*>(lparam); 192 + LONG newWidth = newRectSize->right - newRectSize->left; 193 + LONG newHeight = newRectSize->bottom - newRectSize->top; 194 + 195 + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, 196 + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); 197 + 198 + return 0; 199 + } 200 + case WM_SIZE: { 201 + RECT rect = GetClientArea(); 202 + if (child_content_ != nullptr) { 203 + // Size and position the child window. 204 + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, 205 + rect.bottom - rect.top, TRUE); 206 + } 207 + return 0; 208 + } 209 + 210 + case WM_ACTIVATE: 211 + if (child_content_ != nullptr) { 212 + SetFocus(child_content_); 213 + } 214 + return 0; 215 + 216 + case WM_DWMCOLORIZATIONCOLORCHANGED: 217 + UpdateTheme(hwnd); 218 + return 0; 219 + } 220 + 221 + return DefWindowProc(window_handle_, message, wparam, lparam); 222 + } 223 + 224 + void Win32Window::Destroy() { 225 + OnDestroy(); 226 + 227 + if (window_handle_) { 228 + DestroyWindow(window_handle_); 229 + window_handle_ = nullptr; 230 + } 231 + if (g_active_window_count == 0) { 232 + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); 233 + } 234 + } 235 + 236 + Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { 237 + return reinterpret_cast<Win32Window*>( 238 + GetWindowLongPtr(window, GWLP_USERDATA)); 239 + } 240 + 241 + void Win32Window::SetChildContent(HWND content) { 242 + child_content_ = content; 243 + SetParent(content, window_handle_); 244 + RECT frame = GetClientArea(); 245 + 246 + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, 247 + frame.bottom - frame.top, true); 248 + 249 + SetFocus(child_content_); 250 + } 251 + 252 + RECT Win32Window::GetClientArea() { 253 + RECT frame; 254 + GetClientRect(window_handle_, &frame); 255 + return frame; 256 + } 257 + 258 + HWND Win32Window::GetHandle() { 259 + return window_handle_; 260 + } 261 + 262 + void Win32Window::SetQuitOnClose(bool quit_on_close) { 263 + quit_on_close_ = quit_on_close; 264 + } 265 + 266 + bool Win32Window::OnCreate() { 267 + // No-op; provided for subclasses. 268 + return true; 269 + } 270 + 271 + void Win32Window::OnDestroy() { 272 + // No-op; provided for subclasses. 273 + } 274 + 275 + void Win32Window::UpdateTheme(HWND const window) { 276 + DWORD light_mode; 277 + DWORD light_mode_size = sizeof(light_mode); 278 + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, 279 + kGetPreferredBrightnessRegValue, 280 + RRF_RT_REG_DWORD, nullptr, &light_mode, 281 + &light_mode_size); 282 + 283 + if (result == ERROR_SUCCESS) { 284 + BOOL enable_dark_mode = light_mode == 0; 285 + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, 286 + &enable_dark_mode, sizeof(enable_dark_mode)); 287 + } 288 + }
+102
windows/runner/win32_window.h
··· 1 + #ifndef RUNNER_WIN32_WINDOW_H_ 2 + #define RUNNER_WIN32_WINDOW_H_ 3 + 4 + #include <windows.h> 5 + 6 + #include <functional> 7 + #include <memory> 8 + #include <string> 9 + 10 + // A class abstraction for a high DPI-aware Win32 Window. Intended to be 11 + // inherited from by classes that wish to specialize with custom 12 + // rendering and input handling 13 + class Win32Window { 14 + public: 15 + struct Point { 16 + unsigned int x; 17 + unsigned int y; 18 + Point(unsigned int x, unsigned int y) : x(x), y(y) {} 19 + }; 20 + 21 + struct Size { 22 + unsigned int width; 23 + unsigned int height; 24 + Size(unsigned int width, unsigned int height) 25 + : width(width), height(height) {} 26 + }; 27 + 28 + Win32Window(); 29 + virtual ~Win32Window(); 30 + 31 + // Creates a win32 window with |title| that is positioned and sized using 32 + // |origin| and |size|. New windows are created on the default monitor. Window 33 + // sizes are specified to the OS in physical pixels, hence to ensure a 34 + // consistent size this function will scale the inputted width and height as 35 + // as appropriate for the default monitor. The window is invisible until 36 + // |Show| is called. Returns true if the window was created successfully. 37 + bool Create(const std::wstring& title, const Point& origin, const Size& size); 38 + 39 + // Show the current window. Returns true if the window was successfully shown. 40 + bool Show(); 41 + 42 + // Release OS resources associated with window. 43 + void Destroy(); 44 + 45 + // Inserts |content| into the window tree. 46 + void SetChildContent(HWND content); 47 + 48 + // Returns the backing Window handle to enable clients to set icon and other 49 + // window properties. Returns nullptr if the window has been destroyed. 50 + HWND GetHandle(); 51 + 52 + // If true, closing this window will quit the application. 53 + void SetQuitOnClose(bool quit_on_close); 54 + 55 + // Return a RECT representing the bounds of the current client area. 56 + RECT GetClientArea(); 57 + 58 + protected: 59 + // Processes and route salient window messages for mouse handling, 60 + // size change and DPI. Delegates handling of these to member overloads that 61 + // inheriting classes can handle. 62 + virtual LRESULT MessageHandler(HWND window, 63 + UINT const message, 64 + WPARAM const wparam, 65 + LPARAM const lparam) noexcept; 66 + 67 + // Called when CreateAndShow is called, allowing subclass window-related 68 + // setup. Subclasses should return false if setup fails. 69 + virtual bool OnCreate(); 70 + 71 + // Called when Destroy is called. 72 + virtual void OnDestroy(); 73 + 74 + private: 75 + friend class WindowClassRegistrar; 76 + 77 + // OS callback called by message pump. Handles the WM_NCCREATE message which 78 + // is passed when the non-client area is being created and enables automatic 79 + // non-client DPI scaling so that the non-client area automatically 80 + // responds to changes in DPI. All other messages are handled by 81 + // MessageHandler. 82 + static LRESULT CALLBACK WndProc(HWND const window, 83 + UINT const message, 84 + WPARAM const wparam, 85 + LPARAM const lparam) noexcept; 86 + 87 + // Retrieves a class instance pointer for |window| 88 + static Win32Window* GetThisFromHandle(HWND const window) noexcept; 89 + 90 + // Update the window frame's theme to match the system theme. 91 + static void UpdateTheme(HWND const window); 92 + 93 + bool quit_on_close_ = false; 94 + 95 + // window handle for top level window. 96 + HWND window_handle_ = nullptr; 97 + 98 + // window handle for hosted content. 99 + HWND child_content_ = nullptr; 100 + }; 101 + 102 + #endif // RUNNER_WIN32_WINDOW_H_