Mac-specific: Implement scanning in Safari (issue #129)

This commit is contained in:
Abs62 2013-04-11 17:35:59 +04:00
parent 4199ea20a8
commit dd0a4fc896

View file

@ -130,6 +130,7 @@ void MacMouseOver::handlePosition()
QString strToTranslate;
CGPoint pt = carbonScreenPointFromCocoaScreenPoint( [NSEvent mouseLocation] );
CFArrayRef names = 0;
AXUIElementRef elem = 0;
AXError err = AXUIElementCopyElementAtPosition( elementSystemWide, pt.x, pt.y, &elem );
@ -141,8 +142,16 @@ void MacMouseOver::handlePosition()
{
CFTypeRef parameter = AXValueCreate( kAXValueCGPointType, &pt );
CFTypeRef rangeValue;
err = AXUIElementCopyParameterizedAttributeNames( elem, &names );
if( err != kAXErrorSuccess )
break;
int numOfAttributes = CFArrayGetCount( names );
if( CFArrayContainsValue( names, CFRangeMake( 0, numOfAttributes ), CFSTR( "AXRangeForPosition" ) ) )
{
// Standard interface
err = AXUIElementCopyParameterizedAttributeValue( elem, kAXRangeForPositionParameterizedAttribute,
parameter, &rangeValue );
parameter, ( CFTypeRef * )&rangeValue );
CFRelease( parameter );
if( err != kAXErrorSuccess )
break;
@ -193,11 +202,40 @@ void MacMouseOver::handlePosition()
handleRetrievedString( strToTranslate, wordPos );
}
}
else if( CFArrayContainsValue( names, CFRangeMake( 0, numOfAttributes ), CFSTR( "AXTextMarkerForPosition" ) ) )
{
// Safari interface
CFTypeRef marker, range;
CFStringRef str;
err = AXUIElementCopyParameterizedAttributeValue( elem, CFSTR( "AXTextMarkerForPosition" ),
parameter, ( CFTypeRef * )&marker );
CFRelease( parameter );
if( err != kAXErrorSuccess )
break;
err = AXUIElementCopyParameterizedAttributeValue( elem, CFSTR( "AXLeftWordTextMarkerRangeForTextMarker" ),
marker, ( CFTypeRef * )&range );
CFRelease( marker );
if( err != kAXErrorSuccess )
break;
err = AXUIElementCopyParameterizedAttributeValue( elem, CFSTR( "AXStringForTextMarkerRange" ),
range, ( CFTypeRef * )&str );
CFRelease( range );
if( err == kAXErrorSuccess )
{
strToTranslate = CFStringRefToQString( str );
CFRelease( str );
handleRetrievedString( strToTranslate, 0 );
}
}
break;
}
if( elem )
CFRelease( elem );
if( names )
CFRelease( names );
}
void MacMouseOver::handleRetrievedString( QString & wordSeq, int wordSeqPos )