mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-02 10:00:54 +00:00
b6992791c8
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
69 lines
2.1 KiB
Plaintext
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
|