gecko-dev/widget/cocoa/DesktopBackgroundImage.mm
Haik Aftandilian b6992791c8 Bug 1629313 - Part 1 - Set As Desktop Background fails on macOS r=spohl
Change the nsMacShellService::SetDesktopBackground() implementation (specifically code in the OnStateChange handler) to use the Apple setDesktopImageURL API instead of Apple Events to allow the "Set As Desktop Background..." context menu option to work again.

Alternatively, to allow the AppleEvent-base implementation to work again, Firefox could be signed with the com.apple.security.automation.apple-events entitlement but this would also require the user to grant Firefox permission to control Finder. setDesktopImageURL requires Mac OS 10.6 or newer and hence was not an option originally.

The implementation only changes the background of the focused screen in the current workspace (which matches the behavior of Safari).

Differential Revision: https://phabricator.services.mozilla.com/D71426
2020-04-21 19:57:29 +00:00

69 lines
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