| Index: remoting/host/continue_window_mac.mm
|
| diff --git a/remoting/host/continue_window_mac.mm b/remoting/host/continue_window_mac.mm
|
| index 6567cc378c2eca53c13299fb5f8fd734bf203ed8..c53c11f7f217f499f3d580b5c937261deb5cd57a 100644
|
| --- a/remoting/host/continue_window_mac.mm
|
| +++ b/remoting/host/continue_window_mac.mm
|
| @@ -13,117 +13,144 @@
|
| #include "base/sys_string_conversions.h"
|
| #include "remoting/host/chromoting_host.h"
|
|
|
| -// As this is a plugin, there needs to be a way to find its bundle
|
| -// so that resources are able to be found. This class exists solely so that
|
| -// there is a way to get the bundle that this code file is in using
|
| -// [NSBundle bundleForClass:[ContinueWindowMacClassToLocateMyBundle class]]
|
| -// It is really only a name.
|
| -@interface ContinueWindowMacClassToLocateMyBundle : NSObject
|
| -@end
|
| +// Handles the ContinueWindow.
|
| +@interface ContinueWindowMacController : NSObject {
|
| + @private
|
| + scoped_nsobject<NSMutableArray> shades_;
|
| + scoped_nsobject<NSAlert> continue_alert_;
|
| + remoting::ChromotingHost* host_;
|
| +}
|
|
|
| -@implementation ContinueWindowMacClassToLocateMyBundle
|
| +- (id)initWithHost:(remoting::ChromotingHost*)host;
|
| +- (void)show;
|
| +- (void)hide;
|
| +- (void)onCancel:(id)sender;
|
| +- (void)onContinue:(id)sender;
|
| @end
|
|
|
| namespace remoting {
|
|
|
| +// A bridge between C++ and ObjC implementations of ContinueWindow.
|
| +// Everything important occurs in ContinueWindowMacController.
|
| class ContinueWindowMac : public remoting::ContinueWindow {
|
| public:
|
| - ContinueWindowMac() : modal_session_(NULL) {}
|
| + ContinueWindowMac() {}
|
| virtual ~ContinueWindowMac() {}
|
|
|
| virtual void Show(remoting::ChromotingHost* host) OVERRIDE;
|
| virtual void Hide() OVERRIDE;
|
|
|
| private:
|
| - NSModalSession modal_session_;
|
| + scoped_nsobject<ContinueWindowMacController> controller_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ContinueWindowMac);
|
| };
|
|
|
| void ContinueWindowMac::Show(remoting::ChromotingHost* host) {
|
| base::mac::ScopedNSAutoreleasePool pool;
|
| + controller_.reset([[ContinueWindowMacController alloc] initWithHost:host]);
|
| + [controller_ show];
|
| +
|
| +}
|
| +
|
| +void ContinueWindowMac::Hide() {
|
| + base::mac::ScopedNSAutoreleasePool pool;
|
| + [controller_ hide];
|
| +}
|
|
|
| +ContinueWindow* ContinueWindow::Create() {
|
| + return new ContinueWindowMac();
|
| +}
|
| +
|
| +} // namespace remoting
|
| +
|
| +@implementation ContinueWindowMacController
|
| +
|
| +- (id)initWithHost:(remoting::ChromotingHost*)host {
|
| + if ((self = [super init])) {
|
| + host_ = host;
|
| + }
|
| + return self;
|
| +}
|
| +
|
| +- (void)show {
|
| // Generate window shade
|
| NSArray* screens = [NSScreen screens];
|
| - NSMutableArray* windows = [NSMutableArray arrayWithCapacity:[screens count]];
|
| + shades_.reset([[NSMutableArray alloc] initWithCapacity:[screens count]]);
|
| for (NSScreen *screen in screens) {
|
| - NSWindow* window =
|
| + NSWindow* shade =
|
| [[[NSWindow alloc] initWithContentRect:[screen frame]
|
| styleMask:NSBorderlessWindowMask
|
| - backing:NSBackingStoreBuffered
|
| - defer:NO
|
| - screen:screen] autorelease];
|
| - [window setReleasedWhenClosed:NO];
|
| - [window setAlphaValue:0.8];
|
| - [window setOpaque:NO];
|
| - [window setBackgroundColor:[NSColor blackColor]];
|
| + backing:NSBackingStoreBuffered
|
| + defer:NO
|
| + screen:screen] autorelease];
|
| + [shade setReleasedWhenClosed:NO];
|
| + [shade setAlphaValue:0.8];
|
| + [shade setOpaque:NO];
|
| + [shade setBackgroundColor:[NSColor blackColor]];
|
| // Raise the window shade above just about everything else.
|
| // Leave the dock and menu bar exposed so the user has some basic level
|
| // of control (like they can quit Chromium).
|
| - [window setLevel:NSModalPanelWindowLevel - 1];
|
| - [window orderFront:nil];
|
| - [windows addObject:window];
|
| + [shade setLevel:NSModalPanelWindowLevel - 1];
|
| + [shade orderFront:nil];
|
| + [shades_ addObject:shade];
|
| }
|
|
|
| - // Put up alert
|
| - const UiStrings& strings = host->ui_strings();
|
| + // Create alert.
|
| + const remoting::UiStrings& strings = host_->ui_strings();
|
| NSString* message = base::SysUTF16ToNSString(strings.continue_prompt);
|
| - NSString* continue_button = base::SysUTF16ToNSString(
|
| + NSString* continue_button_string = base::SysUTF16ToNSString(
|
| strings.continue_button_text);
|
| - NSString* cancel_button = base::SysUTF16ToNSString(
|
| + NSString* cancel_button_string = base::SysUTF16ToNSString(
|
| strings.stop_sharing_button_text);
|
| - scoped_nsobject<NSAlert> continue_alert([[NSAlert alloc] init]);
|
| - [continue_alert setMessageText:message];
|
| - [continue_alert addButtonWithTitle:continue_button];
|
| - [continue_alert addButtonWithTitle:cancel_button];
|
| -
|
| - // See ContinueWindowMacClassToLocateMyBundle class above for details
|
| - // on this.
|
| - NSBundle *bundle =
|
| - [NSBundle bundleForClass:[ContinueWindowMacClassToLocateMyBundle class]];
|
| + continue_alert_.reset([[NSAlert alloc] init]);
|
| + [continue_alert_ setMessageText:message];
|
| +
|
| + NSButton* continue_button =
|
| + [continue_alert_ addButtonWithTitle:continue_button_string];
|
| + [continue_button setAction:@selector(onContinue:)];
|
| + [continue_button setTarget:self];
|
| +
|
| + NSButton* cancel_button =
|
| + [continue_alert_ addButtonWithTitle:cancel_button_string];
|
| + [cancel_button setAction:@selector(onCancel:)];
|
| + [cancel_button setTarget:self];
|
| +
|
| + NSBundle *bundle = [NSBundle bundleForClass:[self class]];
|
| NSString *imagePath = [bundle pathForResource:@"chromoting128" ofType:@"png"];
|
| scoped_nsobject<NSImage> image(
|
| [[NSImage alloc] initByReferencingFile:imagePath]);
|
| - [continue_alert setIcon:image];
|
| - [continue_alert layout];
|
| + [continue_alert_ setIcon:image];
|
| + [continue_alert_ layout];
|
|
|
| - NSWindow* continue_window = [continue_alert window];
|
| + // Force alert to be at the proper level and location.
|
| + NSWindow* continue_window = [continue_alert_ window];
|
| [continue_window center];
|
| + [continue_window setLevel:NSModalPanelWindowLevel];
|
| [continue_window orderWindow:NSWindowAbove
|
| - relativeTo:[[windows lastObject] windowNumber]];
|
| + relativeTo:[[shades_ lastObject] windowNumber]];
|
| [continue_window makeKeyWindow];
|
| - NSApplication* application = [NSApplication sharedApplication];
|
| - modal_session_ = [application beginModalSessionForWindow:continue_window];
|
| - NSInteger answer = 0;
|
| - do {
|
| - answer = [application runModalSession:modal_session_];
|
| - } while (answer == NSRunContinuesResponse);
|
| - [application endModalSession:modal_session_];
|
| - modal_session_ = NULL;
|
| -
|
| - [continue_window close];
|
| +}
|
|
|
| +- (void)hide {
|
| // Remove window shade.
|
| - for (NSWindow* window in windows) {
|
| + for (NSWindow* window in shades_.get()) {
|
| [window close];
|
| }
|
| -
|
| - if (answer == NSAlertFirstButtonReturn) {
|
| - host->PauseSession(false);
|
| - } else {
|
| - host->Shutdown(NULL);
|
| - }
|
| + shades_.reset();
|
| + continue_alert_.reset();
|
| }
|
|
|
| -void ContinueWindowMac::Hide() {
|
| - if (modal_session_) {
|
| - NSApplication* application = [NSApplication sharedApplication];
|
| - [application stopModalWithCode:NSAlertFirstButtonReturn];
|
| - }
|
| +- (void)onCancel:(id)sender {
|
| + [self hide];
|
| + host_->Shutdown(NULL);
|
| + host_ = nil;
|
| }
|
|
|
| -ContinueWindow* ContinueWindow::Create() {
|
| - return new ContinueWindowMac();
|
| +- (void)onContinue:(id)sender {
|
| + [self hide];
|
| + host_->PauseSession(false);
|
| + host_ = nil;
|
| }
|
|
|
| -} // namespace remoting
|
| +@end
|
|
|