├── .gitignore ├── GRGlassWindow.xcodeproj └── project.pbxproj ├── GRGlassWindow ├── AppDelegate.h ├── AppDelegate.m ├── Base.lproj │ └── MainMenu.xib ├── GRGlassWindow Class │ ├── GRGlassAccessoryWindow.h │ ├── GRGlassAccessoryWindow.m │ ├── GRGlassThemeWidget.h │ ├── GRGlassThemeWidget.m │ ├── GRGlassWindow.h │ ├── GRGlassWindow.m │ ├── NSWindow+Screenshot.h │ ├── NSWindow+Screenshot.m │ ├── PrivateStuff.h │ └── Resources │ │ ├── Roboto-Medium.ttf │ │ └── Roboto-Regular.ttf ├── GRGlassWindow-Info.plist ├── GRGlassWindow-Prefix.pch ├── en.lproj │ ├── Credits.rtf │ └── InfoPlist.strings └── main.m ├── GRGlassWindowTests ├── GRGlassWindowTests-Info.plist ├── GRGlassWindowTests.m └── en.lproj │ └── InfoPlist.strings ├── LICENSE ├── README.md ├── glass_screenshot_1.png └── glassicon.iconset ├── icon_128x128.png ├── icon_128x128@2x.png ├── icon_16x16.png ├── icon_16x16@2x.png ├── icon_256x256.png ├── icon_256x256@2x.png ├── icon_32x32.png ├── icon_32x32@2x.png ├── icon_512x512.png └── icon_512x512@2x.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | __MACOSX 3 | *.pbxuser 4 | !default.pbxuser 5 | *.mode1v3 6 | !default.mode1v3 7 | *.mode2v3 8 | !default.mode2v3 9 | *.perspectivev3 10 | !default.perspectivev3 11 | *.xcworkspace 12 | !default.xcworkspace 13 | xcuserdata 14 | profile 15 | *.moved-aside 16 | DerivedData 17 | .idea/ -------------------------------------------------------------------------------- /GRGlassWindow.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | DD0948F6187DBC0C004656C3 /* Roboto-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DD0948EB187DBB51004656C3 /* Roboto-Medium.ttf */; }; 11 | DD0948F7187DBC0C004656C3 /* Roboto-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DD0948EC187DBB51004656C3 /* Roboto-Regular.ttf */; }; 12 | DD12F79E1882323400F401DA /* NSWindow+Screenshot.m in Sources */ = {isa = PBXBuildFile; fileRef = DD12F79D1882323400F401DA /* NSWindow+Screenshot.m */; }; 13 | DD7C8C0A187C9F9500F01C87 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD7C8C09187C9F9500F01C87 /* Cocoa.framework */; }; 14 | DD7C8C14187C9F9500F01C87 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DD7C8C12187C9F9500F01C87 /* InfoPlist.strings */; }; 15 | DD7C8C16187C9F9500F01C87 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7C8C15187C9F9500F01C87 /* main.m */; }; 16 | DD7C8C1A187C9F9500F01C87 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = DD7C8C18187C9F9500F01C87 /* Credits.rtf */; }; 17 | DD7C8C1D187C9F9500F01C87 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7C8C1C187C9F9500F01C87 /* AppDelegate.m */; }; 18 | DD7C8C20187C9F9500F01C87 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = DD7C8C1E187C9F9500F01C87 /* MainMenu.xib */; }; 19 | DD7C8C29187C9F9500F01C87 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD7C8C28187C9F9500F01C87 /* XCTest.framework */; }; 20 | DD7C8C2A187C9F9500F01C87 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD7C8C09187C9F9500F01C87 /* Cocoa.framework */; }; 21 | DD7C8C32187C9F9500F01C87 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DD7C8C30187C9F9500F01C87 /* InfoPlist.strings */; }; 22 | DD7C8C34187C9F9500F01C87 /* GRGlassWindowTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7C8C33187C9F9500F01C87 /* GRGlassWindowTests.m */; }; 23 | DD7C8C3F187CA11800F01C87 /* GRGlassWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7C8C3E187CA11800F01C87 /* GRGlassWindow.m */; }; 24 | DD7C8C4B187CAD1100F01C87 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD7C8C4A187CAD1100F01C87 /* QuartzCore.framework */; }; 25 | DD7C8C4E187CD61100F01C87 /* GRGlassThemeWidget.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7C8C4D187CD61100F01C87 /* GRGlassThemeWidget.m */; }; 26 | F458553F187D6CAB00F07EA0 /* GRGlassAccessoryWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = F458553E187D6CAB00F07EA0 /* GRGlassAccessoryWindow.m */; }; 27 | F45A5B061880262F004B6AC7 /* glassicon.iconset in Resources */ = {isa = PBXBuildFile; fileRef = F45A5B051880262F004B6AC7 /* glassicon.iconset */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | DD7C8C2B187C9F9500F01C87 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = DD7C8BFE187C9F9500F01C87 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = DD7C8C05187C9F9500F01C87; 36 | remoteInfo = GRGlassWindow; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | DD0948EB187DBB51004656C3 /* Roboto-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Medium.ttf"; sourceTree = ""; }; 42 | DD0948EC187DBB51004656C3 /* Roboto-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Regular.ttf"; sourceTree = ""; }; 43 | DD12F79C1882323400F401DA /* NSWindow+Screenshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSWindow+Screenshot.h"; path = "GRGlassWindow Class/NSWindow+Screenshot.h"; sourceTree = ""; }; 44 | DD12F79D1882323400F401DA /* NSWindow+Screenshot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSWindow+Screenshot.m"; path = "GRGlassWindow Class/NSWindow+Screenshot.m"; sourceTree = ""; }; 45 | DD7C8C06187C9F9500F01C87 /* GRGlassWindow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GRGlassWindow.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | DD7C8C09187C9F9500F01C87 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 47 | DD7C8C0C187C9F9500F01C87 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 48 | DD7C8C0D187C9F9500F01C87 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 49 | DD7C8C0E187C9F9500F01C87 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 50 | DD7C8C11187C9F9500F01C87 /* GRGlassWindow-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GRGlassWindow-Info.plist"; sourceTree = ""; }; 51 | DD7C8C13187C9F9500F01C87 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 52 | DD7C8C15187C9F9500F01C87 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 53 | DD7C8C17187C9F9500F01C87 /* GRGlassWindow-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "GRGlassWindow-Prefix.pch"; sourceTree = ""; }; 54 | DD7C8C19187C9F9500F01C87 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 55 | DD7C8C1B187C9F9500F01C87 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 56 | DD7C8C1C187C9F9500F01C87 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 57 | DD7C8C1F187C9F9500F01C87 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 58 | DD7C8C27187C9F9500F01C87 /* GRGlassWindowTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GRGlassWindowTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | DD7C8C28187C9F9500F01C87 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 60 | DD7C8C2F187C9F9500F01C87 /* GRGlassWindowTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GRGlassWindowTests-Info.plist"; sourceTree = ""; }; 61 | DD7C8C31187C9F9500F01C87 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 62 | DD7C8C33187C9F9500F01C87 /* GRGlassWindowTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GRGlassWindowTests.m; sourceTree = ""; }; 63 | DD7C8C3D187CA11800F01C87 /* GRGlassWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GRGlassWindow.h; path = "GRGlassWindow Class/GRGlassWindow.h"; sourceTree = ""; }; 64 | DD7C8C3E187CA11800F01C87 /* GRGlassWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GRGlassWindow.m; path = "GRGlassWindow Class/GRGlassWindow.m"; sourceTree = ""; }; 65 | DD7C8C4A187CAD1100F01C87 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 66 | DD7C8C4C187CD61100F01C87 /* GRGlassThemeWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GRGlassThemeWidget.h; path = "GRGlassWindow Class/GRGlassThemeWidget.h"; sourceTree = ""; }; 67 | DD7C8C4D187CD61100F01C87 /* GRGlassThemeWidget.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GRGlassThemeWidget.m; path = "GRGlassWindow Class/GRGlassThemeWidget.m"; sourceTree = ""; }; 68 | F458553D187D6CAB00F07EA0 /* GRGlassAccessoryWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GRGlassAccessoryWindow.h; path = "GRGlassWindow Class/GRGlassAccessoryWindow.h"; sourceTree = ""; }; 69 | F458553E187D6CAB00F07EA0 /* GRGlassAccessoryWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GRGlassAccessoryWindow.m; path = "GRGlassWindow Class/GRGlassAccessoryWindow.m"; sourceTree = ""; }; 70 | F4585540187D82DB00F07EA0 /* PrivateStuff.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PrivateStuff.h; path = "GRGlassWindow Class/PrivateStuff.h"; sourceTree = ""; }; 71 | F45A5B051880262F004B6AC7 /* glassicon.iconset */ = {isa = PBXFileReference; lastKnownFileType = folder.iconset; path = glassicon.iconset; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | DD7C8C03187C9F9500F01C87 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | DD7C8C4B187CAD1100F01C87 /* QuartzCore.framework in Frameworks */, 80 | DD7C8C0A187C9F9500F01C87 /* Cocoa.framework in Frameworks */, 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | DD7C8C24187C9F9500F01C87 /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | DD7C8C2A187C9F9500F01C87 /* Cocoa.framework in Frameworks */, 89 | DD7C8C29187C9F9500F01C87 /* XCTest.framework in Frameworks */, 90 | ); 91 | runOnlyForDeploymentPostprocessing = 0; 92 | }; 93 | /* End PBXFrameworksBuildPhase section */ 94 | 95 | /* Begin PBXGroup section */ 96 | DD0948E8187DBB27004656C3 /* Resources */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | DD0948F3187DBBF8004656C3 /* Fonts */, 100 | ); 101 | name = Resources; 102 | path = "GRGlassWindow Class/Resources"; 103 | sourceTree = ""; 104 | }; 105 | DD0948F3187DBBF8004656C3 /* Fonts */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | DD0948EB187DBB51004656C3 /* Roboto-Medium.ttf */, 109 | DD0948EC187DBB51004656C3 /* Roboto-Regular.ttf */, 110 | ); 111 | name = Fonts; 112 | sourceTree = ""; 113 | }; 114 | DD7C8BFD187C9F9500F01C87 = { 115 | isa = PBXGroup; 116 | children = ( 117 | F45A5B051880262F004B6AC7 /* glassicon.iconset */, 118 | DD7C8C0F187C9F9500F01C87 /* GRGlassWindow */, 119 | DD7C8C2D187C9F9500F01C87 /* GRGlassWindowTests */, 120 | DD7C8C08187C9F9500F01C87 /* Frameworks */, 121 | DD7C8C07187C9F9500F01C87 /* Products */, 122 | ); 123 | sourceTree = ""; 124 | }; 125 | DD7C8C07187C9F9500F01C87 /* Products */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | DD7C8C06187C9F9500F01C87 /* GRGlassWindow.app */, 129 | DD7C8C27187C9F9500F01C87 /* GRGlassWindowTests.xctest */, 130 | ); 131 | name = Products; 132 | sourceTree = ""; 133 | }; 134 | DD7C8C08187C9F9500F01C87 /* Frameworks */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | DD7C8C4A187CAD1100F01C87 /* QuartzCore.framework */, 138 | DD7C8C09187C9F9500F01C87 /* Cocoa.framework */, 139 | DD7C8C28187C9F9500F01C87 /* XCTest.framework */, 140 | DD7C8C0B187C9F9500F01C87 /* Other Frameworks */, 141 | ); 142 | name = Frameworks; 143 | sourceTree = ""; 144 | }; 145 | DD7C8C0B187C9F9500F01C87 /* Other Frameworks */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | DD7C8C0C187C9F9500F01C87 /* AppKit.framework */, 149 | DD7C8C0D187C9F9500F01C87 /* CoreData.framework */, 150 | DD7C8C0E187C9F9500F01C87 /* Foundation.framework */, 151 | ); 152 | name = "Other Frameworks"; 153 | sourceTree = ""; 154 | }; 155 | DD7C8C0F187C9F9500F01C87 /* GRGlassWindow */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | DD7C8C1B187C9F9500F01C87 /* AppDelegate.h */, 159 | DD7C8C1C187C9F9500F01C87 /* AppDelegate.m */, 160 | DD7C8C1E187C9F9500F01C87 /* MainMenu.xib */, 161 | DD7C8C10187C9F9500F01C87 /* Supporting Files */, 162 | DD7C8C40187CA11D00F01C87 /* GRGlassWindow Class */, 163 | ); 164 | path = GRGlassWindow; 165 | sourceTree = ""; 166 | }; 167 | DD7C8C10187C9F9500F01C87 /* Supporting Files */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | DD7C8C11187C9F9500F01C87 /* GRGlassWindow-Info.plist */, 171 | DD7C8C12187C9F9500F01C87 /* InfoPlist.strings */, 172 | DD7C8C15187C9F9500F01C87 /* main.m */, 173 | DD7C8C17187C9F9500F01C87 /* GRGlassWindow-Prefix.pch */, 174 | DD7C8C18187C9F9500F01C87 /* Credits.rtf */, 175 | ); 176 | name = "Supporting Files"; 177 | sourceTree = ""; 178 | }; 179 | DD7C8C2D187C9F9500F01C87 /* GRGlassWindowTests */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | DD7C8C33187C9F9500F01C87 /* GRGlassWindowTests.m */, 183 | DD7C8C2E187C9F9500F01C87 /* Supporting Files */, 184 | ); 185 | path = GRGlassWindowTests; 186 | sourceTree = ""; 187 | }; 188 | DD7C8C2E187C9F9500F01C87 /* Supporting Files */ = { 189 | isa = PBXGroup; 190 | children = ( 191 | DD7C8C2F187C9F9500F01C87 /* GRGlassWindowTests-Info.plist */, 192 | DD7C8C30187C9F9500F01C87 /* InfoPlist.strings */, 193 | ); 194 | name = "Supporting Files"; 195 | sourceTree = ""; 196 | }; 197 | DD7C8C40187CA11D00F01C87 /* GRGlassWindow Class */ = { 198 | isa = PBXGroup; 199 | children = ( 200 | DD0948E8187DBB27004656C3 /* Resources */, 201 | DD7C8C3D187CA11800F01C87 /* GRGlassWindow.h */, 202 | DD7C8C3E187CA11800F01C87 /* GRGlassWindow.m */, 203 | DD7C8C4C187CD61100F01C87 /* GRGlassThemeWidget.h */, 204 | DD7C8C4D187CD61100F01C87 /* GRGlassThemeWidget.m */, 205 | F458553D187D6CAB00F07EA0 /* GRGlassAccessoryWindow.h */, 206 | F458553E187D6CAB00F07EA0 /* GRGlassAccessoryWindow.m */, 207 | F4585540187D82DB00F07EA0 /* PrivateStuff.h */, 208 | DD12F79C1882323400F401DA /* NSWindow+Screenshot.h */, 209 | DD12F79D1882323400F401DA /* NSWindow+Screenshot.m */, 210 | ); 211 | name = "GRGlassWindow Class"; 212 | sourceTree = ""; 213 | }; 214 | /* End PBXGroup section */ 215 | 216 | /* Begin PBXNativeTarget section */ 217 | DD7C8C05187C9F9500F01C87 /* GRGlassWindow */ = { 218 | isa = PBXNativeTarget; 219 | buildConfigurationList = DD7C8C37187C9F9500F01C87 /* Build configuration list for PBXNativeTarget "GRGlassWindow" */; 220 | buildPhases = ( 221 | DD7C8C02187C9F9500F01C87 /* Sources */, 222 | DD7C8C03187C9F9500F01C87 /* Frameworks */, 223 | DD7C8C04187C9F9500F01C87 /* Resources */, 224 | ); 225 | buildRules = ( 226 | ); 227 | dependencies = ( 228 | ); 229 | name = GRGlassWindow; 230 | productName = GRGlassWindow; 231 | productReference = DD7C8C06187C9F9500F01C87 /* GRGlassWindow.app */; 232 | productType = "com.apple.product-type.application"; 233 | }; 234 | DD7C8C26187C9F9500F01C87 /* GRGlassWindowTests */ = { 235 | isa = PBXNativeTarget; 236 | buildConfigurationList = DD7C8C3A187C9F9500F01C87 /* Build configuration list for PBXNativeTarget "GRGlassWindowTests" */; 237 | buildPhases = ( 238 | DD7C8C23187C9F9500F01C87 /* Sources */, 239 | DD7C8C24187C9F9500F01C87 /* Frameworks */, 240 | DD7C8C25187C9F9500F01C87 /* Resources */, 241 | ); 242 | buildRules = ( 243 | ); 244 | dependencies = ( 245 | DD7C8C2C187C9F9500F01C87 /* PBXTargetDependency */, 246 | ); 247 | name = GRGlassWindowTests; 248 | productName = GRGlassWindowTests; 249 | productReference = DD7C8C27187C9F9500F01C87 /* GRGlassWindowTests.xctest */; 250 | productType = "com.apple.product-type.bundle.unit-test"; 251 | }; 252 | /* End PBXNativeTarget section */ 253 | 254 | /* Begin PBXProject section */ 255 | DD7C8BFE187C9F9500F01C87 /* Project object */ = { 256 | isa = PBXProject; 257 | attributes = { 258 | LastUpgradeCheck = 0500; 259 | ORGANIZATIONNAME = "Guilherme Rambo"; 260 | TargetAttributes = { 261 | DD7C8C26187C9F9500F01C87 = { 262 | TestTargetID = DD7C8C05187C9F9500F01C87; 263 | }; 264 | }; 265 | }; 266 | buildConfigurationList = DD7C8C01187C9F9500F01C87 /* Build configuration list for PBXProject "GRGlassWindow" */; 267 | compatibilityVersion = "Xcode 3.2"; 268 | developmentRegion = English; 269 | hasScannedForEncodings = 0; 270 | knownRegions = ( 271 | en, 272 | Base, 273 | ); 274 | mainGroup = DD7C8BFD187C9F9500F01C87; 275 | productRefGroup = DD7C8C07187C9F9500F01C87 /* Products */; 276 | projectDirPath = ""; 277 | projectRoot = ""; 278 | targets = ( 279 | DD7C8C05187C9F9500F01C87 /* GRGlassWindow */, 280 | DD7C8C26187C9F9500F01C87 /* GRGlassWindowTests */, 281 | ); 282 | }; 283 | /* End PBXProject section */ 284 | 285 | /* Begin PBXResourcesBuildPhase section */ 286 | DD7C8C04187C9F9500F01C87 /* Resources */ = { 287 | isa = PBXResourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | F45A5B061880262F004B6AC7 /* glassicon.iconset in Resources */, 291 | DD0948F6187DBC0C004656C3 /* Roboto-Medium.ttf in Resources */, 292 | DD0948F7187DBC0C004656C3 /* Roboto-Regular.ttf in Resources */, 293 | DD7C8C14187C9F9500F01C87 /* InfoPlist.strings in Resources */, 294 | DD7C8C1A187C9F9500F01C87 /* Credits.rtf in Resources */, 295 | DD7C8C20187C9F9500F01C87 /* MainMenu.xib in Resources */, 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | }; 299 | DD7C8C25187C9F9500F01C87 /* Resources */ = { 300 | isa = PBXResourcesBuildPhase; 301 | buildActionMask = 2147483647; 302 | files = ( 303 | DD7C8C32187C9F9500F01C87 /* InfoPlist.strings in Resources */, 304 | ); 305 | runOnlyForDeploymentPostprocessing = 0; 306 | }; 307 | /* End PBXResourcesBuildPhase section */ 308 | 309 | /* Begin PBXSourcesBuildPhase section */ 310 | DD7C8C02187C9F9500F01C87 /* Sources */ = { 311 | isa = PBXSourcesBuildPhase; 312 | buildActionMask = 2147483647; 313 | files = ( 314 | DD7C8C4E187CD61100F01C87 /* GRGlassThemeWidget.m in Sources */, 315 | DD7C8C3F187CA11800F01C87 /* GRGlassWindow.m in Sources */, 316 | DD12F79E1882323400F401DA /* NSWindow+Screenshot.m in Sources */, 317 | DD7C8C1D187C9F9500F01C87 /* AppDelegate.m in Sources */, 318 | DD7C8C16187C9F9500F01C87 /* main.m in Sources */, 319 | F458553F187D6CAB00F07EA0 /* GRGlassAccessoryWindow.m in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | DD7C8C23187C9F9500F01C87 /* Sources */ = { 324 | isa = PBXSourcesBuildPhase; 325 | buildActionMask = 2147483647; 326 | files = ( 327 | DD7C8C34187C9F9500F01C87 /* GRGlassWindowTests.m in Sources */, 328 | ); 329 | runOnlyForDeploymentPostprocessing = 0; 330 | }; 331 | /* End PBXSourcesBuildPhase section */ 332 | 333 | /* Begin PBXTargetDependency section */ 334 | DD7C8C2C187C9F9500F01C87 /* PBXTargetDependency */ = { 335 | isa = PBXTargetDependency; 336 | target = DD7C8C05187C9F9500F01C87 /* GRGlassWindow */; 337 | targetProxy = DD7C8C2B187C9F9500F01C87 /* PBXContainerItemProxy */; 338 | }; 339 | /* End PBXTargetDependency section */ 340 | 341 | /* Begin PBXVariantGroup section */ 342 | DD7C8C12187C9F9500F01C87 /* InfoPlist.strings */ = { 343 | isa = PBXVariantGroup; 344 | children = ( 345 | DD7C8C13187C9F9500F01C87 /* en */, 346 | ); 347 | name = InfoPlist.strings; 348 | sourceTree = ""; 349 | }; 350 | DD7C8C18187C9F9500F01C87 /* Credits.rtf */ = { 351 | isa = PBXVariantGroup; 352 | children = ( 353 | DD7C8C19187C9F9500F01C87 /* en */, 354 | ); 355 | name = Credits.rtf; 356 | sourceTree = ""; 357 | }; 358 | DD7C8C1E187C9F9500F01C87 /* MainMenu.xib */ = { 359 | isa = PBXVariantGroup; 360 | children = ( 361 | DD7C8C1F187C9F9500F01C87 /* Base */, 362 | ); 363 | name = MainMenu.xib; 364 | sourceTree = ""; 365 | }; 366 | DD7C8C30187C9F9500F01C87 /* InfoPlist.strings */ = { 367 | isa = PBXVariantGroup; 368 | children = ( 369 | DD7C8C31187C9F9500F01C87 /* en */, 370 | ); 371 | name = InfoPlist.strings; 372 | sourceTree = ""; 373 | }; 374 | /* End PBXVariantGroup section */ 375 | 376 | /* Begin XCBuildConfiguration section */ 377 | DD7C8C35187C9F9500F01C87 /* Debug */ = { 378 | isa = XCBuildConfiguration; 379 | buildSettings = { 380 | ALWAYS_SEARCH_USER_PATHS = NO; 381 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 382 | CLANG_CXX_LIBRARY = "libc++"; 383 | CLANG_ENABLE_OBJC_ARC = YES; 384 | CLANG_WARN_BOOL_CONVERSION = YES; 385 | CLANG_WARN_CONSTANT_CONVERSION = YES; 386 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 387 | CLANG_WARN_EMPTY_BODY = YES; 388 | CLANG_WARN_ENUM_CONVERSION = YES; 389 | CLANG_WARN_INT_CONVERSION = YES; 390 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 391 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 392 | COPY_PHASE_STRIP = NO; 393 | GCC_C_LANGUAGE_STANDARD = gnu99; 394 | GCC_DYNAMIC_NO_PIC = NO; 395 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 396 | GCC_OPTIMIZATION_LEVEL = 0; 397 | GCC_PREPROCESSOR_DEFINITIONS = ( 398 | "DEBUG=1", 399 | "$(inherited)", 400 | ); 401 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 402 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 403 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 404 | GCC_WARN_UNDECLARED_SELECTOR = YES; 405 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 406 | GCC_WARN_UNUSED_FUNCTION = YES; 407 | GCC_WARN_UNUSED_VARIABLE = YES; 408 | MACOSX_DEPLOYMENT_TARGET = 10.9; 409 | ONLY_ACTIVE_ARCH = YES; 410 | SDKROOT = macosx; 411 | }; 412 | name = Debug; 413 | }; 414 | DD7C8C36187C9F9500F01C87 /* Release */ = { 415 | isa = XCBuildConfiguration; 416 | buildSettings = { 417 | ALWAYS_SEARCH_USER_PATHS = NO; 418 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 419 | CLANG_CXX_LIBRARY = "libc++"; 420 | CLANG_ENABLE_OBJC_ARC = YES; 421 | CLANG_WARN_BOOL_CONVERSION = YES; 422 | CLANG_WARN_CONSTANT_CONVERSION = YES; 423 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 424 | CLANG_WARN_EMPTY_BODY = YES; 425 | CLANG_WARN_ENUM_CONVERSION = YES; 426 | CLANG_WARN_INT_CONVERSION = YES; 427 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 428 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 429 | COPY_PHASE_STRIP = YES; 430 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 431 | ENABLE_NS_ASSERTIONS = NO; 432 | GCC_C_LANGUAGE_STANDARD = gnu99; 433 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 434 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 435 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 436 | GCC_WARN_UNDECLARED_SELECTOR = YES; 437 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 438 | GCC_WARN_UNUSED_FUNCTION = YES; 439 | GCC_WARN_UNUSED_VARIABLE = YES; 440 | MACOSX_DEPLOYMENT_TARGET = 10.9; 441 | SDKROOT = macosx; 442 | }; 443 | name = Release; 444 | }; 445 | DD7C8C38187C9F9500F01C87 /* Debug */ = { 446 | isa = XCBuildConfiguration; 447 | buildSettings = { 448 | COMBINE_HIDPI_IMAGES = YES; 449 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 450 | GCC_PREFIX_HEADER = "GRGlassWindow/GRGlassWindow-Prefix.pch"; 451 | INFOPLIST_FILE = "GRGlassWindow/GRGlassWindow-Info.plist"; 452 | MACOSX_DEPLOYMENT_TARGET = 10.7; 453 | PRODUCT_NAME = "$(TARGET_NAME)"; 454 | WRAPPER_EXTENSION = app; 455 | }; 456 | name = Debug; 457 | }; 458 | DD7C8C39187C9F9500F01C87 /* Release */ = { 459 | isa = XCBuildConfiguration; 460 | buildSettings = { 461 | COMBINE_HIDPI_IMAGES = YES; 462 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 463 | GCC_PREFIX_HEADER = "GRGlassWindow/GRGlassWindow-Prefix.pch"; 464 | INFOPLIST_FILE = "GRGlassWindow/GRGlassWindow-Info.plist"; 465 | MACOSX_DEPLOYMENT_TARGET = 10.7; 466 | PRODUCT_NAME = "$(TARGET_NAME)"; 467 | WRAPPER_EXTENSION = app; 468 | }; 469 | name = Release; 470 | }; 471 | DD7C8C3B187C9F9500F01C87 /* Debug */ = { 472 | isa = XCBuildConfiguration; 473 | buildSettings = { 474 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/GRGlassWindow.app/Contents/MacOS/GRGlassWindow"; 475 | COMBINE_HIDPI_IMAGES = YES; 476 | FRAMEWORK_SEARCH_PATHS = ( 477 | "$(DEVELOPER_FRAMEWORKS_DIR)", 478 | "$(inherited)", 479 | ); 480 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 481 | GCC_PREFIX_HEADER = "GRGlassWindow/GRGlassWindow-Prefix.pch"; 482 | GCC_PREPROCESSOR_DEFINITIONS = ( 483 | "DEBUG=1", 484 | "$(inherited)", 485 | ); 486 | INFOPLIST_FILE = "GRGlassWindowTests/GRGlassWindowTests-Info.plist"; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | TEST_HOST = "$(BUNDLE_LOADER)"; 489 | WRAPPER_EXTENSION = xctest; 490 | }; 491 | name = Debug; 492 | }; 493 | DD7C8C3C187C9F9500F01C87 /* Release */ = { 494 | isa = XCBuildConfiguration; 495 | buildSettings = { 496 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/GRGlassWindow.app/Contents/MacOS/GRGlassWindow"; 497 | COMBINE_HIDPI_IMAGES = YES; 498 | FRAMEWORK_SEARCH_PATHS = ( 499 | "$(DEVELOPER_FRAMEWORKS_DIR)", 500 | "$(inherited)", 501 | ); 502 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 503 | GCC_PREFIX_HEADER = "GRGlassWindow/GRGlassWindow-Prefix.pch"; 504 | INFOPLIST_FILE = "GRGlassWindowTests/GRGlassWindowTests-Info.plist"; 505 | PRODUCT_NAME = "$(TARGET_NAME)"; 506 | TEST_HOST = "$(BUNDLE_LOADER)"; 507 | WRAPPER_EXTENSION = xctest; 508 | }; 509 | name = Release; 510 | }; 511 | /* End XCBuildConfiguration section */ 512 | 513 | /* Begin XCConfigurationList section */ 514 | DD7C8C01187C9F9500F01C87 /* Build configuration list for PBXProject "GRGlassWindow" */ = { 515 | isa = XCConfigurationList; 516 | buildConfigurations = ( 517 | DD7C8C35187C9F9500F01C87 /* Debug */, 518 | DD7C8C36187C9F9500F01C87 /* Release */, 519 | ); 520 | defaultConfigurationIsVisible = 0; 521 | defaultConfigurationName = Release; 522 | }; 523 | DD7C8C37187C9F9500F01C87 /* Build configuration list for PBXNativeTarget "GRGlassWindow" */ = { 524 | isa = XCConfigurationList; 525 | buildConfigurations = ( 526 | DD7C8C38187C9F9500F01C87 /* Debug */, 527 | DD7C8C39187C9F9500F01C87 /* Release */, 528 | ); 529 | defaultConfigurationIsVisible = 0; 530 | defaultConfigurationName = Release; 531 | }; 532 | DD7C8C3A187C9F9500F01C87 /* Build configuration list for PBXNativeTarget "GRGlassWindowTests" */ = { 533 | isa = XCConfigurationList; 534 | buildConfigurations = ( 535 | DD7C8C3B187C9F9500F01C87 /* Debug */, 536 | DD7C8C3C187C9F9500F01C87 /* Release */, 537 | ); 538 | defaultConfigurationIsVisible = 0; 539 | defaultConfigurationName = Release; 540 | }; 541 | /* End XCConfigurationList section */ 542 | }; 543 | rootObject = DD7C8BFE187C9F9500F01C87 /* Project object */; 544 | } 545 | -------------------------------------------------------------------------------- /GRGlassWindow/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GRGlassWindow.h" 11 | 12 | @interface AppDelegate : NSObject 13 | 14 | @property (assign) IBOutlet GRGlassWindow *window; 15 | @property (weak) IBOutlet NSView *toolbarView; 16 | 17 | @property (nonatomic, copy) NSMutableArray *pictures; 18 | @property (weak) IBOutlet NSScrollView *scrollView; 19 | 20 | @end -------------------------------------------------------------------------------- /GRGlassWindow/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | { 13 | NSView *_paddingView; 14 | NSCollectionView *_collectionView; 15 | } 16 | 17 | // don't look at this code too much, It's just for demonstration purposes :( 18 | 19 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 20 | { 21 | self.window.backgroundColor = [NSColor whiteColor]; 22 | 23 | NSMutableArray *newPictures = [[NSMutableArray alloc] init]; 24 | 25 | for (int i = 0; i < 20; i++) { 26 | NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtURL:[NSURL fileURLWithPath:@"/Library/Desktop Pictures/.thumbnails"] includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsSubdirectoryDescendants errorHandler:nil]; 27 | 28 | NSURL *file; 29 | while (file = [dirEnum nextObject]) { 30 | NSImage *image = [[NSImage alloc] initWithContentsOfURL:file]; 31 | [newPictures addObject:@{@"image": image}]; 32 | } 33 | } 34 | 35 | self.pictures = [newPictures mutableCopy]; 36 | 37 | self.window.subtitle = [NSString stringWithFormat:@"%ld pictures", self.pictures.count]; 38 | 39 | self.window.accessoryView = self.toolbarView; 40 | 41 | // this adds some padding to the top of the scrollview, but it doesn't work very well =\ 42 | // NSRect originalFrame = [self.scrollView.documentView frame]; 43 | // _paddingView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, NSWidth(originalFrame), NSHeight(originalFrame))]; 44 | // _paddingView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable; 45 | // _collectionView = self.scrollView.documentView; 46 | // [_collectionView removeFromSuperview]; 47 | // 48 | // [_paddingView addSubview:_collectionView]; 49 | // self.scrollView.documentView = _paddingView; 50 | // 51 | // originalFrame.origin.y -= 52; 52 | // _collectionView.frame = originalFrame; 53 | } 54 | 55 | @end -------------------------------------------------------------------------------- /GRGlassWindow/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | Default 523 | 524 | 525 | 526 | 527 | 528 | 529 | Left to Right 530 | 531 | 532 | 533 | 534 | 535 | 536 | Right to Left 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | Default 548 | 549 | 550 | 551 | 552 | 553 | 554 | Left to Right 555 | 556 | 557 | 558 | 559 | 560 | 561 | Right to Left 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 687 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | image 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/GRGlassAccessoryWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassAccessoryWindow.h 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 08/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | /* 10 | GRGlassAccessoryWindow is a NSWindow subclass used as the titlebar of GRGlassWindow, 11 | I decided to use a child window instead of NSView or CALayers because the drawing performance is a lot better, 12 | this also makes It easier to add views to the title bar 13 | */ 14 | 15 | /* You don't have to deal with this, but if you want to customize the title bar look, go ahead :) */ 16 | 17 | #import 18 | #import "PrivateStuff.h" 19 | 20 | #define kGRGlassWindowTitleBarHeight 52.0 21 | 22 | @interface GRGlassAccessoryWindow : NSWindow 23 | 24 | @property (nonatomic, strong) NSView *accessoryView; 25 | 26 | @property (nonatomic, assign) int blurRadius; 27 | @property (nonatomic, assign) BOOL hides; 28 | @property (nonatomic, copy) NSString *subtitle; 29 | 30 | @end 31 | 32 | @interface GRGlassAccessoryWindowTitleProxyView : NSControl 33 | 34 | @end 35 | 36 | @interface GRGlassTitleBarView : NSThemeFrame 37 | 38 | @property (nonatomic, copy) NSString *title; 39 | @property (nonatomic, copy) NSString *subtitle; 40 | 41 | @property (nonatomic, assign) BOOL centerWidgets; 42 | 43 | @property (nonatomic, assign) BOOL hides; 44 | 45 | - (void)resetWidgets; 46 | 47 | @end -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/GRGlassAccessoryWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassAccessoryWindow.m 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 08/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "GRGlassAccessoryWindow.h" 10 | #import "GRGlassThemeWidget.h" 11 | #import 12 | 13 | #define kGRGlassAccessoryWindowDefaultBlurRadius 20 14 | 15 | @implementation GRGlassAccessoryWindow 16 | { 17 | // this view is used to drag our parent window 18 | GRGlassAccessoryWindowTitleProxyView *_titleProxyView; 19 | } 20 | 21 | - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 22 | { 23 | self = [super initWithContentRect:contentRect styleMask:NSTitledWindowMask backing:bufferingType defer:flag]; 24 | if(!self) return nil; 25 | 26 | // this window will not look like a window, 27 | // so we make sure it's not movable, 28 | // has no shadow and is not opaque (this is important) 29 | [self setMovable:NO]; 30 | [self setOpaque:NO]; 31 | [self setHasShadow:NO]; 32 | 33 | // white background with a little transparency 34 | self.backgroundColor = [NSColor colorWithCalibratedWhite:1.0 alpha:0.8]; 35 | 36 | // set default blur radius 37 | _blurRadius = kGRGlassAccessoryWindowDefaultBlurRadius; 38 | 39 | // here we create our title proxy view, used to drag the parent window 40 | _titleProxyView = [[GRGlassAccessoryWindowTitleProxyView alloc] initWithFrame:[self.contentView superview].bounds]; 41 | _titleProxyView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable|NSViewMinXMargin|NSViewMinYMargin; 42 | [self setContentView:_titleProxyView]; 43 | 44 | // if we don't call this our window's controls can't receive events 45 | [self orderWindow:NSWindowAbove relativeTo:[self.parentWindow windowNumber]]; 46 | [self.parentWindow becomeMainWindow]; 47 | 48 | return self; 49 | } 50 | 51 | + (Class)frameViewClassForStyleMask:(NSInteger)styleMask 52 | { 53 | return [GRGlassTitleBarView class]; 54 | } 55 | 56 | - (BOOL)_usesCustomDrawing 57 | { 58 | return NO; 59 | } 60 | 61 | - (BOOL)acceptsFirstResponder 62 | { 63 | return YES; 64 | } 65 | 66 | - (BOOL)canBecomeKeyWindow 67 | { 68 | return YES; 69 | } 70 | 71 | - (BOOL)canBecomeMainWindow 72 | { 73 | return NO; 74 | } 75 | 76 | - (void)orderFront:(id)sender 77 | { 78 | [super orderFront:sender]; 79 | [self installBlur]; 80 | } 81 | 82 | - (void)setParentWindow:(NSWindow *)window 83 | { 84 | [super setParentWindow:window]; 85 | [self installBlur]; 86 | } 87 | 88 | - (void)setBlurRadius:(int)blurRadius 89 | { 90 | _blurRadius = blurRadius; 91 | [self installBlur]; 92 | } 93 | 94 | // this method will setup the window's background blur 95 | // it must be called after the window is on screen 96 | - (void)installBlur 97 | { 98 | CGSConnection connection = CGSDefaultConnectionForThread(); 99 | CGSSetWindowBackgroundBlurRadius(connection, [self windowNumber], self.blurRadius); 100 | } 101 | 102 | - (void)setTitle:(NSString *)aString 103 | { 104 | [super setTitle:aString]; 105 | 106 | GRGlassTitleBarView *titleBarView = (GRGlassTitleBarView *)[self.contentView superview]; 107 | titleBarView.title = aString; 108 | } 109 | 110 | - (void)setSubtitle:(NSString *)subtitle 111 | { 112 | GRGlassTitleBarView *titleBarView = (GRGlassTitleBarView *)[self.contentView superview]; 113 | titleBarView.subtitle = subtitle; 114 | } 115 | 116 | - (void)setHides:(BOOL)hides 117 | { 118 | _hides = hides; 119 | GRGlassTitleBarView *titleBarView = (GRGlassTitleBarView *)[self.contentView superview]; 120 | titleBarView.hides = hides; 121 | } 122 | 123 | - (void)setAccessoryView:(NSView *)accessoryView 124 | { 125 | _accessoryView = accessoryView; 126 | [_accessoryView setFrameOrigin:NSMakePoint(NSWidth(self.frame)-NSWidth(_accessoryView.frame), 0)]; 127 | _accessoryView.autoresizingMask = NSViewMinXMargin|NSViewMinYMargin; 128 | [self.contentView addSubview:_accessoryView]; 129 | } 130 | 131 | @end 132 | 133 | // this view will drag It's window's parent window, basically working like a title bar :) 134 | @implementation GRGlassAccessoryWindowTitleProxyView 135 | { 136 | NSTrackingArea *_area; 137 | NSPoint _dragStart; 138 | BOOL _dragged; 139 | } 140 | 141 | - (void)updateTrackingAreas 142 | { 143 | if(_area) [self removeTrackingArea:_area]; 144 | 145 | _area = [[NSTrackingArea alloc] initWithRect:self.frame options:NSTrackingInVisibleRect|NSTrackingMouseMoved|NSTrackingActiveAlways owner:self userInfo:nil]; 146 | [self addTrackingArea:_area]; 147 | } 148 | 149 | - (void)mouseDown:(NSEvent *)theEvent 150 | { 151 | _dragStart = [theEvent locationInWindow]; 152 | } 153 | 154 | #define kOSXMenuBarHeight 22.0 155 | - (void)mouseDragged:(NSEvent *)theEvent 156 | { 157 | _dragged = YES; 158 | 159 | NSPoint mouseLocation = [NSEvent mouseLocation]; 160 | 161 | CGFloat windowY = round(mouseLocation.y-_dragStart.y-NSHeight(self.window.parentWindow.frame)+NSHeight(self.window.frame)); 162 | CGFloat maxWindowY = round(NSHeight(self.window.parentWindow.screen.frame)-NSHeight(self.window.parentWindow.frame)-kOSXMenuBarHeight); 163 | 164 | windowY = MIN(windowY, maxWindowY); 165 | 166 | NSPoint newPoint = NSMakePoint(mouseLocation.x-_dragStart.x, windowY); 167 | [self.window.parentWindow setFrameOrigin:newPoint]; 168 | } 169 | 170 | - (void)mouseUp:(NSEvent *)theEvent 171 | { 172 | if(!_dragged) return; 173 | 174 | [self.window.parentWindow becomeKeyWindow]; 175 | _dragged = NO; 176 | } 177 | 178 | - (BOOL)acceptsFirstResponder 179 | { 180 | return YES; 181 | } 182 | 183 | - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent 184 | { 185 | return YES; 186 | } 187 | 188 | @end 189 | 190 | @implementation GRGlassTitleBarView 191 | { 192 | GRGlassThemeWidget *_closeWidget; 193 | GRGlassThemeWidget *_miniaturizeWidget; 194 | GRGlassThemeWidget *_zoomWidget; 195 | 196 | NSTrackingArea *_widgetTrackingArea; 197 | 198 | NSTrackingArea *_generalTrackingArea; 199 | } 200 | 201 | + (NSDictionary *)widgetUserInfo 202 | { 203 | static NSDictionary *_widgetUserInfo; 204 | 205 | static dispatch_once_t onceToken; 206 | dispatch_once(&onceToken, ^{ 207 | _widgetUserInfo = @{@"isWidget": @1}; 208 | }); 209 | 210 | return _widgetUserInfo; 211 | } 212 | 213 | - (void)_setContentView:(id)view 214 | { 215 | [super _setContentView:view]; 216 | 217 | [self installWidgets]; 218 | } 219 | 220 | #define kGRGlassThemeWidgetSpacing 8.0 221 | 222 | - (CGFloat)widgetY 223 | { 224 | return (self.centerWidgets) ? round(kGRGlassWindowTitleBarHeight/2-kGRGlassThemeWidgetSize/2) : NSHeight(self.frame)-kGRGlassThemeWidgetSize-kGRGlassThemeWidgetSpacing; 225 | } 226 | 227 | - (void)installWidgets 228 | { 229 | // centered widgets 230 | // CGFloat widgetY = kGRGlassWindowTitleBarHeight/2-kGRGlassThemeWidgetSize/2; 231 | 232 | CGFloat widgetY = [self widgetY]; 233 | 234 | _closeWidget = [[GRGlassThemeWidget alloc] initWithFrame:NSMakeRect(kGRGlassThemeWidgetSpacing, widgetY, kGRGlassThemeWidgetSize, kGRGlassThemeWidgetSize)]; 235 | _closeWidget.type = GRGlassThemeWidgetTypeClose; 236 | 237 | _miniaturizeWidget = [[GRGlassThemeWidget alloc] initWithFrame:NSMakeRect(_closeWidget.frame.origin.x+kGRGlassThemeWidgetSize+kGRGlassThemeWidgetSpacing, widgetY, kGRGlassThemeWidgetSize, kGRGlassThemeWidgetSize)]; 238 | _miniaturizeWidget.type = GRGlassThemeWidgetTypeMiniaturize; 239 | 240 | _zoomWidget = [[GRGlassThemeWidget alloc] initWithFrame:NSMakeRect(_miniaturizeWidget.frame.origin.x+kGRGlassThemeWidgetSize+kGRGlassThemeWidgetSpacing, widgetY, kGRGlassThemeWidgetSize, kGRGlassThemeWidgetSize)]; 241 | _zoomWidget.type = GRGlassThemeWidgetTypeZoom; 242 | 243 | [self.window.contentView addSubview:_closeWidget]; 244 | [self.window.contentView addSubview:_miniaturizeWidget]; 245 | [self.window.contentView addSubview:_zoomWidget]; 246 | } 247 | 248 | - (void)resetWidgets 249 | { 250 | _closeWidget.hover = NO; 251 | _miniaturizeWidget.hover = NO; 252 | _zoomWidget.hover = NO; 253 | } 254 | 255 | // small title bar height just to make the top corner rounded 256 | + (double)_titlebarHeight:(unsigned long long)arg1 257 | { 258 | return 5; 259 | } 260 | 261 | // makes the contentview stick to the top of the window ignoring the invisible title bar 262 | + (double)_contentToFrameMaxYHeight:(unsigned long long)arg1 263 | { 264 | return 0; 265 | } 266 | 267 | // draws a path making the top rounded and the bottom flat 268 | - (void)drawRect:(NSRect)dirtyRect 269 | { 270 | [[NSColor clearColor] setFill]; 271 | NSRectFill(dirtyRect); 272 | 273 | CGFloat cornerRadius = 5; 274 | NSRect innerRect = NSInsetRect(self.frame, cornerRadius, cornerRadius); 275 | NSBezierPath *barPath = [NSBezierPath bezierPath]; 276 | [barPath moveToPoint: NSMakePoint(NSMinX(self.frame), NSMinY(self.frame))]; 277 | [barPath lineToPoint: NSMakePoint(NSMaxX(self.frame), NSMinY(self.frame))]; 278 | [barPath appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(innerRect), NSMaxY(innerRect)) radius:cornerRadius startAngle:0 endAngle:90]; 279 | [barPath appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(innerRect), NSMaxY(innerRect)) radius:cornerRadius startAngle:90 endAngle:180]; 280 | [barPath closePath]; 281 | 282 | [barPath addClip]; 283 | 284 | [self.window.backgroundColor setFill]; 285 | NSRectFill(dirtyRect); 286 | 287 | NSRect separatorRect = NSMakeRect(0, .5, NSWidth(self.frame), .5); 288 | [[NSColor colorWithCalibratedWhite:0.1 alpha:1] setFill]; 289 | NSRectFill(separatorRect); 290 | 291 | [self drawTitle]; 292 | } 293 | 294 | - (void)drawTitle 295 | { 296 | if(!self.title) return; 297 | 298 | NSShadow *titleShadow = [[NSShadow alloc] init]; 299 | titleShadow.shadowColor = [NSColor colorWithCalibratedWhite:1.0 alpha:0.7]; 300 | titleShadow.shadowOffset = NSMakeSize(0, -1); 301 | 302 | NSDictionary *titleAttributes = @{NSFontAttributeName: [NSFont fontWithName:@"Roboto-Medium" size:14.0], 303 | NSForegroundColorAttributeName : [NSColor colorWithCalibratedWhite:0.1 alpha:0.9], 304 | NSShadowAttributeName : titleShadow}; 305 | NSAttributedString *titleAttributedString = [[NSAttributedString alloc] initWithString:self.title attributes:titleAttributes]; 306 | 307 | NSPoint titlePoint; 308 | if(self.centerWidgets) { 309 | titlePoint = NSMakePoint(round(NSWidth(self.frame)/2-titleAttributedString.size.width/2), NSHeight(self.frame)-titleAttributedString.size.height-1); 310 | } else { 311 | titlePoint = NSMakePoint(round(NSWidth(self.frame)/2-titleAttributedString.size.width/2), [self widgetY]-3); 312 | } 313 | 314 | [titleAttributedString drawAtPoint:titlePoint]; 315 | 316 | if(!self.subtitle) return; 317 | 318 | NSDictionary *subtitleAttributes = @{NSFontAttributeName: [NSFont fontWithName:@"Roboto-Regular" size:12.0], NSForegroundColorAttributeName : [NSColor colorWithCalibratedWhite:0.3 alpha:0.8]}; 319 | NSAttributedString *subtitleAttributedString = [[NSAttributedString alloc] initWithString:self.subtitle attributes:subtitleAttributes]; 320 | NSPoint subtitlePoint = NSMakePoint(round(NSWidth(self.frame)/2-subtitleAttributedString.size.width/2), NSHeight(self.frame)-subtitleAttributedString.size.height-25); 321 | [subtitleAttributedString drawAtPoint:subtitlePoint]; 322 | } 323 | 324 | // makes the bottom corner flat 325 | - (void)_maskCorners:(NSUInteger)corners clipRect:(NSRect)rect 326 | { 327 | return; 328 | } 329 | 330 | - (void)setTitle:(NSString *)title 331 | { 332 | _title = title; 333 | [self setNeedsDisplay:YES]; 334 | } 335 | 336 | - (void)setSubtitle:(NSString *)subtitle 337 | { 338 | _subtitle = subtitle; 339 | [self setNeedsDisplay:YES]; 340 | } 341 | 342 | // this is for the traffic lights 343 | - (void)updateTrackingAreas 344 | { 345 | [self removeTrackingArea:_widgetTrackingArea]; 346 | [self removeTrackingArea:_generalTrackingArea]; 347 | 348 | NSRect widgetsRect = NSMakeRect(kGRGlassThemeWidgetSpacing, 349 | _closeWidget.frame.origin.y, 350 | (kGRGlassThemeWidgetSize+kGRGlassThemeWidgetSpacing-kGRGlassThemeWidgetInset)*3, 351 | kGRGlassThemeWidgetSize); 352 | 353 | NSTrackingAreaOptions widgetsOptions = NSTrackingActiveAlways|NSTrackingMouseEnteredAndExited|NSTrackingEnabledDuringMouseDrag; 354 | 355 | _widgetTrackingArea = [[NSTrackingArea alloc] initWithRect:widgetsRect 356 | options:widgetsOptions 357 | owner:self 358 | userInfo:[[self class] widgetUserInfo]]; 359 | 360 | [self addTrackingArea:_widgetTrackingArea]; 361 | 362 | _generalTrackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways|NSTrackingInVisibleRect owner:self userInfo:nil]; 363 | [self addTrackingArea:_generalTrackingArea]; 364 | 365 | [super updateTrackingAreas]; 366 | } 367 | 368 | - (BOOL)isWidgetEvent:(NSEvent *)theEvent 369 | { 370 | if(theEvent.userData) { 371 | if (theEvent.userData == (__bridge void *)([[self class] widgetUserInfo])) { 372 | return YES; 373 | } else { 374 | return NO; 375 | } 376 | } else { 377 | return NO; 378 | } 379 | } 380 | 381 | - (void)mouseEntered:(NSEvent *)theEvent 382 | { 383 | if(self.hides) { 384 | [NSAnimationContext beginGrouping]; 385 | self.window.animator.alphaValue = 1; 386 | [NSAnimationContext endGrouping]; 387 | } 388 | 389 | if (![self isWidgetEvent:theEvent]) return; 390 | 391 | for (id widget in [self.window.contentView subviews]) { 392 | if ([widget isKindOfClass:[GRGlassThemeWidget class]]) { 393 | [widget mouseEntered:theEvent]; 394 | } 395 | } 396 | } 397 | 398 | - (void)mouseExited:(NSEvent *)theEvent 399 | { 400 | if(self.hides) { 401 | [NSAnimationContext beginGrouping]; 402 | self.window.animator.alphaValue = 0; 403 | [NSAnimationContext endGrouping]; 404 | } 405 | 406 | if (![self isWidgetEvent:theEvent]) return; 407 | 408 | for (id widget in [self.window.contentView subviews]) { 409 | if ([widget isKindOfClass:[GRGlassThemeWidget class]]) { 410 | [widget mouseExited:theEvent]; 411 | } 412 | } 413 | } 414 | 415 | @end 416 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/GRGlassThemeWidget.h: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassThemeWidget.h 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #define kGRGlassThemeWidgetSize 12 12 | #define kGRGlassThemeWidgetInset 1 13 | 14 | // window widget types 15 | typedef enum { 16 | GRGlassThemeWidgetTypeClose = 1, 17 | GRGlassThemeWidgetTypeMiniaturize = 2, 18 | GRGlassThemeWidgetTypeZoom = 3 19 | } GRGlassThemeWidgetType; 20 | 21 | @interface GRGlassThemeWidget : NSButton 22 | 23 | @property (nonatomic, assign) GRGlassThemeWidgetType type; 24 | @property (nonatomic, assign) BOOL hover; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/GRGlassThemeWidget.m: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassThemeWidget.m 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "GRGlassThemeWidget.h" 10 | #import "GRGlassAccessoryWindow.h" 11 | 12 | @implementation GRGlassThemeWidget 13 | - (id)initWithFrame:(NSRect)frameRect 14 | { 15 | self = [super initWithFrame:frameRect]; 16 | 17 | if (!self) return nil; 18 | 19 | self.target = self; 20 | self.action = @selector(performAction:); 21 | 22 | return self; 23 | } 24 | 25 | - (void)performAction:(id)sender 26 | { 27 | switch (self.type) { 28 | case GRGlassThemeWidgetTypeClose: 29 | [self.window.parentWindow close]; 30 | break; 31 | case GRGlassThemeWidgetTypeMiniaturize: 32 | [self.window.parentWindow miniaturize:self]; 33 | break; 34 | default: 35 | [self.window.parentWindow zoom:self]; 36 | break; 37 | } 38 | 39 | [(GRGlassTitleBarView *)self.superview.superview resetWidgets]; 40 | } 41 | 42 | - (void)setHover:(BOOL)hover 43 | { 44 | _hover = hover; 45 | [self setNeedsDisplay]; 46 | } 47 | 48 | - (void)mouseEntered:(NSEvent *)theEvent 49 | { 50 | // update ourselves to be active 51 | self.hover = YES; 52 | } 53 | 54 | - (void)mouseExited:(NSEvent *)theEvent 55 | { 56 | // update ourselves to be inactive 57 | self.hover = NO; 58 | } 59 | 60 | - (void)setType:(GRGlassThemeWidgetType)type 61 | { 62 | _type = type; 63 | 64 | // if our type changes we need to update our look 65 | [self setNeedsDisplay]; 66 | } 67 | 68 | - (void)drawRect:(NSRect)dirtyRect 69 | { 70 | NSBezierPath *buttonPath = [NSBezierPath bezierPathWithOvalInRect:NSInsetRect(self.bounds, kGRGlassThemeWidgetInset, kGRGlassThemeWidgetInset)]; 71 | 72 | if (self.type == GRGlassThemeWidgetTypeClose) { 73 | [[NSColor colorWithCalibratedRed:0.943 green:0.229 blue:0.238 alpha:0.9] set]; 74 | } else if(self.type == GRGlassThemeWidgetTypeMiniaturize) { 75 | [[NSColor colorWithCalibratedRed:0.872 green:0.569 blue:0.249 alpha:0.9] set]; 76 | } else { 77 | [[NSColor colorWithCalibratedRed:0.433 green:0.641 blue:0.305 alpha:0.9] set]; 78 | } 79 | 80 | if (self.hover) [buttonPath fill]; 81 | 82 | [buttonPath stroke]; 83 | } 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/GRGlassWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassWindow.h 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "PrivateStuff.h" 11 | 12 | @class GRGlassWindowFrame; 13 | 14 | @interface GRGlassWindow : NSWindow 15 | 16 | // an accessory view placed on the right hand side of the window, 17 | // this can be used to put a button or other view, 18 | // if you want to put more than one button you can 19 | // make a view with the buttons inside and use 20 | // the view as the accessory view 21 | @property (nonatomic, assign) NSView *accessoryView; 22 | 23 | // this makes the titlebar fade out when the mouse leaves the window 24 | @property (nonatomic, assign) BOOL hidesTitleBar; 25 | 26 | // smaller text below the title 27 | @property (nonatomic, copy) NSString *subtitle; 28 | 29 | @end 30 | 31 | 32 | 33 | 34 | /* if you just want to use the glass window, the stuff below is not important */ 35 | 36 | @protocol GRGlassWindowFrameProxyViewDelegate 37 | 38 | - (void)mouseDidEnterFrame; 39 | - (void)mouseDidExitFrame; 40 | 41 | @end 42 | 43 | @interface GRGlassWindowFrameProxyView : NSView 44 | 45 | @property (nonatomic, assign) id delegate; 46 | 47 | @end 48 | 49 | @interface GRGlassWindowFrame : NSThemeFrame 50 | 51 | @property (nonatomic, assign) BOOL hidesTitleBar; 52 | 53 | @end -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/GRGlassWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassWindow.m 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "GRGlassWindow.h" 10 | #import "GRGlassAccessoryWindow.h" 11 | #import 12 | 13 | #import "NSWindow+Screenshot.h" 14 | 15 | @interface GRGlassWindow () 16 | 17 | @property (nonatomic, readonly) GRGlassWindowFrame *frameView; 18 | @property (strong) GRGlassAccessoryWindow *titleWindow; 19 | @property (strong) NSImageView *screenshotImageView; 20 | 21 | @end 22 | 23 | @implementation GRGlassWindow 24 | 25 | - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 26 | { 27 | self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag]; 28 | if(!self) return nil; 29 | 30 | // initialize an accessory window which is used as our title bar 31 | self.titleWindow = [[GRGlassAccessoryWindow alloc] initWithContentRect:[self titleWindowRect] styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]; 32 | // add the accessory window as our child 33 | [self addChildWindow:self.titleWindow ordered:NSWindowAbove]; 34 | 35 | // when this window is resized, the child window should be resized as well 36 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resizeChild:) name:NSWindowDidResizeNotification object:self]; 37 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeScreenshotImage:) name:NSWindowDidDeminiaturizeNotification object:self]; 38 | 39 | return self; 40 | } 41 | 42 | // returns the correct rect for the title bar window 43 | - (NSRect)titleWindowRect 44 | { 45 | return NSMakeRect(self.frame.origin.x, self.frame.origin.y+NSHeight(self.frame)-kGRGlassWindowTitleBarHeight-0.5, NSWidth(self.frame), kGRGlassWindowTitleBarHeight); 46 | } 47 | 48 | // this tells appkit we want the window's frame to be a GRGlassWindowFrame 49 | + (Class)frameViewClassForStyleMask:(NSInteger)styleMask 50 | { 51 | return [GRGlassWindowFrame class]; 52 | } 53 | 54 | // this makes our custom window frame have the correct appearance and shadow 55 | - (BOOL)_usesCustomDrawing 56 | { 57 | return NO; 58 | } 59 | 60 | // called from NSWindowDidResizeNotification 61 | - (void)resizeChild:(NSNotification *)notification 62 | { 63 | [self.titleWindow setFrame:[self titleWindowRect] display:YES animate:NO]; 64 | } 65 | 66 | - (void)miniaturize:(id)sender 67 | { 68 | // when the window miniaturizes, we need to take a screenshot including the 69 | // child window, this is not done by default, 70 | // so we take a screenshot of the window including the child and 71 | // put it on the window, giving the illusion that everything is one window 72 | NSImage *screenshot = [self screenshot]; 73 | 74 | if(!self.screenshotImageView) self.screenshotImageView = [[NSImageView alloc] initWithFrame:NSZeroRect]; 75 | self.screenshotImageView.frame = NSMakeRect(0, 0, NSWidth([self.contentView frame]), NSHeight([self.contentView frame])); 76 | self.screenshotImageView.image = screenshot; 77 | 78 | [self.contentView addSubview:self.screenshotImageView]; 79 | 80 | // there has to be a slight delay before the window is actually miniaturized, 81 | // otherwise the screenshot would not appear on time 82 | double delayInSeconds = 0.01; 83 | dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 84 | dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 85 | [super miniaturize:sender]; 86 | }); 87 | } 88 | 89 | // called from NSWindowDidDeminiaturizeNotification 90 | - (void)removeScreenshotImage:(NSNotification *)notification 91 | { 92 | // here we remove the screenshot used on miniaturization 93 | [self.screenshotImageView removeFromSuperview]; 94 | } 95 | 96 | - (void)setTitle:(NSString *)aString 97 | { 98 | [super setTitle:aString]; 99 | 100 | // our title is really displayed by the title bar window 101 | self.titleWindow.title = aString; 102 | } 103 | 104 | - (void)setHidesTitleBar:(BOOL)hidesTitleBar 105 | { 106 | _hidesTitleBar = hidesTitleBar; 107 | 108 | self.titleWindow.hides = hidesTitleBar; 109 | } 110 | 111 | - (GRGlassWindowFrame *)frameView 112 | { 113 | return (GRGlassWindowFrame *)[self.contentView superview]; 114 | } 115 | 116 | - (void)setSubtitle:(NSString *)subtitle 117 | { 118 | _subtitle = subtitle; 119 | 120 | // our subtitle is really displayed by the title bar window 121 | self.titleWindow.subtitle = subtitle; 122 | } 123 | 124 | - (void)setAccessoryView:(NSView *)accessoryView 125 | { 126 | self.titleWindow.accessoryView = accessoryView; 127 | } 128 | 129 | - (NSView *)accessoryView 130 | { 131 | return self.titleWindow.accessoryView; 132 | } 133 | 134 | @end 135 | 136 | // this view is just a "proxy" so we can track mouse events to show and hide the title bar 137 | @implementation GRGlassWindowFrameProxyView 138 | { 139 | NSTrackingArea *_area; 140 | } 141 | 142 | - (void)drawRect:(NSRect)dirtyRect 143 | { 144 | [self.window.backgroundColor setFill]; 145 | NSRectFill(dirtyRect); 146 | } 147 | 148 | - (void)updateTrackingAreas 149 | { 150 | if(_area) [self removeTrackingArea:_area]; 151 | 152 | NSRect trackingRect = NSMakeRect(0, 0, NSWidth(self.frame), NSHeight(self.frame)-kGRGlassWindowTitleBarHeight); 153 | _area = [[NSTrackingArea alloc] initWithRect:trackingRect options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways owner:self userInfo:nil]; 154 | [self addTrackingArea:_area]; 155 | } 156 | 157 | - (void)mouseEntered:(NSEvent *)theEvent 158 | { 159 | if([self.delegate respondsToSelector:@selector(mouseDidEnterFrame)]) [self.delegate mouseDidEnterFrame]; 160 | } 161 | 162 | - (void)mouseExited:(NSEvent *)theEvent 163 | { 164 | if([self.delegate respondsToSelector:@selector(mouseDidExitFrame)]) [self.delegate mouseDidExitFrame]; 165 | } 166 | 167 | @end 168 | 169 | // this is the window frame, responsible for it's look 170 | @implementation GRGlassWindowFrame 171 | { 172 | id _contentView; 173 | 174 | GRGlassWindowFrameProxyView *_frameProxyView; 175 | } 176 | 177 | // this makes the content view flush with the window's top 178 | + (double)_titlebarHeight:(unsigned long long)arg1 179 | { 180 | return 0; 181 | } 182 | - (BOOL)topCornerRounded 183 | { 184 | return YES; 185 | } 186 | - (BOOL)_wantsTitleBar 187 | { 188 | return NO; 189 | } 190 | 191 | - (void)_setContentView:(id)view 192 | { 193 | // if we don't do this we may have drawing glitches 194 | [self setWantsLayer:YES]; 195 | 196 | // we use this to create the frame proxy view and insert it into our hierarchy 197 | _frameProxyView = [[GRGlassWindowFrameProxyView alloc] initWithFrame:[view frame]]; 198 | _frameProxyView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable|NSViewMinXMargin|NSViewMinYMargin; 199 | _frameProxyView.delegate = self; 200 | [self addSubview:_frameProxyView]; 201 | 202 | [super _setContentView:view]; 203 | } 204 | 205 | - (void)hideTitleBar 206 | { 207 | if(!self.hidesTitleBar) return; 208 | 209 | GRGlassWindow *window = (GRGlassWindow *)self.window; 210 | [window.titleWindow.animator setAlphaValue:0]; 211 | } 212 | 213 | - (void)showTitleBar 214 | { 215 | if(!self.hidesTitleBar) return; 216 | 217 | GRGlassWindow *window = (GRGlassWindow *)self.window; 218 | [window.titleWindow.animator setAlphaValue:1]; 219 | } 220 | 221 | - (void)mouseDidEnterFrame 222 | { 223 | [self showTitleBar]; 224 | } 225 | 226 | - (void)mouseDidExitFrame 227 | { 228 | [self hideTitleBar]; 229 | } 230 | 231 | @end -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/NSWindow+Screenshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSWindow+Screenshot.h 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 12/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | // based on this gist: https://gist.github.com/fernyb/890044 10 | 11 | #import 12 | 13 | @interface NSWindow (Screenshot) 14 | 15 | - (NSImage *)screenshot; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/NSWindow+Screenshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSWindow+Screenshot.m 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 12/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "NSWindow+Screenshot.h" 10 | 11 | @implementation NSWindow (Screenshot) 12 | 13 | - (NSImage *)screenshot 14 | { 15 | NSImage * image = [[NSImage alloc] initWithCGImage:[self windowImageShot] size:[self frame].size]; 16 | [image setDataRetained:YES]; 17 | [image setCacheMode:NSImageCacheNever]; 18 | return image; 19 | } 20 | 21 | 22 | - (CGImageRef)windowImageShot 23 | { 24 | CGWindowID windowID = (CGWindowID)[self windowNumber]; 25 | CGWindowImageOption imageOptions = kCGWindowImageDefault; 26 | CGWindowListOption singleWindowListOptions = kCGWindowListOptionOnScreenAboveWindow|kCGWindowListOptionIncludingWindow|kCGWindowListExcludeDesktopElements; 27 | CGRect imageBounds = CGRectMake(self.frame.origin.x, NSHeight(self.screen.frame)-NSHeight(self.frame)-self.frame.origin.y, NSWidth(self.frame), NSHeight(self.frame)); 28 | 29 | CGImageRef windowImage = CGWindowListCreateImage(imageBounds, singleWindowListOptions, windowID, imageOptions); 30 | 31 | return windowImage; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/PrivateStuff.h: -------------------------------------------------------------------------------- 1 | // 2 | // PrivateStuff.h 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 08/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | /* private classes, methods and functions used by GRGlassWindow and friends */ 10 | 11 | #import 12 | 13 | #pragma mark AppKit 14 | 15 | @interface NSWindow (AppKitPrivate) 16 | + (Class)frameViewClassForStyleMask:(NSInteger)styleMask; 17 | - (BOOL)_usesCustomDrawing; 18 | @end 19 | 20 | @interface NSThemeFrame : NSView 21 | - (void)shapeWindow; 22 | - (void)_setContentView:(id)view; 23 | @end 24 | 25 | #pragma mark Core Graphics 26 | 27 | // these are private Core Graphics calls we use to blur the window's background 28 | typedef void * CGSConnection; 29 | extern CGError CGSSetWindowBackgroundBlurRadius(CGSConnection connection, NSInteger windowNumber, int radius); 30 | extern CGSConnection CGSDefaultConnectionForThread(); -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/Resources/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/GRGlassWindow/GRGlassWindow Class/Resources/Roboto-Medium.ttf -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow Class/Resources/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/GRGlassWindow/GRGlassWindow Class/Resources/Roboto-Regular.ttf -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ATSApplicationFontsPath 6 | ./ 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | glassicon 13 | CFBundleIdentifier 14 | br.com.guilhermerambo.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1 27 | LSMinimumSystemVersion 28 | ${MACOSX_DEPLOYMENT_TARGET} 29 | NSHumanReadableCopyright 30 | Copyright © 2014 Guilherme Rambo. All rights reserved. 31 | NSMainNibFile 32 | MainMenu 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /GRGlassWindow/GRGlassWindow-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #ifdef __OBJC__ 8 | #import 9 | #endif 10 | -------------------------------------------------------------------------------- /GRGlassWindow/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} 2 | {\colortbl;\red255\green255\blue255;} 3 | \paperw9840\paperh8400 4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 5 | 6 | \f0\b\fs24 \cf0 Engineering: 7 | \b0 \ 8 | Some people\ 9 | \ 10 | 11 | \b Human Interface Design: 12 | \b0 \ 13 | Some other people\ 14 | \ 15 | 16 | \b Testing: 17 | \b0 \ 18 | Hopefully not nobody\ 19 | \ 20 | 21 | \b Documentation: 22 | \b0 \ 23 | Whoever\ 24 | \ 25 | 26 | \b With special thanks to: 27 | \b0 \ 28 | Mom\ 29 | } 30 | -------------------------------------------------------------------------------- /GRGlassWindow/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /GRGlassWindow/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // GRGlassWindow 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) 12 | { 13 | return NSApplicationMain(argc, argv); 14 | } 15 | -------------------------------------------------------------------------------- /GRGlassWindowTests/GRGlassWindowTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | br.com.guilhermerambo.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /GRGlassWindowTests/GRGlassWindowTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // GRGlassWindowTests.m 3 | // GRGlassWindowTests 4 | // 5 | // Created by Guilherme Rambo on 07/01/14. 6 | // Copyright (c) 2014 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface GRGlassWindowTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation GRGlassWindowTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /GRGlassWindowTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Guilherme Rambo 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | - Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | - Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 14 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 17 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Warning: Obsolete! 2 | 3 | With OS X Yosemite's new look this project is now obsolete, I don't recomend using It anymore. 4 | 5 | Check out [GRVibrantTitlebarWindow](https://github.com/insidegui/GRVibrantTitlebarWindow)! 6 | 7 | GRGlassWindow 8 | ============= 9 | 10 | A NSWindow subclass with a beautiful glass-like title bar. 11 | 12 | Use the sample app and headers as a guide, more documentation coming soon. 13 | 14 | Thank you [Raffael](https://github.com/raffael) for the challenge. 15 | 16 | Screenshot 17 | ========== 18 | 19 | ![screenshot](https://raw.github.com/insidegui/GRGlassWindow/master/glass_screenshot_1.png) 20 | 21 | Contributing 22 | ============ 23 | 24 | You can contribute with code, just send me a pull request, or open an issue for any bug/enhancement. 25 | 26 | Disclaimer: sending a pull request does not mean I will accept It, if I don't accept your pull request It doesn't mean I don't love you ;) 27 | 28 | If you like this and will use It to make your app look like one of Jony Ive's really sexy creations, you can show me some love by [donating through PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=386Y2DFSN5X94&lc=BR&item_name=Guilherme%20Rambo&item_number=1001¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted) -------------------------------------------------------------------------------- /glass_screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glass_screenshot_1.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_128x128.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_16x16.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_256x256.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_32x32.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_512x512.png -------------------------------------------------------------------------------- /glassicon.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/GRGlassWindow/bf6e6349cc1d4647c4b88bc87bfcbc796af00407/glassicon.iconset/icon_512x512@2x.png --------------------------------------------------------------------------------