⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hiwebview.m

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 M
📖 第 1 页 / 共 4 页
字号:
}//-----------------------------------------------------------------------------------//	HIWebViewEventHandler//-----------------------------------------------------------------------------------//	Our object's virtual event handler method. I'm not sure if we need this these days.//	We used to do various things with it, but those days are long gone...//static OSStatusHIWebViewEventHandler(	EventHandlerCallRef	inCallRef,	EventRef			inEvent,	void *				inUserData ){	OSStatus			result = eventNotHandledErr;	HIPoint				where;	OSType				tag;	void *				ptr;	Size				size;	UInt32				features;	RgnHandle			region = NULL;	ControlPartCode		part;	HIWebView*			view = (HIWebView*)inUserData;        // [NSApp setWindowsNeedUpdate:YES] must be called before events so that ActivateTSMDocument is called to set an active document.         // Without an active document, TSM will use a default document which uses a bottom-line input window which we don't want.        [NSApp setWindowsNeedUpdate:YES];        	switch ( GetEventClass( inEvent ) )	{		case kEventClassHIObject:			switch ( GetEventKind( inEvent ) )			{				case kEventHIObjectConstruct:					{						HIObjectRef		object;						result = GetEventParameter( inEvent, kEventParamHIObjectInstance,								typeHIObjectRef, NULL, sizeof( HIObjectRef ), NULL, &object );						require_noerr( result, MissingParameter );												// on entry for our construct event, we're passed the						// creation proc we registered with for this class.						// we use it now to create the instance, and then we						// replace the instance parameter data with said instance						// as type void.						view = HIWebViewConstructor( (HIViewRef)object );						if ( view )						{							SetEventParameter( inEvent, kEventParamHIObjectInstance,									typeVoidPtr, sizeof( void * ), &view ); 						}					}					break;								case kEventHIObjectDestruct:					HIWebViewDestructor( view );					// result is unimportant					break;			}			break;		case kEventClassKeyboard:			{				NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent);				[view->fKitWindow sendSuperEvent:kitEvent];				[kitEvent release];				result = noErr;			}			break;		case kEventClassMouse:			switch ( GetEventKind( inEvent ) )			{				case kEventMouseUp:					result = MouseUp( view, inEvent );					break;								case kEventMouseWheelMoved:					result = MouseWheelMoved( view, inEvent );					break;				case kEventMouseMoved:					result = MouseMoved( view, inEvent );					break;				case kEventMouseDragged:					result = MouseDragged( view, inEvent );					break;			}			break;		case kEventClassCommand:			{				HICommand		command;								result = GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL,								sizeof( HICommand ), NULL, &command );				require_noerr( result, MissingParameter );								switch ( GetEventKind( inEvent ) )				{					case kEventCommandProcess:						result = ProcessCommand( view, &command );						break;										case kEventCommandUpdateStatus:						result = UpdateCommandStatus( view, &command );						break;				}			}			break;		case kEventClassControl:			switch ( GetEventKind( inEvent ) )			{				case kEventControlInitialize:					features = GetBehaviors();					SetEventParameter( inEvent, kEventParamControlFeatures, typeUInt32,							sizeof( UInt32 ), &features );					result = noErr;					break;									case kEventControlDraw:					{						CGContextRef		context = NULL;												GetEventParameter( inEvent, kEventParamRgnHandle, typeQDRgnHandle, NULL,								sizeof( RgnHandle ), NULL, &region );						GetEventParameter( inEvent, kEventParamCGContextRef, typeCGContextRef, NULL,								sizeof( CGContextRef ), NULL, &context );						Draw( view, region, context );						result = noErr;					}					break;								case kEventControlHitTest:					GetEventParameter( inEvent, kEventParamMouseLocation, typeHIPoint, NULL,							sizeof( HIPoint ), NULL, &where );					part = HitTest( view, &where );					SetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, sizeof( ControlPartCode ), &part );					result = noErr;					break;									case kEventControlGetPartRegion:					GetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, NULL,							sizeof( ControlPartCode ), NULL, &part );					GetEventParameter( inEvent, kEventParamControlRegion, typeQDRgnHandle, NULL,							sizeof( RgnHandle ), NULL, &region );					result = GetRegion( view, part, region );					break;								case kEventControlGetData:					GetEventParameter(inEvent, kEventParamControlPart, typeControlPartCode, NULL, sizeof(ControlPartCode), NULL, &part);					GetEventParameter(inEvent, kEventParamControlDataTag, typeEnumeration, NULL, sizeof(OSType), NULL, &tag);					GetEventParameter(inEvent, kEventParamControlDataBuffer, typePtr, NULL, sizeof(Ptr), NULL, &ptr);					GetEventParameter(inEvent, kEventParamControlDataBufferSize, typeByteCount, NULL, sizeof(Size), NULL, &size);					if (tag == kControlKindTag) {						Size outSize;						result = noErr;						if (ptr) {							if (size != sizeof(ControlKind))								result = errDataSizeMismatch;							else								(*(ControlKind *)ptr) = GetKind();						}						outSize = sizeof(ControlKind);						SetEventParameter(inEvent, kEventParamControlDataBufferSize, typeByteCount, sizeof(Size), &outSize);					}					break;								case kEventControlBoundsChanged:					{						HIRect		prevRect, currRect;						UInt32		attrs;												GetEventParameter( inEvent, kEventParamAttributes, typeUInt32, NULL,								sizeof( UInt32 ), NULL, &attrs );						GetEventParameter( inEvent, kEventParamOriginalBounds, typeHIRect, NULL,								sizeof( HIRect ), NULL, &prevRect );						GetEventParameter( inEvent, kEventParamCurrentBounds, typeHIRect, NULL,								sizeof( HIRect ), NULL, &currRect );						BoundsChanged( view, attrs, &prevRect, &currRect );						result = noErr;					}					break;								case kEventControlActivate:					ActiveStateChanged( view );					result = noErr;					break;									case kEventControlDeactivate:					ActiveStateChanged( view );					result = noErr;					break;																			case kEventControlOwningWindowChanged:					{						WindowRef		fromWindow, toWindow;												result = GetEventParameter( inEvent, kEventParamControlOriginalOwningWindow, typeWindowRef, NULL,										sizeof( WindowRef ), NULL, &fromWindow );						require_noerr( result, MissingParameter );						result = GetEventParameter( inEvent, kEventParamControlCurrentOwningWindow, typeWindowRef, NULL,										sizeof( WindowRef ), NULL, &toWindow );						require_noerr( result, MissingParameter );						OwningWindowChanged( view, fromWindow, toWindow );												result = noErr;					}					break;                                    				case kEventControlClick:					result = Click( view, inEvent );					break;                                    				case kEventControlContextualMenuClick:					result = ContextMenuClick( view, inEvent );					break;                                    				case kEventControlSetFocusPart:					{						ControlPartCode		desiredFocus;						RgnHandle			invalidRgn;						Boolean				focusEverything;						ControlPartCode		actualFocus;												result = GetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, NULL,										sizeof( ControlPartCode ), NULL, &desiredFocus ); 						require_noerr( result, MissingParameter );												GetEventParameter( inEvent, kEventParamControlInvalRgn, typeQDRgnHandle, NULL,								sizeof( RgnHandle ), NULL, &invalidRgn );						focusEverything = false; // a good default in case the parameter doesn't exist						GetEventParameter( inEvent, kEventParamControlFocusEverything, typeBoolean, NULL,								sizeof( Boolean ), NULL, &focusEverything );						result = SetFocusPart( view, desiredFocus, invalidRgn, focusEverything, &actualFocus );												if ( result == noErr )							verify_noerr( SetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode,									sizeof( ControlPartCode ), &actualFocus ) );					}					break;								// some other kind of Control event				default:					break;			}			break;					// some other event class		default:			break;	}MissingParameter:	return result;}static void UpdateObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info);static voidStartUpdateObserver( HIWebView* view ){	CFRunLoopObserverContext	context;	CFRunLoopObserverRef		observer;    CFRunLoopRef				mainRunLoop;        check( view->fIsComposited == false );    check( view->fUpdateObserver == NULL );	context.version = 0;	context.info = view;	context.retain = NULL;	context.release = NULL;	context.copyDescription = NULL;    mainRunLoop = (CFRunLoopRef)GetCFRunLoopFromEventLoop( GetMainEventLoop() );	observer = CFRunLoopObserverCreate( NULL, kCFRunLoopEntry | kCFRunLoopBeforeWaiting, true, 0, UpdateObserver, &context );	CFRunLoopAddObserver( mainRunLoop, observer, kCFRunLoopCommonModes );     view->fUpdateObserver = observer;    //    printf( "Update observer started\n" );}static voidStopUpdateObserver( HIWebView* view ){    check( view->fIsComposited == false );    check( view->fUpdateObserver != NULL );    CFRunLoopObserverInvalidate( view->fUpdateObserver );    CFRelease( view->fUpdateObserver );    view->fUpdateObserver = NULL;//    printf( "Update observer removed\n" );}static void UpdateObserver( CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info ){	HIWebView*			view = (HIWebView*)info;    RgnHandle			region = NewRgn();    //    printf( "Update observer called\n" );    if ( region )    {        GetWindowRegion( GetControlOwner( view->fViewRef ), kWindowUpdateRgn, region );                if ( !EmptyRgn( region ) )        {            RgnHandle		ourRgn = NewRgn();            Rect			rect;                        GetWindowBounds( GetControlOwner( view->fViewRef ), kWindowStructureRgn, &rect );            //            printf( "Update region is non-empty\n" );                        if ( ourRgn )            {                Rect		rect;                GrafPtr		savePort, port;                Point		offset = { 0, 0 };                                port = GetWindowPort( GetControlOwner( view->fViewRef ) );                                GetPort( &savePort );                SetPort( port );                                GlobalToLocal( &offset );                OffsetRgn( region, offset.h, offset.v );                GetControlBounds( view->fViewRef, &rect );                RectRgn( ourRgn, &rect );                //                printf( "our control is at %d %d %d %d\n",//                        rect.top, rect.left, rect.bottom, rect.right );                                GetRegionBounds( region, &rect );//                printf( "region is at %d %d %d %d\n",//                        rect.top, rect.left, rect.bottom, rect.right );                SectRgn( ourRgn, region, ourRgn );                                GetRegionBounds( ourRgn, &rect );//                printf( "intersection is  %d %d %d %d\n",//                       rect.top, rect.left, rect.bottom, rect.right );                if ( !EmptyRgn( ourRgn ) )                {                    RgnHandle	saveVis = NewRgn();                    //                    printf( "looks like we should draw\n" );                    if ( saveVis )                    {//                        RGBColor	kRedColor = { 0xffff, 0, 0 };                                                GetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), saveVis );                        SetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), ourRgn );                        //                        RGBForeColor( &kRedColor );//                        PaintRgn( ourRgn );//                        QDFlushPortBuffer( port, NULL );//                        Delay( 15, NULL );                        Draw1Control( view->fViewRef );                        ValidWindowRgn( GetControlOwner( view->fViewRef ), ourRgn );                                                SetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), saveVis );                        DisposeRgn( saveVis );                    }                }                SetPort( savePort );                                DisposeRgn( ourRgn );            }        }                DisposeRgn( region );    }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -