gecko-dev/widget/cocoa/DesktopBackgroundImage.mm

69 строки
2.1 KiB
Plaintext

/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/Logging.h"
#include "nsCocoaUtils.h"
#include "nsIFile.h"
#include "DesktopBackgroundImage.h"
#import <Foundation/Foundation.h>
extern mozilla::LazyLogModule gCocoaUtilsLog;
#undef LOG
#define LOG(...) MOZ_LOG(gCocoaUtilsLog, LogLevel::Debug, (__VA_ARGS__))
namespace mozilla {
namespace widget {
void SetDesktopImage(nsIFile* aImage) {
nsAutoCString imagePath;
nsresult rv = aImage->GetNativePath(imagePath);
if (NS_FAILED(rv)) {
LOG("%s ERROR: failed to get image path", __func__);
return;
}
bool exists = false;
rv = aImage->Exists(&exists);
if (NS_FAILED(rv) || !exists) {
LOG("%s ERROR: file \"%s\" does not exist", __func__, imagePath.get());
return;
}
NSString* urlString = [NSString stringWithUTF8String:imagePath.get()];
if (!urlString) {
LOG("%s ERROR: null image path \"%s\"", __func__, imagePath.get());
return;
}
NSURL* url = [NSURL fileURLWithPath:urlString];
if (!url) {
LOG("%s ERROR: null image path URL \"%s\"", __func__, imagePath.get());
return;
}
// Only apply the background to the screen with focus
NSScreen* currentScreen = [NSScreen mainScreen];
if (!currentScreen) {
LOG("%s ERROR: got null NSScreen", __func__);
return;
}
// Use existing options for this screen
NSDictionary* screenOptions =
[[NSWorkspace sharedWorkspace] desktopImageOptionsForScreen:currentScreen];
NSError* error = nil;
if (![[NSWorkspace sharedWorkspace] setDesktopImageURL:url
forScreen:currentScreen
options:screenOptions
error:&error]) {
LOG("%s ERROR: setDesktopImageURL failed (%ld)", __func__, (long)[error code]);
}
}
} // namespace widget
} // namespace mozilla