Chromium Code Reviews| Index: content/browser/theme_helper_mac.mm |
| diff --git a/content/browser/theme_helper_mac.mm b/content/browser/theme_helper_mac.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9e6eb226a9b89df412bfb0cf59b78d2463f0dfe4 |
| --- /dev/null |
| +++ b/content/browser/theme_helper_mac.mm |
| @@ -0,0 +1,118 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/theme_helper_mac.h" |
| + |
| +#include <Foundation/Foundation.h> |
| + |
| +#include "content/common/view_messages.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/notification_service.h" |
| +#include "content/public/browser/notification_types.h" |
| +#include "content/public/browser/render_process_host.h" |
| +#include "content/public/common/process_type.h" |
|
jam
2013/11/06 22:34:43
nit: not needed now
Avi (use Gerrit)
2013/11/07 15:47:52
Done.
|
| + |
| +@interface ScrollbarPrefsObserver : NSObject |
| + |
| ++ (void)registerAsObserver; |
| ++ (void)appearancePrefsChanged:(NSNotification*)notification; |
| ++ (void)behaviorPrefsChanged:(NSNotification*)notification; |
| ++ (void)notifyPrefsChangedWithRedraw:(BOOL)redraw; |
| + |
| +@end |
| + |
| +@implementation ScrollbarPrefsObserver |
| + |
| ++ (void)registerAsObserver { |
| + [[NSDistributedNotificationCenter defaultCenter] |
| + addObserver:self |
| + selector:@selector(appearancePrefsChanged:) |
| + name:@"AppleAquaScrollBarVariantChanged" |
| + object:nil |
| +suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately]; |
| + |
| + [[NSDistributedNotificationCenter defaultCenter] |
| + addObserver:self |
| + selector:@selector(behaviorPrefsChanged:) |
| + name:@"AppleNoRedisplayAppearancePreferenceChanged" |
| + object:nil |
| +suspensionBehavior:NSNotificationSuspensionBehaviorCoalesce]; |
| +} |
| + |
| ++ (void)appearancePrefsChanged:(NSNotification*)notification { |
| + [self notifyPrefsChangedWithRedraw:YES]; |
| +} |
| + |
| ++ (void)behaviorPrefsChanged:(NSNotification*)notification { |
| + [self notifyPrefsChangedWithRedraw:NO]; |
| +} |
| + |
| ++ (void)notifyPrefsChangedWithRedraw:(BOOL)redraw { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| + [defaults synchronize]; |
| + |
| + content::ThemeHelperMac::SendThemeChangeToAllRenderers( |
| + [defaults floatForKey:@"NSScrollerButtonDelay"], |
| + [defaults floatForKey:@"NSScrollerButtonPeriod"], |
| + [defaults boolForKey:@"AppleScrollerPagingBehavior"], |
| + redraw); |
| +} |
| + |
| +@end |
| + |
| +namespace content { |
| + |
| +ThemeHelperMac::ThemeHelperMac() { |
| + [ScrollbarPrefsObserver registerAsObserver]; |
| + registrar_.Add(this, |
| + NOTIFICATION_RENDERER_PROCESS_CREATED, |
| + NotificationService::AllSources()); |
| +} |
| + |
| +ThemeHelperMac::~ThemeHelperMac() { |
| +} |
| + |
| +// static |
| +ThemeHelperMac* ThemeHelperMac::GetInstance() { |
| + return Singleton<ThemeHelperMac, |
| + LeakySingletonTraits<ThemeHelperMac> >::get(); |
| +} |
| + |
| + |
| +void ThemeHelperMac::Observe(int type, |
| + const NotificationSource& source, |
| + const NotificationDetails& details) { |
| + DCHECK_EQ(NOTIFICATION_RENDERER_PROCESS_CREATED, type); |
| + |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| + [defaults synchronize]; |
| + |
| + RenderProcessHost* rph = Source<RenderProcessHost>(source).ptr(); |
| + rph->Send(new ViewMsg_UpdateScrollbarTheme( |
| + [defaults floatForKey:@"NSScrollerButtonDelay"], |
| + [defaults floatForKey:@"NSScrollerButtonPeriod"], |
| + [defaults boolForKey:@"AppleScrollerPagingBehavior"], |
| + false)); |
| +} |
| + |
| +// static |
| +void ThemeHelperMac::SendThemeChangeToAllRenderers( |
| + float initial_button_delay, |
| + float autoscroll_button_delay, |
| + bool jump_on_track_click, |
| + bool redraw) { |
| + for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator()); |
| + !it.IsAtEnd(); |
| + it.Advance()) { |
| + it.GetCurrentValue()->Send(new ViewMsg_UpdateScrollbarTheme( |
| + initial_button_delay, |
| + autoscroll_button_delay, |
| + jump_on_track_click, |
| + redraw)); |
| + } |
| +} |
| + |
| +} // namespace content |