mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	This implementation supports both GPU compositing and software compositing (used when GPU is not supported or when passing `--disable-gpu --disable-gpu-compositing` command-line flags). GPU-accelerated features (WebGL and 3D CSS) that did not work with the previous off-screen rendering implementation do work with this implementation when GPU support is available. Rendering now operates on a per-frame basis. The frame rate is configurable via CefBrowserSettings.windowless_frame_rate up to a maximum of 60fps (potentially limited by how fast the system can generate new frames). CEF generates a bitmap from the compositor backing and passes it to CefRenderHandler::OnPaint. The previous CefRenderHandler/CefBrowserHost API for off-screen rendering has been restored mostly as-is with some minor changes: - CefBrowserHost::Invalidate no longer accepts a CefRect region argument. Instead of invalidating a specific region it now triggers generation of a new frame. - The |dirtyRects| argument to CefRenderHandler::OnPaint will now always be a single CefRect representing the whole view (frame) size. Previously, invalidated regions were listed separately. - Linux: CefBrowserHost::SendKeyEvent now expects X11 event information instead of GTK event information. See cefclient for an example of converting GTK events to the necessary format. - Sizes passed to the CefRenderHandler OnPaint and OnPopupSize methods are now already DPI scaled. Previously, the client had to perform DPI scaling. - Includes drag&drop implementation from issue #1032. - Includes unit test fixes from issue #1245. git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1751 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
		
			
				
	
	
		
			95 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // Copyright (c) 2012 The Chromium Embedded Framework 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 "libcef/browser/menu_creator_runner_mac.h"
 | |
| #include "libcef/browser/browser_host_impl.h"
 | |
| 
 | |
| #include "base/message_loop/message_loop.h"
 | |
| #include "base/compiler_specific.h"
 | |
| #import "base/mac/scoped_sending_event.h"
 | |
| #import "ui/base/cocoa/menu_controller.h"
 | |
| 
 | |
| CefMenuCreatorRunnerMac::CefMenuCreatorRunnerMac()
 | |
|     : menu_controller_(nil) {
 | |
| }
 | |
| 
 | |
| CefMenuCreatorRunnerMac::~CefMenuCreatorRunnerMac() {
 | |
|   if (menu_controller_ != nil)
 | |
|     [menu_controller_ release];
 | |
| }
 | |
| 
 | |
| bool CefMenuCreatorRunnerMac::RunContextMenu(CefMenuCreator* manager) {
 | |
|   // Create a menu controller based on the model.
 | |
|   if (menu_controller_ != nil)
 | |
|     [menu_controller_ release];
 | |
|   menu_controller_ =
 | |
|       [[MenuController alloc] initWithModel:manager->model()
 | |
|                      useWithPopUpButtonCell:NO];
 | |
| 
 | |
|   NSView* parent_view =
 | |
|       manager->browser()->GetWebContents()->GetContentNativeView();
 | |
| 
 | |
|   // Synthesize an event for the click, as there is no certainty that
 | |
|   // [NSApp currentEvent] will return a valid event.
 | |
|   NSEvent* currentEvent = [NSApp currentEvent];
 | |
|   NSWindow* window = [parent_view window];
 | |
| 
 | |
|   NSPoint position = [window mouseLocationOutsideOfEventStream];
 | |
| 
 | |
|   NSTimeInterval eventTime = [currentEvent timestamp];
 | |
|   NSEvent* clickEvent = [NSEvent mouseEventWithType:NSRightMouseDown
 | |
|                                            location:position
 | |
|                                       modifierFlags:NSRightMouseDownMask
 | |
|                                           timestamp:eventTime
 | |
|                                        windowNumber:[window windowNumber]
 | |
|                                             context:nil
 | |
|                                         eventNumber:0
 | |
|                                          clickCount:1
 | |
|                                            pressure:1.0];
 | |
| 
 | |
|   {
 | |
|     // Make sure events can be pumped while the menu is up.
 | |
|     base::MessageLoop::ScopedNestableTaskAllower allow(
 | |
|         base::MessageLoop::current());
 | |
| 
 | |
|     // One of the events that could be pumped is |window.close()|.
 | |
|     // User-initiated event-tracking loops protect against this by
 | |
|     // setting flags in -[CrApplication sendEvent:], but since
 | |
|     // web-content menus are initiated by IPC message the setup has to
 | |
|     // be done manually.
 | |
|     base::mac::ScopedSendingEvent sendingEventScoper;
 | |
| 
 | |
|     // Show the menu. Blocks until the menu is dismissed.
 | |
|     if (manager->browser()->IsWindowless()) {
 | |
|       // Showing the menu in OSR is pretty much self contained, only using
 | |
|       // the initialized menu_controller_ in this function, and the scoped
 | |
|       // variables in this block.
 | |
|       int screenX = 0, screenY = 0;
 | |
|       CefRefPtr<CefRenderHandler> handler =
 | |
|           manager->browser()->GetClient()->GetRenderHandler();
 | |
|       if (!handler->GetScreenPoint(manager->browser(),
 | |
|                                    manager->params().x, manager->params().y,
 | |
|                                    screenX, screenY)) {
 | |
|         return false;
 | |
|       }
 | |
| 
 | |
|       // Don't show the menu unless there is a parent native window to tie it to
 | |
|       if (!manager->browser()->GetWindowHandle())
 | |
|         return false;
 | |
| 
 | |
|       NSPoint screen_position =
 | |
|           NSPointFromCGPoint(gfx::Point(screenX, screenY).ToCGPoint());
 | |
|       [[menu_controller_ menu] popUpMenuPositioningItem:nil
 | |
|                                              atLocation:screen_position
 | |
|                                                  inView:nil];
 | |
|     } else {
 | |
|       [NSMenu popUpContextMenu:[menu_controller_ menu]
 | |
|                      withEvent:clickEvent
 | |
|                        forView:parent_view];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return true;
 | |
| }
 |