ceecbb6af4
General - 配置界面支持配置对象存储桶 - 快捷键进入截图 - 一键上传截图 & 复制截图链接 MacOS - 状态栏指示器和应用图标
122 lines
3.9 KiB
Go
122 lines
3.9 KiB
Go
//go:build darwin
|
|
|
|
package main
|
|
|
|
/*
|
|
#cgo CFLAGS: -x objective-c -fobjc-arc -fblocks
|
|
#cgo LDFLAGS: -framework AppKit -framework CoreGraphics
|
|
#include <dispatch/dispatch.h>
|
|
#import <AppKit/AppKit.h>
|
|
|
|
static NSWindow* snipMainWindow(void) {
|
|
NSWindow *window = [NSApp mainWindow];
|
|
if (window == nil && [[NSApp windows] count] > 0) {
|
|
window = [[NSApp windows] objectAtIndex:0];
|
|
}
|
|
return window;
|
|
}
|
|
|
|
// snipMakeViewTransparent recursively clears AppKit/WKWebView backing
|
|
// surfaces. Setting only NSWindow transparent is insufficient for Wails:
|
|
// WKWebView may still paint an opaque default grey background.
|
|
static void snipMakeViewTransparent(NSView *view) {
|
|
if (view == nil) {
|
|
return;
|
|
}
|
|
|
|
Class wkWebViewClass = NSClassFromString(@"WKWebView");
|
|
if (wkWebViewClass != nil && [view isKindOfClass:wkWebViewClass]) {
|
|
@try {
|
|
[view setValue:@NO forKey:@"drawsBackground"];
|
|
} @catch (__unused NSException *exception) {
|
|
}
|
|
@try {
|
|
id scrollView = [view valueForKey:@"scrollView"];
|
|
if ([scrollView isKindOfClass:[NSScrollView class]]) {
|
|
[(NSScrollView *)scrollView setDrawsBackground:NO];
|
|
[(NSScrollView *)scrollView setBackgroundColor:[NSColor clearColor]];
|
|
}
|
|
} @catch (__unused NSException *exception) {
|
|
}
|
|
}
|
|
|
|
if ([view isKindOfClass:[NSScrollView class]]) {
|
|
NSScrollView *scrollView = (NSScrollView *)view;
|
|
[scrollView setDrawsBackground:NO];
|
|
[scrollView setBackgroundColor:[NSColor clearColor]];
|
|
}
|
|
|
|
[view setWantsLayer:YES];
|
|
if ([view layer] != nil) {
|
|
[[view layer] setOpaque:NO];
|
|
[[view layer] setBackgroundColor:[[NSColor clearColor] CGColor]];
|
|
}
|
|
|
|
@try {
|
|
[view setValue:@NO forKey:@"opaque"];
|
|
} @catch (__unused NSException *exception) {
|
|
}
|
|
|
|
@try {
|
|
[view setValue:@NO forKey:@"drawsBackground"];
|
|
} @catch (__unused NSException *exception) {
|
|
}
|
|
|
|
for (NSView *subview in [view subviews]) {
|
|
snipMakeViewTransparent(subview);
|
|
}
|
|
}
|
|
|
|
static void snipConfigureOverlayWindow(void) {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
NSWindow *window = snipMainWindow();
|
|
NSScreen *screen = [NSScreen mainScreen];
|
|
if (window == nil || screen == nil) {
|
|
return;
|
|
}
|
|
|
|
[window setOpaque:NO];
|
|
[window setBackgroundColor:[NSColor clearColor]];
|
|
snipMakeViewTransparent([window contentView]);
|
|
[window setLevel:NSScreenSaverWindowLevel];
|
|
[window setCollectionBehavior:
|
|
NSWindowCollectionBehaviorCanJoinAllSpaces |
|
|
NSWindowCollectionBehaviorFullScreenAuxiliary |
|
|
NSWindowCollectionBehaviorStationary];
|
|
[window setFrame:[screen frame] display:YES];
|
|
});
|
|
}
|
|
|
|
static void snipRestoreOverlayWindow(void) {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
NSWindow *window = snipMainWindow();
|
|
if (window == nil) {
|
|
return;
|
|
}
|
|
|
|
[window setLevel:NSNormalWindowLevel];
|
|
[window setCollectionBehavior:NSWindowCollectionBehaviorDefault];
|
|
[window setOpaque:YES];
|
|
[window setBackgroundColor:
|
|
[NSColor colorWithCalibratedRed:246.0/255.0
|
|
green:247.0/255.0
|
|
blue:250.0/255.0
|
|
alpha:1.0]];
|
|
});
|
|
}
|
|
*/
|
|
import "C"
|
|
|
|
// configureOverlayWindow promotes the Wails NSWindow to a transparent,
|
|
// screen-level overlay. Wails can size a frameless window, but AppKit-only
|
|
// flags are needed to cover the menu bar and keep the WebView transparent.
|
|
func configureOverlayWindow() {
|
|
C.snipConfigureOverlayWindow()
|
|
}
|
|
|
|
// restoreOverlayWindow returns the NSWindow to normal app-window behaviour
|
|
// before the settings UI is shown again.
|
|
func restoreOverlayWindow() {
|
|
C.snipRestoreOverlayWindow()
|
|
}
|