Merge branch 'master' of https://github.com/MaxWhere/electron into MaxWhere-master
This commit is contained in:
commit
ee0d48dc5a
11 changed files with 602 additions and 2 deletions
|
@ -8,6 +8,9 @@
|
|||
#include "atom/browser/api/atom_api_web_contents.h"
|
||||
#include "atom/browser/browser.h"
|
||||
#include "atom/browser/native_window.h"
|
||||
#include "atom/common/node_includes.h"
|
||||
#include "atom/common/options_switches.h"
|
||||
#include "atom/common/event_types.h"
|
||||
#include "atom/common/native_mate_converters/callback.h"
|
||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||
|
@ -18,6 +21,7 @@
|
|||
#include "native_mate/constructor.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
#include "ui/gfx/geometry/rect.h"
|
||||
#include "v8/include/v8.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include "atom/browser/native_window_views.h"
|
||||
|
@ -105,6 +109,15 @@ void Window::WillCloseWindow(bool* prevent_default) {
|
|||
*prevent_default = Emit("close");
|
||||
}
|
||||
|
||||
void Window::OnFrameRendered(scoped_ptr<uint8[]> rgb, const int size) {
|
||||
v8::Locker locker(isolate());
|
||||
v8::HandleScope handle_scope(isolate());
|
||||
|
||||
auto data = node::Buffer::New(isolate(), reinterpret_cast<const char*>(rgb.get()), static_cast<size_t>(size));
|
||||
|
||||
Emit("frame-rendered", data, size);
|
||||
}
|
||||
|
||||
void Window::OnWindowClosed() {
|
||||
if (api_web_contents_) {
|
||||
api_web_contents_->DestroyWebContents();
|
||||
|
@ -450,6 +463,14 @@ void Window::CapturePage(mate::Arguments* args) {
|
|||
rect, base::Bind(&OnCapturePageDone, args->isolate(), callback));
|
||||
}
|
||||
|
||||
void Window::BeginFrameSubscription() {
|
||||
window_->SetFrameSubscription(true);
|
||||
}
|
||||
|
||||
void Window::EndFrameSubscription() {
|
||||
window_->SetFrameSubscription(false);
|
||||
}
|
||||
|
||||
void Window::SetProgressBar(double progress) {
|
||||
window_->SetProgressBar(progress);
|
||||
}
|
||||
|
@ -526,6 +547,127 @@ bool Window::IsVisibleOnAllWorkspaces() {
|
|||
return window_->IsVisibleOnAllWorkspaces();
|
||||
}
|
||||
|
||||
void Window::SendKeyboardEvent(v8::Isolate* isolate, const mate::Dictionary& data){
|
||||
auto type = blink::WebInputEvent::Type::Char;
|
||||
int modifiers = 0;
|
||||
int keycode = 0;
|
||||
int native = 0;
|
||||
std::string type_str = "";
|
||||
mate::Dictionary modifier_list = mate::Dictionary::CreateEmpty(isolate);
|
||||
|
||||
data.Get(switches::kEventType, &type_str);
|
||||
data.Get(switches::kModifiers, &modifier_list);
|
||||
data.Get(switches::kKeyCode, &keycode);
|
||||
data.Get(switches::kNativeKeyCode, &native);
|
||||
|
||||
if(type_str.compare(event_types::kKeyDown) == 0){
|
||||
type = blink::WebInputEvent::Type::KeyDown;
|
||||
}else if(type_str.compare(event_types::kKeyUp) == 0){
|
||||
type = blink::WebInputEvent::Type::KeyUp;
|
||||
}else if(type_str.compare(event_types::kChar) == 0){
|
||||
type = blink::WebInputEvent::Type::Char;
|
||||
}
|
||||
|
||||
std::map<std::string, bool> modifier_types;
|
||||
modifier_types[event_types::kModifierIsKeyPad] = false;
|
||||
modifier_types[event_types::kModifierIsAutoRepeat] = false;
|
||||
modifier_types[event_types::kModifierIsLeft] = false;
|
||||
modifier_types[event_types::kModifierIsRight] = false;
|
||||
modifier_types[event_types::kModifierShiftKey] = false;
|
||||
modifier_types[event_types::kModifierControlKey] = false;
|
||||
modifier_types[event_types::kModifierAltKey] = false;
|
||||
modifier_types[event_types::kModifierMetaKey] = false;
|
||||
modifier_types[event_types::kModifierCapsLockOn] = false;
|
||||
modifier_types[event_types::kModifierNumLockOn] = false;
|
||||
|
||||
for(std::map<std::string, bool>::iterator it = modifier_types.begin(); it != modifier_types.end(); ++it){
|
||||
modifier_list.Get(it->first,&(it->second));
|
||||
|
||||
if(it->second) modifiers = modifiers & event_types::modifierStrToWebModifier(it->first);
|
||||
}
|
||||
|
||||
window_->SendKeyboardEvent(type, modifiers, keycode, native);
|
||||
}
|
||||
|
||||
void Window::SendMouseEvent(v8::Isolate* isolate, const mate::Dictionary& data){
|
||||
int x, y, movementX, movementY, clickCount;
|
||||
std::string type_str = "";
|
||||
std::string button_str = "";
|
||||
mate::Dictionary modifier_list = mate::Dictionary::CreateEmpty(isolate);
|
||||
|
||||
blink::WebInputEvent::Type type = blink::WebInputEvent::Type::MouseMove;
|
||||
blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::ButtonNone;
|
||||
int modifiers = 0;
|
||||
|
||||
data.Get(switches::kEventType, &type_str);
|
||||
data.Get(switches::kMouseEventButton, &button_str);
|
||||
data.Get(switches::kModifiers, &modifier_list);
|
||||
|
||||
if(type_str.compare(event_types::kMouseDown) == 0){
|
||||
type = blink::WebInputEvent::Type::MouseDown;
|
||||
}else if(type_str.compare(event_types::kMouseUp) == 0){
|
||||
type = blink::WebInputEvent::Type::MouseUp;
|
||||
}else if(type_str.compare(event_types::kMouseMove) == 0){
|
||||
type = blink::WebInputEvent::Type::MouseMove;
|
||||
}else if(type_str.compare(event_types::kMouseEnter) == 0){
|
||||
type = blink::WebInputEvent::Type::MouseEnter;
|
||||
}else if(type_str.compare(event_types::kMouseLeave) == 0){
|
||||
type = blink::WebInputEvent::Type::MouseLeave;
|
||||
}else if(type_str.compare(event_types::kContextMenu) == 0){
|
||||
type = blink::WebInputEvent::Type::ContextMenu;
|
||||
}else if(type_str.compare(event_types::kMouseWheel) == 0){
|
||||
type = blink::WebInputEvent::Type::MouseWheel;
|
||||
}
|
||||
|
||||
std::map<std::string, bool> modifier_types;
|
||||
modifier_types[event_types::kMouseLeftButton] = false;
|
||||
modifier_types[event_types::kMouseRightButton] = false;
|
||||
modifier_types[event_types::kMouseMiddleButton] = false;
|
||||
modifier_types[event_types::kModifierLeftButtonDown] = false;
|
||||
modifier_types[event_types::kModifierMiddleButtonDown] = false;
|
||||
modifier_types[event_types::kModifierRightButtonDown] = false;
|
||||
modifier_types[event_types::kModifierShiftKey] = false;
|
||||
modifier_types[event_types::kModifierControlKey] = false;
|
||||
modifier_types[event_types::kModifierAltKey] = false;
|
||||
modifier_types[event_types::kModifierMetaKey] = false;
|
||||
modifier_types[event_types::kModifierCapsLockOn] = false;
|
||||
modifier_types[event_types::kModifierNumLockOn] = false;
|
||||
|
||||
for(std::map<std::string, bool>::iterator it = modifier_types.begin(); it != modifier_types.end(); ++it){
|
||||
modifier_list.Get(it->first,&(it->second));
|
||||
|
||||
if(it->second) modifiers = modifiers & event_types::modifierStrToWebModifier(it->first);
|
||||
}
|
||||
|
||||
if(type == blink::WebInputEvent::Type::MouseWheel){
|
||||
bool precise = true;
|
||||
|
||||
x = 0;
|
||||
y = 0;
|
||||
data.Get(switches::kX, &x);
|
||||
data.Get(switches::kY, &y);
|
||||
data.Get(switches::kMouseWheelPrecise, &precise);
|
||||
|
||||
window_->SendMouseWheelEvent(modifiers, x, y, precise);
|
||||
}else{
|
||||
if (data.Get(switches::kX, &x) && data.Get(switches::kY, &y)) {
|
||||
if(!data.Get(switches::kMovementX, &movementX)){
|
||||
movementX = 0;
|
||||
}
|
||||
|
||||
if(!data.Get(switches::kMovementY, &movementY)){
|
||||
movementY = 0;
|
||||
}
|
||||
|
||||
if(!data.Get(switches::kClickCount, &clickCount)){
|
||||
clickCount = 0;
|
||||
}
|
||||
|
||||
window_->SendMouseEvent(type, modifiers, button, x, y, movementX, movementY, clickCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t Window::ID() const {
|
||||
return weak_map_id();
|
||||
}
|
||||
|
@ -610,6 +752,10 @@ void Window::BuildPrototype(v8::Isolate* isolate,
|
|||
&Window::SetVisibleOnAllWorkspaces)
|
||||
.SetMethod("isVisibleOnAllWorkspaces",
|
||||
&Window::IsVisibleOnAllWorkspaces)
|
||||
.SetMethod("sendMouseEvent", &Window::SendMouseEvent)
|
||||
.SetMethod("sendKeyboardEvent", &Window::SendKeyboardEvent)
|
||||
.SetMethod("beginFrameSubscription", &Window::BeginFrameSubscription)
|
||||
.SetMethod("endFrameSubscription", &Window::EndFrameSubscription)
|
||||
#if defined(OS_MACOSX)
|
||||
.SetMethod("showDefinitionForSelection",
|
||||
&Window::ShowDefinitionForSelection)
|
||||
|
|
|
@ -53,6 +53,7 @@ class Window : public mate::TrackableObject<Window>,
|
|||
void OnPageTitleUpdated(bool* prevent_default,
|
||||
const std::string& title) override;
|
||||
void WillCloseWindow(bool* prevent_default) override;
|
||||
void OnFrameRendered(scoped_ptr<uint8[]> rgb, const int size) override;
|
||||
void OnWindowClosed() override;
|
||||
void OnWindowBlur() override;
|
||||
void OnWindowFocus() override;
|
||||
|
@ -141,6 +142,11 @@ class Window : public mate::TrackableObject<Window>,
|
|||
bool IsMenuBarVisible();
|
||||
void SetAspectRatio(double aspect_ratio, mate::Arguments* args);
|
||||
|
||||
void SendKeyboardEvent(v8::Isolate* isolate, const mate::Dictionary& data);
|
||||
void SendMouseEvent(v8::Isolate* isolate, const mate::Dictionary& data);
|
||||
void BeginFrameSubscription();
|
||||
void EndFrameSubscription();
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
void ShowDefinitionForSelection();
|
||||
#endif
|
||||
|
|
|
@ -8,6 +8,11 @@
|
|||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "content/public/browser/render_widget_host_view_frame_subscriber.h"
|
||||
#include "content/public/browser/native_web_keyboard_event.h"
|
||||
#include "third_party/WebKit/public/web/WebInputEvent.h"
|
||||
#include "media/base/video_frame.h"
|
||||
#include "media/base/yuv_convert.h"
|
||||
#include "atom/browser/atom_browser_context.h"
|
||||
#include "atom/browser/atom_browser_main_parts.h"
|
||||
#include "atom/browser/window_list.h"
|
||||
|
@ -38,6 +43,7 @@
|
|||
#include "ui/gfx/geometry/size.h"
|
||||
#include "ui/gfx/screen.h"
|
||||
#include "ui/gl/gpu_switching_manager.h"
|
||||
#include "ui/events/event.h"
|
||||
|
||||
using content::NavigationEntry;
|
||||
using content::RenderWidgetHostView;
|
||||
|
@ -106,8 +112,9 @@ NativeWindow* NativeWindow::FromWebContents(
|
|||
content::WebContents* web_contents) {
|
||||
WindowList& window_list = *WindowList::GetInstance();
|
||||
for (NativeWindow* window : window_list) {
|
||||
if (window->web_contents() == web_contents)
|
||||
if (window->web_contents() == web_contents){
|
||||
return window;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -160,6 +167,9 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
|
|||
options.Get(switches::kTitle, &title);
|
||||
SetTitle(title);
|
||||
|
||||
offscreen_ = false;
|
||||
options.Get(switches::kOffScreenRender, &offscreen_);
|
||||
|
||||
// Then show it.
|
||||
bool show = true;
|
||||
options.Get(switches::kShow, &show);
|
||||
|
@ -286,6 +296,29 @@ void NativeWindow::CapturePage(const gfx::Rect& rect,
|
|||
kBGRA_8888_SkColorType);
|
||||
}
|
||||
|
||||
void NativeWindow::SetFrameSubscription(bool isOffscreen) {
|
||||
if (!isOffscreen && !offscreen_) return;
|
||||
|
||||
const auto view = web_contents()->GetRenderWidgetHostView();
|
||||
|
||||
if (view) {
|
||||
if (isOffscreen) {
|
||||
scoped_ptr<content::RenderWidgetHostViewFrameSubscriber> subscriber(
|
||||
new RenderSubscriber(
|
||||
view->GetVisibleViewportSize(),
|
||||
base::Bind(&NativeWindow::OnFrameReceived, base::Unretained(this))
|
||||
)
|
||||
);
|
||||
|
||||
view->BeginFrameSubscription(subscriber.Pass());
|
||||
} else {
|
||||
view->EndFrameSubscription();
|
||||
}
|
||||
|
||||
offscreen_ = isOffscreen;
|
||||
}
|
||||
}
|
||||
|
||||
void NativeWindow::RequestToClosePage() {
|
||||
bool prevent_default = false;
|
||||
FOR_EACH_OBSERVER(NativeWindowObserver,
|
||||
|
@ -428,6 +461,69 @@ void NativeWindow::DevToolsClosed() {
|
|||
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnDevToolsClosed());
|
||||
}
|
||||
|
||||
void NativeWindow::SendKeyboardEvent(blink::WebInputEvent::Type type, int modifiers, int keycode, int nativeKeycode){
|
||||
auto keyb_event = new content::NativeWebKeyboardEvent;
|
||||
|
||||
keyb_event->nativeKeyCode = nativeKeycode;
|
||||
keyb_event->windowsKeyCode = keycode;
|
||||
keyb_event->setKeyIdentifierFromWindowsKeyCode();
|
||||
keyb_event->type = type;
|
||||
keyb_event->modifiers = modifiers;
|
||||
keyb_event->isSystemKey = false;
|
||||
keyb_event->timeStampSeconds = base::Time::Now().ToDoubleT();
|
||||
keyb_event->skip_in_browser = false;
|
||||
|
||||
if (type == blink::WebInputEvent::Char || type == blink::WebInputEvent::RawKeyDown) {
|
||||
keyb_event->text[0] = keycode;
|
||||
keyb_event->unmodifiedText[0] = keycode;
|
||||
}
|
||||
|
||||
const auto view = web_contents()->GetRenderWidgetHostView();
|
||||
const auto host = view ? view->GetRenderWidgetHost() : nullptr;
|
||||
|
||||
host->ForwardKeyboardEvent(*keyb_event);
|
||||
}
|
||||
|
||||
void NativeWindow::SendMouseEvent(blink::WebInputEvent::Type type, int modifiers, blink::WebMouseEvent::Button button, int x, int y, int movementX, int movementY, int clickCount){
|
||||
auto mouse_event = new blink::WebMouseEvent();
|
||||
|
||||
mouse_event->x = x;
|
||||
mouse_event->y = y;
|
||||
mouse_event->windowX = x;
|
||||
mouse_event->windowY = y;
|
||||
mouse_event->clickCount = clickCount;
|
||||
mouse_event->type = type;
|
||||
mouse_event->modifiers = modifiers;
|
||||
mouse_event->button = button;
|
||||
|
||||
mouse_event->timeStampSeconds = base::Time::Now().ToDoubleT();
|
||||
|
||||
const auto view = web_contents()->GetRenderWidgetHostView();
|
||||
const auto host = view ? view->GetRenderWidgetHost() : nullptr;
|
||||
host->ForwardMouseEvent(*mouse_event);
|
||||
}
|
||||
|
||||
void NativeWindow::SendMouseWheelEvent(int modifiers, int x, int y, bool precise){
|
||||
auto wheel_event = new blink::WebMouseWheelEvent();
|
||||
|
||||
wheel_event->type = blink::WebInputEvent::MouseWheel;
|
||||
wheel_event->deltaX = x;
|
||||
wheel_event->deltaY = y;
|
||||
if(x) wheel_event->wheelTicksX = x > 0.0f ? 1.0f : -1.0f;
|
||||
if(y) wheel_event->wheelTicksY = y > 0.0f ? 1.0f : -1.0f;
|
||||
wheel_event->modifiers = modifiers;
|
||||
wheel_event->hasPreciseScrollingDeltas = precise;
|
||||
wheel_event->canScroll = true;
|
||||
|
||||
const auto view = web_contents()->GetRenderWidgetHostView();
|
||||
const auto host = view ? view->GetRenderWidgetHost() : nullptr;
|
||||
host->ForwardWheelEvent(*wheel_event);
|
||||
}
|
||||
|
||||
void NativeWindow::DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) {
|
||||
SetFrameSubscription(offscreen_);
|
||||
}
|
||||
|
||||
void NativeWindow::RenderViewCreated(
|
||||
content::RenderViewHost* render_view_host) {
|
||||
if (!transparent_)
|
||||
|
@ -505,4 +601,43 @@ void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback,
|
|||
callback.Run(bitmap);
|
||||
}
|
||||
|
||||
void NativeWindow::OnFrameReceived(bool result,
|
||||
scoped_refptr<media::VideoFrame> frame) {
|
||||
if (result) {
|
||||
gfx::Rect rect = frame->visible_rect();
|
||||
|
||||
const int rgb_arr_size = rect.width() * rect.height() * 4;
|
||||
scoped_ptr<uint8[]> rgb_bytes(new uint8[rgb_arr_size]);
|
||||
|
||||
// Convert a frame of YUV to 32 bit ARGB.
|
||||
media::ConvertYUVToRGB32(frame->data(media::VideoFrame::kYPlane),
|
||||
frame->data(media::VideoFrame::kUPlane),
|
||||
frame->data(media::VideoFrame::kVPlane),
|
||||
rgb_bytes.get(),
|
||||
rect.width(), rect.height(),
|
||||
frame->stride(media::VideoFrame::kYPlane),
|
||||
frame->stride(media::VideoFrame::kUVPlane),
|
||||
rect.width() * 4,
|
||||
media::YV12);
|
||||
|
||||
FOR_EACH_OBSERVER(NativeWindowObserver,
|
||||
observers_,
|
||||
OnFrameRendered(rgb_bytes.Pass(), rgb_arr_size));
|
||||
}
|
||||
}
|
||||
|
||||
bool RenderSubscriber::ShouldCaptureFrame(
|
||||
const gfx::Rect& damage_rect,
|
||||
base::TimeTicks present_time,
|
||||
scoped_refptr<media::VideoFrame>* storage,
|
||||
DeliverFrameCallback* callback) {
|
||||
last_present_time_ = present_time;
|
||||
*storage = media::VideoFrame::CreateFrame(media::VideoFrame::YV12, size_,
|
||||
gfx::Rect(size_), size_,
|
||||
base::TimeDelta());
|
||||
|
||||
*callback = base::Bind(&RenderSubscriber::CallbackMethod, callback_, *storage);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace atom
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "media/base/video_frame.h"
|
||||
#include "content/public/browser/render_widget_host_view_frame_subscriber.h"
|
||||
#include "content/public/browser/native_web_keyboard_event.h"
|
||||
#include "third_party/WebKit/public/web/WebInputEvent.h"
|
||||
#include "atom/browser/native_window_observer.h"
|
||||
#include "atom/browser/ui/accelerator_util.h"
|
||||
#include "base/cancelable_callback.h"
|
||||
|
@ -223,6 +227,14 @@ class NativeWindow : public content::WebContentsObserver,
|
|||
has_dialog_attached_ = has_dialog_attached;
|
||||
}
|
||||
|
||||
void OnFrameReceived(bool result, scoped_refptr<media::VideoFrame> frame);
|
||||
|
||||
void SendKeyboardEvent(blink::WebInputEvent::Type type, int modifiers, int keycode, int nativeKeycode);
|
||||
void SendMouseEvent(blink::WebInputEvent::Type type, int modifiers, blink::WebMouseEvent::Button button, int x, int y, int movementX, int movementY, int clickCount);
|
||||
void SendMouseWheelEvent(int modifiers, int x, int y, bool clickCount);
|
||||
|
||||
void SetFrameSubscription(bool isOffscreen);
|
||||
|
||||
protected:
|
||||
NativeWindow(brightray::InspectableWebContents* inspectable_web_contents,
|
||||
const mate::Dictionary& options);
|
||||
|
@ -234,6 +246,7 @@ class NativeWindow : public content::WebContentsObserver,
|
|||
|
||||
// content::WebContentsObserver:
|
||||
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
|
||||
void DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) override;
|
||||
void BeforeUnloadDialogCancelled() override;
|
||||
void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override;
|
||||
bool OnMessageReceived(const IPC::Message& message) override;
|
||||
|
@ -254,6 +267,8 @@ class NativeWindow : public content::WebContentsObserver,
|
|||
const SkBitmap& bitmap,
|
||||
content::ReadbackResponse response);
|
||||
|
||||
bool offscreen_;
|
||||
|
||||
// Whether window has standard frame.
|
||||
bool has_frame_;
|
||||
|
||||
|
@ -296,6 +311,30 @@ class NativeWindow : public content::WebContentsObserver,
|
|||
DISALLOW_COPY_AND_ASSIGN(NativeWindow);
|
||||
};
|
||||
|
||||
//This class provides a way to listen to frame renders and to use the rendered frames for offscreen rendering
|
||||
class RenderSubscriber : public content::RenderWidgetHostViewFrameSubscriber {
|
||||
public:
|
||||
RenderSubscriber(gfx::Size size, base::Callback<void(bool, scoped_refptr<media::VideoFrame>)> callback) : size_(size), callback_(callback) {}
|
||||
|
||||
bool ShouldCaptureFrame(const gfx::Rect& damage_rect,
|
||||
base::TimeTicks present_time,
|
||||
scoped_refptr<media::VideoFrame>* storage,
|
||||
DeliverFrameCallback* callback) override;
|
||||
|
||||
base::TimeTicks last_present_time() const { return last_present_time_; }
|
||||
|
||||
static void CallbackMethod(base::Callback<void(bool, scoped_refptr<media::VideoFrame>)> callback,
|
||||
scoped_refptr<media::VideoFrame> frame,
|
||||
base::TimeTicks present_time,
|
||||
bool success) {
|
||||
callback.Run(success, frame);
|
||||
}
|
||||
|
||||
private:
|
||||
gfx::Size size_;
|
||||
base::Callback<void(bool, scoped_refptr<media::VideoFrame>)> callback_;
|
||||
base::TimeTicks last_present_time_;
|
||||
};
|
||||
|
||||
// This class provides a hook to get a NativeWindow from a WebContents.
|
||||
class NativeWindowRelay :
|
||||
|
|
|
@ -27,6 +27,8 @@ class NativeWindowObserver {
|
|||
const std::string& partition_id,
|
||||
WindowOpenDisposition disposition) {}
|
||||
|
||||
virtual void OnFrameRendered(scoped_ptr<uint8[]> rgb, const int size) {}
|
||||
|
||||
// Called when user is starting an navigation in web page.
|
||||
virtual void WillNavigate(bool* prevent_default, const GURL& url) {}
|
||||
|
||||
|
|
118
atom/common/event_types.cc
Normal file
118
atom/common/event_types.cc
Normal file
|
@ -0,0 +1,118 @@
|
|||
// Copyright (c) 2013 GitHub, Inc.
|
||||
// Use of this source code is governed by the MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "atom/common/event_types.h"
|
||||
#include "third_party/WebKit/public/web/WebInputEvent.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
namespace event_types {
|
||||
|
||||
const char kMouseDown[] = "down";
|
||||
const char kMouseUp[] = "up";
|
||||
const char kMouseMove[] = "move";
|
||||
const char kMouseEnter[] = "enter";
|
||||
const char kMouseLeave[] = "leave";
|
||||
const char kContextMenu[] = "context-menu";
|
||||
const char kMouseWheel[] = "wheel";
|
||||
|
||||
const char kKeyDown[] = "down";
|
||||
const char kKeyUp[] = "up";
|
||||
const char kChar[] = "char";
|
||||
|
||||
const char kMouseLeftButton[] = "left";
|
||||
const char kMouseRightButton[] = "right";
|
||||
const char kMouseMiddleButton[] = "middle";
|
||||
|
||||
const char kModifierLeftButtonDown[] = "left-button-down";
|
||||
const char kModifierMiddleButtonDown[] = "middle-button-down";
|
||||
const char kModifierRightButtonDown[] = "right-button-down";
|
||||
|
||||
const char kModifierShiftKey[] = "shift";
|
||||
const char kModifierControlKey[] = "control";
|
||||
const char kModifierAltKey[] = "alt";
|
||||
const char kModifierMetaKey[] = "meta";
|
||||
const char kModifierCapsLockOn[] = "caps-lock";
|
||||
const char kModifierNumLockOn[] = "num-lock";
|
||||
|
||||
const char kModifierIsKeyPad[] = "keypad";
|
||||
const char kModifierIsAutoRepeat[] = "auto-repeat";
|
||||
const char kModifierIsLeft[] = "left";
|
||||
const char kModifierIsRight[] = "right";
|
||||
|
||||
int modifierStrToWebModifier(std::string modifier){
|
||||
if(modifier.compare(event_types::kModifierLeftButtonDown) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::LeftButtonDown;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierMiddleButtonDown) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::MiddleButtonDown;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierRightButtonDown) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::RightButtonDown;
|
||||
|
||||
}else if(modifier.compare(event_types::kMouseLeftButton) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::LeftButtonDown;
|
||||
|
||||
}else if(modifier.compare(event_types::kMouseRightButton) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::RightButtonDown;
|
||||
|
||||
}else if(modifier.compare(event_types::kMouseMiddleButton) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::MiddleButtonDown;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierIsKeyPad) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::IsKeyPad;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierIsAutoRepeat) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::IsAutoRepeat;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierIsLeft) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::IsLeft;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierIsRight) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::IsRight;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierShiftKey) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::ShiftKey;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierControlKey) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::ControlKey;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierAltKey) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::AltKey;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierMetaKey) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::MetaKey;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierCapsLockOn) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::CapsLockOn;
|
||||
|
||||
}else if(modifier.compare(event_types::kModifierNumLockOn) == 0){
|
||||
|
||||
return blink::WebInputEvent::Modifiers::NumLockOn;
|
||||
|
||||
}else{
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace event_types
|
||||
|
||||
} // namespace atom
|
52
atom/common/event_types.h
Normal file
52
atom/common/event_types.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
// Copyright (c) 2013 GitHub, Inc.
|
||||
// Use of this source code is governed by the MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef ATOM_COMMON_EVENT_TYPES_H_
|
||||
#define ATOM_COMMON_EVENT_TYPES_H_
|
||||
|
||||
#include "third_party/WebKit/public/web/WebInputEvent.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
namespace event_types {
|
||||
|
||||
extern const char kMouseDown[];
|
||||
extern const char kMouseUp[];
|
||||
extern const char kMouseMove[];
|
||||
extern const char kMouseEnter[];
|
||||
extern const char kMouseLeave[];
|
||||
extern const char kContextMenu[];
|
||||
extern const char kMouseWheel[];
|
||||
|
||||
extern const char kKeyDown[];
|
||||
extern const char kKeyUp[];
|
||||
extern const char kChar[];
|
||||
|
||||
extern const char kMouseLeftButton[];
|
||||
extern const char kMouseRightButton[];
|
||||
extern const char kMouseMiddleButton[];
|
||||
|
||||
extern const char kModifierLeftButtonDown[];
|
||||
extern const char kModifierMiddleButtonDown[];
|
||||
extern const char kModifierRightButtonDown[];
|
||||
|
||||
extern const char kModifierShiftKey[];
|
||||
extern const char kModifierControlKey[];
|
||||
extern const char kModifierAltKey[];
|
||||
extern const char kModifierMetaKey[];
|
||||
extern const char kModifierCapsLockOn[];
|
||||
extern const char kModifierNumLockOn[];
|
||||
|
||||
extern const char kModifierIsKeyPad[];
|
||||
extern const char kModifierIsAutoRepeat[];
|
||||
extern const char kModifierIsLeft[];
|
||||
extern const char kModifierIsRight[];
|
||||
|
||||
int modifierStrToWebModifier(std::string modifier);
|
||||
|
||||
} // namespace event_types
|
||||
|
||||
} // namespace atom
|
||||
|
||||
#endif // ATOM_COMMON_EVENT_TYPES_H_
|
|
@ -116,6 +116,19 @@ const char kRegisterStandardSchemes[] = "register-standard-schemes";
|
|||
// The browser process app model ID
|
||||
const char kAppUserModelId[] = "app-user-model-id";
|
||||
|
||||
const char kOffScreenRender[] = "offscreen-render";
|
||||
|
||||
const char kModifiers[] = "modifiers";
|
||||
const char kKeyCode[] = "code";
|
||||
const char kNativeKeyCode[] = "native";
|
||||
|
||||
const char kMovementX[] = "movement-x";
|
||||
const char kMovementY[] = "movement-y";
|
||||
const char kClickCount[] = "click-count";
|
||||
const char kEventType[] = "type";
|
||||
const char kMouseEventButton[] = "button";
|
||||
const char kMouseWheelPrecise[] = "precise";
|
||||
|
||||
} // namespace switches
|
||||
|
||||
} // namespace atom
|
||||
|
|
|
@ -62,6 +62,19 @@ extern const char kRegisterStandardSchemes[];
|
|||
|
||||
extern const char kAppUserModelId[];
|
||||
|
||||
extern const char kOffScreenRender[];
|
||||
|
||||
extern const char kModifiers[];
|
||||
extern const char kKeyCode[];
|
||||
extern const char kNativeKeyCode[];
|
||||
|
||||
extern const char kMovementX[];
|
||||
extern const char kMovementY[];
|
||||
extern const char kClickCount[];
|
||||
extern const char kEventType[];
|
||||
extern const char kMouseEventButton[];
|
||||
extern const char kMouseWheelPrecise[];
|
||||
|
||||
} // namespace switches
|
||||
|
||||
} // namespace atom
|
||||
|
|
|
@ -244,7 +244,16 @@ Emitted when DevTools is closed.
|
|||
|
||||
Emitted when DevTools is focused / opened.
|
||||
|
||||
### Event: 'app-command' _Windows_
|
||||
### Event: 'frame-rendered'
|
||||
|
||||
* `event` Event
|
||||
* `frame` Buffer
|
||||
* `size` Number
|
||||
|
||||
Emitted when *offscreen render* is enabled, the current frame's pixel data
|
||||
and size are available.
|
||||
|
||||
### Event: 'app-command':
|
||||
|
||||
Emitted when an [App Command](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646275(v=vs.85).aspx)
|
||||
is invoked. These are typically related to keyboard media keys or browser
|
||||
|
@ -772,3 +781,68 @@ Sets whether the window should be visible on all workspaces.
|
|||
Returns whether the window is visible on all workspaces.
|
||||
|
||||
**Note:** This API always returns false on Windows.
|
||||
|
||||
### BrowserWindow.beginFrameSubscription()
|
||||
|
||||
Enables offscreen rendering, after this call `frame-rendered` events will be
|
||||
fired when the window receives a new frame from the renderer.
|
||||
|
||||
### BrowserWindow.endFrameSubscription()
|
||||
|
||||
Enables offscreen rendering, after this call `frame-rendered` events will
|
||||
no longer be fired if offscreen rendering was enabled before.
|
||||
|
||||
### BrowserWindow.sendMouseEvent(options)
|
||||
|
||||
Sends a mouse event to the BrowserWindow.
|
||||
* `options` Object
|
||||
* `type` String - The type of the mouse event.
|
||||
* `down` String - Mouse down event.
|
||||
* `up` String - Mouse up event.
|
||||
* `move` String - Mouse move event.
|
||||
* `enter` String - Mouse enter event.
|
||||
* `leave` String - Mouse leave event.
|
||||
* `context-menu` String - Context menu event.
|
||||
* `wheel` String - Mouse wheel event.
|
||||
* `x` Integer - The x component of the location of the mouse event.
|
||||
* `y` Integer - The y component of the location of the mouse event.
|
||||
* `movement-x` Integer - The x component of the mouse movement since the last event.
|
||||
* `movement-y` Integer - The y component of the mouse movement since the last event.
|
||||
* `button` String - The mouse button associated with the mouse event. Also sets the associated modifier values on the event.
|
||||
* `left` String - The left button was pressed.
|
||||
* `right` String - The right button was pressed.
|
||||
* `middle` String - The middle button was pressed.
|
||||
* `click-count` Integer - The number of clicks associated with the mouse event.
|
||||
* `precise` Boolean - For the `wheel` event type, this option sets the `hasPreciseScrollingDeltas` option of the event.
|
||||
* `modifiers` Object - The modifier values associated with the event.
|
||||
* `left-button-down` Boolean - The left mouse button was pressed.
|
||||
* `middle-button-down` Boolean - The right mouse button was pressed.
|
||||
* `right-button-down` Boolean - The middle mouse button was pressed.
|
||||
* `shift` Boolean - The shift key was pressed.
|
||||
* `control` Boolean - The control key was pressed.
|
||||
* `alt` Boolean - The alt key was pressed.
|
||||
* `meta` Boolean - The meta key was pressed.
|
||||
* `caps-lock` Boolean - The caps-lock key was on.
|
||||
* `num-lock` Boolean - The num-lock key was on.
|
||||
|
||||
### BrowserWindow.sendKeyboardEvent(options)
|
||||
|
||||
Sends a keyboard event to the BrowserWindow.
|
||||
* `options` Object
|
||||
* `type` String - The type of the keyboard event.
|
||||
* `down` String - Key down event.
|
||||
* `up` String - Key up event.
|
||||
* `char` String - Character event.
|
||||
* `code` Integer - The key code of the key that generated the event.
|
||||
* `native` Integer - The native key code of the key that generated the event.
|
||||
* `modifiers` Object - The modifier values associated with the event.
|
||||
* `keypad` Boolean - Sets the `IsKeyPad` option of the event.
|
||||
* `auto-repeat` Boolean - Sets the `IsAutoRepeat` option of the event.
|
||||
* `left` Boolean - Sets the `IsLeft` option of the event.
|
||||
* `right` Boolean - Sets the `IsRight` option of the event.
|
||||
* `shift` Boolean - The shift key was pressed.
|
||||
* `control` Boolean - The control key was pressed.
|
||||
* `alt` Boolean - The alt key was pressed.
|
||||
* `meta` Boolean - The meta key was pressed.
|
||||
* `caps-lock` Boolean - The caps-lock key was on.
|
||||
* `num-lock` Boolean - The num-lock key was on.
|
||||
|
|
|
@ -311,6 +311,8 @@
|
|||
'atom/common/node_includes.h',
|
||||
'atom/common/options_switches.cc',
|
||||
'atom/common/options_switches.h',
|
||||
'atom/common/event_types.cc',
|
||||
'atom/common/event_types.h',
|
||||
'atom/common/platform_util.h',
|
||||
'atom/common/platform_util_linux.cc',
|
||||
'atom/common/platform_util_mac.mm',
|
||||
|
|
Loading…
Reference in a new issue