📄 webkit.mm
字号:
/////////////////////////////////////////////////////////////////////////////// Name: webkit.mm// Purpose: wxWebKitCtrl - embeddable web kit control// Author: Jethro Grassie / Kevin Ollivier// Modified by:// Created: 2004-4-16// RCS-ID: $Id: webkit.mm,v 1.30 2006/12/06 04:37:32 KO Exp $// Copyright: (c) Jethro Grassie / Kevin Ollivier// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "webkit.h"#endif// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#include "wx/splitter.h"#ifndef WX_PRECOMP #include "wx/wx.h"#endif#if wxUSE_WEBKIT#ifdef __WXCOCOA__#include "wx/cocoa/autorelease.h"#else#include "wx/mac/uma.h"#include <Carbon/Carbon.h>#include <WebKit/WebKit.h>#include <WebKit/HIWebView.h>#include <WebKit/CarbonUtils.h>#endif#include "wx/html/webkit.h"#define DEBUG_WEBKIT_SIZING 0// ----------------------------------------------------------------------------// macros// ----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS(wxWebKitCtrl, wxControl)BEGIN_EVENT_TABLE(wxWebKitCtrl, wxControl) EVT_SIZE(wxWebKitCtrl::OnSize)END_EVENT_TABLE()// ----------------------------------------------------------------------------// Carbon Events handlers// ----------------------------------------------------------------------------// prototype for function in src/mac/carbon/toplevel.cppvoid SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent );static const EventTypeSpec eventList[] ={ //{ kEventClassControl, kEventControlTrack } , { kEventClassMouse, kEventMouseUp }, { kEventClassMouse, kEventMouseDown }, { kEventClassMouse, kEventMouseMoved }, { kEventClassMouse, kEventMouseDragged }, { kEventClassKeyboard, kEventRawKeyDown } , { kEventClassKeyboard, kEventRawKeyRepeat } , { kEventClassKeyboard, kEventRawKeyUp } , { kEventClassKeyboard, kEventRawKeyModifiersChanged } , { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } , { kEventClassTextInput, kEventTextInputUpdateActiveInputArea } , #if DEBUG_WEBKIT_SIZING == 1 { kEventClassControl, kEventControlBoundsChanged } ,#endif};// mix this in from window.cpppascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ;// NOTE: This is mostly taken from KeyboardEventHandler in toplevel.cpp, but// that expects the data pointer is a top-level window, so I needed to change// that in this case. However, once 2.8 is out, we should factor out the common logic// among the two functions and merge them.static pascal OSStatus wxWebKitKeyEventHandler( EventHandlerCallRef handler , EventRef event , void *data ){ OSStatus result = eventNotHandledErr ; wxMacCarbonEvent cEvent( event ) ; wxWebKitCtrl* thisWindow = (wxWebKitCtrl*) data ; wxWindow* focus = thisWindow ; unsigned char charCode ; wxChar uniChar[2] ; uniChar[0] = 0; uniChar[1] = 0; UInt32 keyCode ; UInt32 modifiers ; Point point ; UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;#if wxUSE_UNICODE ByteCount dataSize = 0 ; if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize, NULL ) == noErr ) { UniChar buf[2] ; int numChars = dataSize / sizeof( UniChar) + 1; UniChar* charBuf = buf ; if ( numChars * 2 > 4 ) charBuf = new UniChar[ numChars ] ; GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ; charBuf[ numChars - 1 ] = 0;#if SIZEOF_WCHAR_T == 2 uniChar = charBuf[0] ;#else wxMBConvUTF16 converter ; converter.MB2WC( uniChar , (const char*)charBuf , 2 ) ;#endif if ( numChars * 2 > 4 ) delete[] charBuf ; }#endif GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode ); GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode ); GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers ); GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point ); UInt32 message = (keyCode << 8) + charCode; switch ( GetEventKind( event ) ) { case kEventRawKeyRepeat : case kEventRawKeyDown : { WXEVENTREF formerEvent = wxTheApp->MacGetCurrentEvent() ; WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ; wxTheApp->MacSetCurrentEvent( event , handler ) ; if ( /* focus && */ wxTheApp->MacSendKeyDownEvent( focus , message , modifiers , when , point.h , point.v , uniChar[0] ) ) { result = noErr ; } wxTheApp->MacSetCurrentEvent( formerEvent , formerHandler ) ; } break ; case kEventRawKeyUp : if ( /* focus && */ wxTheApp->MacSendKeyUpEvent( focus , message , modifiers , when , point.h , point.v , uniChar[0] ) ) { result = noErr ; } break ; case kEventRawKeyModifiersChanged : { wxKeyEvent event(wxEVT_KEY_DOWN); event.m_shiftDown = modifiers & shiftKey; event.m_controlDown = modifiers & controlKey; event.m_altDown = modifiers & optionKey; event.m_metaDown = modifiers & cmdKey; event.m_x = point.h; event.m_y = point.v;#if wxUSE_UNICODE event.m_uniChar = uniChar[0] ;#endif event.SetTimestamp(when); event.SetEventObject(focus); if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & controlKey ) { event.m_keyCode = WXK_CONTROL ; event.SetEventType( ( modifiers & controlKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; focus->GetEventHandler()->ProcessEvent( event ) ; } if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & shiftKey ) { event.m_keyCode = WXK_SHIFT ; event.SetEventType( ( modifiers & shiftKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; focus->GetEventHandler()->ProcessEvent( event ) ; } if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & optionKey ) { event.m_keyCode = WXK_ALT ; event.SetEventType( ( modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; focus->GetEventHandler()->ProcessEvent( event ) ; } if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & cmdKey ) { event.m_keyCode = WXK_COMMAND ; event.SetEventType( ( modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; focus->GetEventHandler()->ProcessEvent( event ) ; } wxApp::s_lastModifiers = modifiers ; } break ; default: break; } return result ;}static pascal OSStatus wxWebKitCtrlEventHandler( EventHandlerCallRef handler , EventRef event , void *data ){ OSStatus result = eventNotHandledErr ; wxMacCarbonEvent cEvent( event ) ; ControlRef controlRef ; wxWebKitCtrl* thisWindow = (wxWebKitCtrl*) data ; wxTopLevelWindowMac* tlw = NULL; if (thisWindow) tlw = thisWindow->MacGetTopLevelWindow(); cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ; wxWindow* currentMouseWindow = thisWindow ; if ( wxApp::s_captureWindow ) currentMouseWindow = wxApp::s_captureWindow; switch ( GetEventClass( event ) ) { case kEventClassKeyboard: { result = wxWebKitKeyEventHandler(handler, event, data); break; } case kEventClassTextInput: { result = wxMacUnicodeTextEventHandler(handler, event, data); break; } case kEventClassMouse: { switch ( GetEventKind( event ) ) { case kEventMouseDragged : case kEventMouseMoved : case kEventMouseDown : case kEventMouseUp : { wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent( wxevent , cEvent ) ; currentMouseWindow->ScreenToClient( &wxevent.m_x , &wxevent.m_y ) ; wxevent.SetEventObject( currentMouseWindow ) ; wxevent.SetId( currentMouseWindow->GetId() ) ; if ( currentMouseWindow->GetEventHandler()->ProcessEvent(wxevent) ) { result = noErr; } break; // this should enable WebKit to fire mouse dragged and mouse up events... } default : break ; } } default: break; } result = CallNextEventHandler(handler, event); return result ;}DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebKitCtrlEventHandler )// ----------------------------------------------------------------------------// wxWebKit Events// ----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS( wxWebKitStateChangedEvent, wxCommandEvent )DEFINE_EVENT_TYPE( wxEVT_WEBKIT_STATE_CHANGED )wxWebKitStateChangedEvent::wxWebKitStateChangedEvent( wxWindow* win ){ SetEventType( wxEVT_WEBKIT_STATE_CHANGED); SetEventObject( win ); SetId(win->GetId());}IMPLEMENT_DYNAMIC_CLASS( wxWebKitBeforeLoadEvent, wxCommandEvent )DEFINE_EVENT_TYPE( wxEVT_WEBKIT_BEFORE_LOAD )wxWebKitBeforeLoadEvent::wxWebKitBeforeLoadEvent( wxWindow* win ){ m_cancelled = false; SetEventType( wxEVT_WEBKIT_BEFORE_LOAD); SetEventObject( win ); SetId(win->GetId());}//---------------------------------------------------------// helper functions for NSString<->wxString conversion//---------------------------------------------------------inline wxString wxStringWithNSString(NSString *nsstring){#if wxUSE_UNICODE return wxString([nsstring UTF8String], wxConvUTF8);#else return wxString([nsstring lossyCString]);#endif // wxUSE_UNICODE}inline NSString* wxNSStringWithWxString(const wxString &wxstring){#if wxUSE_UNICODE return [NSString stringWithUTF8String: wxstring.mb_str(wxConvUTF8)];#else return [NSString stringWithCString: wxstring.c_str() length:wxstring.Len()];#endif // wxUSE_UNICODE}inline int wxNavTypeFromWebNavType(int type){ if (type == WebNavigationTypeLinkClicked) return wxWEBKIT_NAV_LINK_CLICKED; if (type == WebNavigationTypeFormSubmitted) return wxWEBKIT_NAV_FORM_SUBMITTED; if (type == WebNavigationTypeBackForward) return wxWEBKIT_NAV_BACK_NEXT; if (type == WebNavigationTypeReload) return wxWEBKIT_NAV_RELOAD; if (type == WebNavigationTypeFormResubmitted) return wxWEBKIT_NAV_FORM_RESUBMITTED; return wxWEBKIT_NAV_OTHER;}@interface MyFrameLoadMonitor : NSObject{ wxWebKitCtrl* webKitWindow;}- initWithWxWindow: (wxWebKitCtrl*)inWindow;@end@interface MyPolicyDelegate : NSObject{ wxWebKitCtrl* webKitWindow;}- initWithWxWindow: (wxWebKitCtrl*)inWindow;@end// ----------------------------------------------------------------------------// creation/destruction// ----------------------------------------------------------------------------bool wxWebKitCtrl::Create(wxWindow *parent, wxWindowID winID, const wxString& strURL, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name){ m_currentURL = strURL; //m_pageTitle = _("Untitled Page"); //still needed for wxCocoa??/* int width, height; wxSize sizeInstance; if (size.x == wxDefaultCoord || size.y == wxDefaultCoord) { m_parent->GetClientSize(&width, &height); sizeInstance.x = width; sizeInstance.y = height; } else { sizeInstance.x = size.x; sizeInstance.y = size.y; }*/ // now create and attach WebKit view...#ifdef __WXCOCOA__ wxControl::Create(parent, m_windowID, pos, sizeInstance, style , validator , name); SetSize(pos.x, pos.y, sizeInstance.x, sizeInstance.y); wxTopLevelWindowCocoa *topWin = wxDynamicCast(this, wxTopLevelWindowCocoa); NSWindow* nsWin = topWin->GetNSWindow(); NSRect rect; rect.origin.x = pos.x; rect.origin.y = pos.y; rect.size.width = sizeInstance.x; rect.size.height = sizeInstance.y; m_webView = (WebView*)[[WebView alloc] initWithFrame:rect frameName:@"webkitFrame" groupName:@"webkitGroup"]; SetNSView(m_webView); [m_cocoaNSView release]; if(m_parent) m_parent->CocoaAddChild(this); SetInitialFrameRect(pos,sizeInstance);#else m_macIsUserPane = false; wxControl::Create(parent, winID, pos, size, style , validator , name); m_peer = new wxMacControl(this); WebInitForCarbon(); HIWebViewCreate( m_peer->GetControlRefAddr() ); m_webView = (WebView*) HIWebViewGetWebView( m_peer->GetControlRef() );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -