monitor_finder_mac.mm revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/renderer_host/pepper/monitor_finder_mac.h" 6 7#import <Cocoa/Cocoa.h> 8 9#include "content/public/browser/browser_thread.h" 10#include "content/public/browser/render_frame_host.h" 11 12namespace chrome { 13 14MonitorFinder::MonitorFinder(int process_id, int render_frame_id) 15 : process_id_(process_id), 16 render_frame_id_(render_frame_id), 17 request_sent_(false), 18 display_id_(kCGNullDirectDisplay) { 19} 20 21MonitorFinder::~MonitorFinder() { 22} 23 24int64_t MonitorFinder::GetMonitor() { 25 { 26 // The plugin may call this method several times, so avoid spamming the UI 27 // thread with requests by only allowing one outstanding request at a time. 28 base::AutoLock lock(mutex_); 29 if (request_sent_) 30 return display_id_; 31 request_sent_ = true; 32 } 33 34 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 35 base::Bind(&MonitorFinder::FetchMonitorFromWidget, this)); 36 return display_id_; 37} 38 39// static 40bool MonitorFinder::IsMonitorBuiltIn(int64_t display_id) { 41 return CGDisplayIsBuiltin(display_id); 42} 43 44void MonitorFinder::FetchMonitorFromWidget() { 45 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 46 content::RenderFrameHost* rfh = 47 content::RenderFrameHost::FromID(process_id_, render_frame_id_); 48 if (!rfh) 49 return; 50 51 gfx::NativeView native_view = rfh->GetNativeView(); 52 NSWindow* window = [native_view window]; 53 NSScreen* screen = [window screen]; 54 CGDirectDisplayID display_id = 55 [[[screen deviceDescription] objectForKey:@"NSScreenNumber"] intValue]; 56 57 base::AutoLock lock(mutex_); 58 request_sent_ = false; 59 display_id_ = display_id; 60} 61 62} // namespace chrome 63