📄 hiwebview.m
字号:
}//-----------------------------------------------------------------------------------// 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, ®ion ); 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, ®ion ); 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 + -