Bug 1931425 - Limit how often moz-label's #setStyles runs r=reusable-components-revie...
[gecko.git] / widget / cocoa / DesktopBackgroundImage.mm
blob7c00109db5e04cae1ff0dbc81a9a4c9bf4a4e444
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "mozilla/Logging.h"
7 #include "nsCocoaUtils.h"
8 #include "nsIFile.h"
9 #include "DesktopBackgroundImage.h"
11 #import <Foundation/Foundation.h>
13 extern mozilla::LazyLogModule gCocoaUtilsLog;
14 #undef LOG
15 #define LOG(...) MOZ_LOG(gCocoaUtilsLog, LogLevel::Debug, (__VA_ARGS__))
17 namespace mozilla {
18 namespace widget {
20 void SetDesktopImage(nsIFile* aImage) {
21   nsAutoCString imagePath;
22   nsresult rv = aImage->GetNativePath(imagePath);
23   if (NS_FAILED(rv)) {
24     LOG("%s ERROR: failed to get image path", __func__);
25     return;
26   }
28   bool exists = false;
29   rv = aImage->Exists(&exists);
30   if (NS_FAILED(rv) || !exists) {
31     LOG("%s ERROR: file \"%s\" does not exist", __func__, imagePath.get());
32     return;
33   }
35   NSString* urlString = [NSString stringWithUTF8String:imagePath.get()];
36   if (!urlString) {
37     LOG("%s ERROR: null image path \"%s\"", __func__, imagePath.get());
38     return;
39   }
41   NSURL* url = [NSURL fileURLWithPath:urlString];
42   if (!url) {
43     LOG("%s ERROR: null image path URL \"%s\"", __func__, imagePath.get());
44     return;
45   }
47   // Only apply the background to the screen with focus
48   NSScreen* currentScreen = [NSScreen mainScreen];
49   if (!currentScreen) {
50     LOG("%s ERROR: got null NSScreen", __func__);
51     return;
52   }
54   // Use existing options for this screen
55   NSDictionary* screenOptions = [[NSWorkspace sharedWorkspace]
56       desktopImageOptionsForScreen:currentScreen];
58   NSError* error = nil;
59   if (![[NSWorkspace sharedWorkspace] setDesktopImageURL:url
60                                                forScreen:currentScreen
61                                                  options:screenOptions
62                                                    error:&error]) {
63     LOG("%s ERROR: setDesktopImageURL failed (%ld)", __func__,
64         (long)[error code]);
65   }
68 }  // namespace widget
69 }  // namespace mozilla