1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     UMA support 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     The wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  14 #include <MacTextEditor.h> 
  17 #  include <Navigation.h> 
  18 #  if defined(TARGET_CARBON) 
  19 #    if PM_USE_SESSION_APIS 
  22 #    include <PMApplication.h> 
  24 #    include <Printing.h> 
  31 #include "wx/mac/uma.h" 
  33 // since we have decided that we only support 8.6 upwards we are 
  34 // checking for these minimum requirements in the startup code of 
  35 // the application so all wxWindows code can safely assume that appearance 1.1 
  36 // windows manager, control manager, navigation services etc. are 
  39 static bool    sUMAHasAppearance 
= false ; 
  40 static long sUMAAppearanceVersion 
= 0 ; 
  41 static long sUMASystemVersion 
= 0 ; 
  42 static bool sUMAHasAquaLayout 
= false ; 
  43 static bool sUMASystemInitialized 
= false ; 
  45 extern int gAGABackgroundColor 
; 
  46 bool UMAHasAppearance() { return sUMAHasAppearance 
; } 
  47 long UMAGetAppearanceVersion() { return sUMAAppearanceVersion 
; } 
  48 long UMAGetSystemVersion() { return sUMASystemVersion 
; } 
  50 static bool    sUMAHasWindowManager 
= false ; 
  51 static long sUMAWindowManagerAttr 
= 0 ; 
  53 bool UMAHasWindowManager() { return sUMAHasWindowManager 
; } 
  54 long UMAGetWindowManagerAttr() { return sUMAWindowManagerAttr 
; } 
  55 bool UMAHasAquaLayout() { return sUMAHasAquaLayout 
; } 
  56 bool UMASystemIsInitialized() { return sUMASystemInitialized 
; } 
  58 void UMACleanupToolbox() 
  60     if ( sUMAHasAppearance 
) 
  62         UnregisterAppearanceClient() ; 
  64     if ( NavServicesAvailable() ) 
  68   if ( TXNTerminateTextension 
!= (void*) kUnresolvedCFragSymbolAddress 
) 
  69       TXNTerminateTextension( ) ; 
  71 void UMAInitToolbox( UInt16 inMoreMastersCalls 
) 
  75     for (long i 
= 1; i 
<= inMoreMastersCalls
; i
++) 
  78     ::InitGraf(&qd
.thePort
); 
  83     ::FlushEvents(everyEvent
, 0); 
  86     PurgeSpace(&total
, &contig
); 
  91     if ( Gestalt(gestaltSystemVersion
, &sUMASystemVersion
) != noErr
) 
  92         sUMASystemVersion 
= 0x0000 ; 
  95     if ( Gestalt( gestaltAppearanceAttr
, &theAppearance 
) == noErr 
) 
  97         sUMAHasAppearance 
= true ; 
  98         RegisterAppearanceClient(); 
  99         if ( Gestalt( gestaltAppearanceVersion
, &theAppearance 
) == noErr 
) 
 101             sUMAAppearanceVersion 
= theAppearance 
; 
 105             sUMAAppearanceVersion 
= 0x0100 ; 
 108     if ( Gestalt( gestaltWindowMgrAttr
, &sUMAWindowManagerAttr 
) == noErr 
) 
 110         sUMAHasWindowManager 
= sUMAWindowManagerAttr 
& gestaltWindowMgrPresent 
; 
 114 // Call currently implicitely done :        InitFloatingWindows() ; 
 116     if ( sUMAHasWindowManager 
) 
 117         InitFloatingWindows() ; 
 122     if ( NavServicesAvailable() ) 
 128   Gestalt( gestaltMenuMgrAttr 
, &menuMgrAttr 
) ; 
 129   if ( menuMgrAttr 
& gestaltMenuMgrAquaLayoutMask 
) 
 130     sUMAHasAquaLayout 
= true ; 
 132   if ( TXNInitTextension 
!= (void*) kUnresolvedCFragSymbolAddress 
) 
 134     FontFamilyID fontId 
; 
 138     GetThemeFont(kThemeSmallSystemFont 
, GetApplicationScript() , fontName 
, &fontSize 
, &fontStyle 
) ; 
 139     GetFNum( fontName
, &fontId 
); 
 141     TXNMacOSPreferredFontDescription fontDescriptions
[] = 
 143         { fontId 
, (fontSize 
<< 16) ,kTXNDefaultFontStyle
, kTXNSystemDefaultEncoding 
} , 
 145     int noOfFontDescriptions 
= sizeof( fontDescriptions 
) / sizeof(TXNMacOSPreferredFontDescription
) ; 
 146 #if 0 // TARGET_CARBON 
 147     --noOfFontDescriptions 
; 
 149       // kTXNAlwaysUseQuickDrawTextMask might be desirable because of speed increases but it crashes the app under OS X upon key stroke 
 150       OptionBits options 
= kTXNWantMoviesMask 
| kTXNWantSoundMask 
| kTXNWantGraphicsMask 
; 
 152     if ( !UMAHasAquaLayout() ) 
 155         options 
|= kTXNAlwaysUseQuickDrawTextMask 
; 
 157       TXNInitTextension(fontDescriptions
,  noOfFontDescriptions
, options 
); 
 161   sUMASystemInitialized 
= true ; 
 166 Boolean CanUseATSUI() 
 169     OSErr err = Gestalt(gestaltATSUVersion, &result); 
 170     return (err == noErr); 
 174 long UMAGetProcessMode() 
 177     ProcessInfoRec processinfo
; 
 178     ProcessSerialNumber procno 
; 
 180     procno
.highLongOfPSN 
= NULL 
; 
 181     procno
.lowLongOfPSN 
= kCurrentProcess 
; 
 182     processinfo
.processInfoLength 
= sizeof(ProcessInfoRec
); 
 183     processinfo
.processName 
= NULL
; 
 184     processinfo
.processAppSpec 
= NULL
; 
 186     err 
= ::GetProcessInformation( &procno 
, &processinfo 
) ; 
 187     wxASSERT( err 
== noErr 
) ; 
 188     return processinfo
.processMode 
; 
 191 bool UMAGetProcessModeDoesActivateOnFGSwitch() 
 193     return UMAGetProcessMode() & modeDoesActivateOnFGSwitch 
; 
 198 MenuRef 
UMANewMenu( SInt16 id 
, const wxString
& title 
) 
 200     wxString str 
= wxStripMenuCodes( title 
) ; 
 203     CreateNewMenu( id 
, 0 , &menu 
) ; 
 204     SetMenuTitleWithCFString( menu 
, wxMacCFStringHolder(str
) ) ; 
 207     wxMacStringToPascal( str 
, ptitle 
) ; 
 208     menu 
= ::NewMenu( id 
, ptitle 
) ; 
 213 void UMASetMenuTitle( MenuRef menu 
, const wxString
& title 
) 
 215     wxString str 
= wxStripMenuCodes( title 
) ; 
 217     SetMenuTitleWithCFString( menu 
, wxMacCFStringHolder(str
) ) ; 
 220     wxMacStringToPascal( str 
, ptitle 
) ; 
 221     SetMenuTitle( menu 
, ptitle 
) ; 
 225 void UMASetMenuItemText(  MenuRef menu
,  MenuItemIndex item
, const wxString
& title 
) 
 227     wxString str 
= wxStripMenuCodes( title 
) ; 
 229     SetMenuItemTextWithCFString( menu 
, item 
, wxMacCFStringHolder(str
) ) ; 
 232     wxMacStringToPascal( str 
, ptitle 
) ; 
 233     SetMenuItemText( menu 
, item 
, ptitle 
) ; 
 238 UInt32 
UMAMenuEvent( EventRecord 
*inEvent 
) 
 240         return MenuEvent( inEvent 
) ; 
 243 void UMAEnableMenuItem( MenuRef inMenu 
, MenuItemIndex inItem 
, bool enable
) 
 246         EnableMenuItem( inMenu 
, inItem 
) ; 
 248         DisableMenuItem( inMenu 
, inItem 
) ; 
 251 void UMAAppendSubMenuItem( MenuRef menu 
, const wxString
& title 
, SInt16 id 
) 
 253     MacAppendMenu(menu
, "\pA"); 
 254     UMASetMenuItemText(menu
, (SInt16
) ::CountMenuItems(menu
), title 
); 
 255     SetMenuItemHierarchicalID( menu 
, CountMenuItems( menu 
) , id 
) ; 
 258 void UMAInsertSubMenuItem( MenuRef menu 
, const wxString
& title 
, MenuItemIndex item 
, SInt16 id  
) 
 260     MacInsertMenuItem(menu
, "\pA" , item
); 
 261     UMASetMenuItemText(menu
, item 
, title 
); 
 262     SetMenuItemHierarchicalID( menu 
, item 
, id 
) ; 
 265 void UMASetMenuItemShortcut( MenuRef menu 
, MenuItemIndex item 
, wxAcceleratorEntry 
*entry 
) 
 270     UInt8 modifiers 
= 0 ; 
 271     SInt16 key 
= entry
->GetKeyCode() ; 
 274         bool explicitCommandKey 
= false ; 
 276         if ( entry
->GetFlags() & wxACCEL_CTRL 
) 
 278             explicitCommandKey 
= true ; 
 281         if (entry
->GetFlags() & wxACCEL_ALT 
) 
 283             modifiers 
|= kMenuOptionModifier 
; 
 286         if (entry
->GetFlags() & wxACCEL_SHIFT
) 
 288             modifiers 
|= kMenuShiftModifier 
; 
 292         SInt16 macKey 
= key 
; 
 293         if ( key 
>= WXK_F1 
&& key 
<= WXK_F15 
) 
 295             macKey 
= kFunctionKeyCharCode 
; 
 296             glyph 
= kMenuF1Glyph 
+ ( key 
- WXK_F1 
) ; 
 297             if ( key 
>= WXK_F13 
) 
 299             if ( !explicitCommandKey 
) 
 300                 modifiers 
|= kMenuNoCommandModifier 
; 
 305                     macKey 
+= ( 0x7a << 8 ) ; 
 308                     macKey 
+= ( 0x78 << 8 ) ; 
 311                     macKey 
+= ( 0x63 << 8 ) ; 
 314                     macKey 
+= ( 0x76 << 8 ) ; 
 317                     macKey 
+= ( 0x60 << 8 ) ; 
 320                     macKey 
+= ( 0x61 << 8 ) ; 
 323                     macKey 
+= ( 0x62 << 8 ) ; 
 326                     macKey 
+= ( 0x64 << 8 ) ; 
 329                     macKey 
+= ( 0x65 << 8 ) ; 
 332                     macKey 
+= ( 0x6D << 8 ) ; 
 335                     macKey 
+= ( 0x67 << 8 ) ; 
 338                     macKey 
+= ( 0x6F << 8 ) ; 
 341                     macKey 
+= ( 0x69 << 8 ) ; 
 344                     macKey 
+= ( 0x6B << 8 ) ; 
 347                     macKey 
+= ( 0x71 << 8 ) ; 
 352             // unfortunately this does not yet trigger the right key , 
 353             // for some reason mac justs picks the first function key menu 
 354             // defined, so we turn this off 
 363                     macKey 
= kBackspaceCharCode 
; 
 364                     glyph 
= kMenuDeleteLeftGlyph 
; 
 367                     macKey 
= kTabCharCode 
; 
 368                     glyph 
= kMenuTabRightGlyph 
; 
 370                 case kEnterCharCode 
: 
 371                     macKey 
= kEnterCharCode 
; 
 372                     glyph 
= kMenuEnterGlyph 
; 
 375                     macKey 
= kReturnCharCode 
; 
 376                     glyph 
= kMenuReturnGlyph 
; 
 379                     macKey 
= kEscapeCharCode 
; 
 380                     glyph 
= kMenuEscapeGlyph 
; 
 384                     glyph 
= kMenuSpaceGlyph 
; 
 387                     macKey 
= kDeleteCharCode 
; 
 388                     glyph 
= kMenuDeleteRightGlyph 
; 
 391                     macKey 
= kClearCharCode 
; 
 392                     glyph 
= kMenuClearGlyph 
; 
 394                 case WXK_PRIOR 
: // PAGE UP 
 395                     macKey 
= kPageUpCharCode 
; 
 396                     glyph 
= kMenuPageUpGlyph 
; 
 399                     macKey 
= kPageDownCharCode 
; 
 400                     glyph 
= kMenuPageDownGlyph 
; 
 403                     macKey 
= kLeftArrowCharCode 
; 
 404                     glyph 
= kMenuLeftArrowGlyph 
; 
 407                     macKey 
= kUpArrowCharCode 
; 
 408                     glyph 
= kMenuUpArrowGlyph 
; 
 411                     macKey 
= kRightArrowCharCode 
; 
 412                     glyph 
= kMenuRightArrowGlyph 
; 
 415                     macKey 
= kDownArrowCharCode 
; 
 416                     glyph 
= kMenuDownArrowGlyph 
; 
 421         SetItemCmd( menu
, item 
, macKey 
); 
 422         SetMenuItemModifiers(menu
, item 
, modifiers 
) ; 
 425             SetMenuItemKeyGlyph(menu
, item 
, glyph 
) ; 
 429 void UMAAppendMenuItem( MenuRef menu 
, const wxString
& title 
, wxAcceleratorEntry 
*entry 
) 
 431     MacAppendMenu(menu
, "\pA"); 
 432     UMASetMenuItemText(menu
, (SInt16
) ::CountMenuItems(menu
), title 
); 
 433     UMASetMenuItemShortcut( menu 
,  (SInt16
) ::CountMenuItems(menu
), entry 
) ; 
 436 void UMAInsertMenuItem( MenuRef menu 
, const wxString
& title 
, MenuItemIndex item 
, wxAcceleratorEntry 
*entry 
) 
 438     MacInsertMenuItem( menu 
, "\pA" , item
) ; 
 439     UMASetMenuItemText(menu
, item
+1 , title 
); 
 440     UMASetMenuItemShortcut( menu 
, item
+1 , entry 
) ; 
 447 int gPrOpenCounter 
= 0 ; 
 453     if ( gPrOpenCounter 
== 1 ) 
 457         wxASSERT( err 
== noErr 
) ; 
 462 OSStatus 
UMAPrClose() 
 465     wxASSERT( gPrOpenCounter 
>= 1 ) ; 
 466     if ( gPrOpenCounter 
== 1 ) 
 470         wxASSERT( err 
== noErr 
) ; 
 476 pascal QDGlobalsPtr 
GetQDGlobalsPtr (void) ; 
 477 pascal QDGlobalsPtr 
GetQDGlobalsPtr (void) 
 479     return QDGlobalsPtr (* (Ptr
*) LMGetCurrentA5 ( ) - 0xCA); 
 484 void UMAShowWatchCursor() 
 488     CursHandle watchFob 
= GetCursor (watchCursor
); 
 495 //        Cursor preservedArrow; 
 496 //        GetQDGlobalsArrow (&preservedArrow); 
 497 //        SetQDGlobalsArrow (*watchFob); 
 499 //        SetQDGlobalsArrow (&preservedArrow); 
 500         SetCursor (*watchFob
); 
 502         SetCursor (*watchFob
); 
 507 void            UMAShowArrowCursor() 
 511     SetCursor (GetQDGlobalsArrow (&arrow
)); 
 513     SetCursor (&(qd
.arrow
)); 
 519 GrafPtr        
UMAGetWindowPort( WindowRef inWindowRef 
) 
 521     wxASSERT( inWindowRef 
!= NULL 
) ; 
 523     return (GrafPtr
) GetWindowPort( inWindowRef 
) ; 
 525     return (GrafPtr
) inWindowRef 
; 
 529 void             UMADisposeWindow( WindowRef inWindowRef 
) 
 531     wxASSERT( inWindowRef 
!= NULL 
) ; 
 532     DisposeWindow( inWindowRef 
) ; 
 535 void UMASetWTitle( WindowRef inWindowRef 
, const wxString
& title 
) 
 538     SetWindowTitleWithCFString( inWindowRef 
, wxMacCFStringHolder(title
) ) ; 
 541     wxMacStringToPascal( title 
, ptitle 
) ; 
 542     SetWTitle( inWindowRef 
, ptitle 
) ; 
 546 void             UMAGetWTitleC( WindowRef inWindowRef 
, char *title 
) 
 548     GetWTitle( inWindowRef 
, (unsigned char*)title 
) ; 
 550     p2cstrcpy( title
, (unsigned char *)title 
) ; 
 552     p2cstr( (unsigned char*)title 
) ; 
 556 // appearance additions 
 558 void UMASetControlTitle( ControlHandle inControl 
, const wxString
& title 
) 
 561     SetControlTitleWithCFString( inControl 
, wxMacCFStringHolder(title
) ) ; 
 564     wxMacStringToPascal( title 
, ptitle 
) ; 
 565     SetControlTitle( inControl 
, ptitle 
) ; 
 569 void UMAActivateControl( ControlHandle inControl 
) 
 571     // we have to add the control after again to the update rgn 
 572     // otherwise updates get lost 
 573     if ( !IsControlActive( inControl 
) ) 
 575         bool visible 
= IsControlVisible( inControl 
) ; 
 577             SetControlVisibility( inControl 
, false , false ) ; 
 578         ::ActivateControl( inControl 
) ; 
 580             SetControlVisibility( inControl 
, true , false ) ; 
 582             InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 587 void UMADrawControl( ControlHandle inControl 
) 
 589     WindowRef theWindow 
= GetControlOwner(inControl
) ; 
 590     RgnHandle updateRgn 
= NewRgn() ; 
 591     GetWindowUpdateRgn( theWindow 
, updateRgn 
) ; 
 592     Point zero 
= { 0 , 0 } ; 
 593     LocalToGlobal( &zero 
) ; 
 594     OffsetRgn( updateRgn 
, -zero
.h 
, -zero
.v 
) ; 
 595     ::DrawControlInCurrentPort( inControl 
) ; 
 596     InvalWindowRgn( theWindow
, updateRgn
) ; 
 597     DisposeRgn( updateRgn 
) ; 
 600 void UMAMoveControl( ControlHandle inControl 
, short x 
, short y 
) 
 602     bool visible 
= IsControlVisible( inControl 
) ; 
 604         SetControlVisibility( inControl 
, false , false ) ; 
 606         InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 608     ::MoveControl( inControl 
, x 
, y 
) ; 
 610         SetControlVisibility( inControl 
, true , false ) ; 
 612         InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 616 void UMASizeControl( ControlHandle inControl 
, short x 
, short y 
) 
 618     bool visible 
= IsControlVisible( inControl 
) ; 
 620         SetControlVisibility( inControl 
, false , false ) ; 
 622         InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 624     ::SizeControl( inControl 
, x 
, y 
) ; 
 626         SetControlVisibility( inControl 
, true , false ) ; 
 628         InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 632 void UMADeactivateControl( ControlHandle inControl 
) 
 634     // we have to add the control after again to the update rgn 
 635     // otherwise updates get lost 
 636     bool visible 
= IsControlVisible( inControl 
) ; 
 638         SetControlVisibility( inControl 
, false , false ) ; 
 639     ::DeactivateControl( inControl 
) ; 
 641         SetControlVisibility( inControl 
, true , false ) ; 
 643         InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 646 // shows the control and adds the region to the update region 
 647 void UMAShowControl                        (ControlHandle             inControl
) 
 649     SetControlVisibility( inControl 
, true , false ) ; 
 651     InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 654 // shows the control and adds the region to the update region 
 655 void UMAHideControl                        (ControlHandle             inControl
) 
 657     SetControlVisibility( inControl 
, false , false ) ; 
 659     InvalWindowRect(GetControlOwner(inControl
),GetControlBounds(inControl
,&ctrlBounds
) ) ; 
 662 OSErr 
UMASetKeyboardFocus                (WindowPtr                 inWindow
, 
 663                                  ControlHandle             inControl
, 
 664                                  ControlFocusPart         inPart
) 
 670     SetPortWindowPort( inWindow 
) ; 
 672     err 
= SetKeyboardFocus( inWindow 
, inControl 
, inPart 
) ; 
 679 void UMAUpdateControls( WindowPtr inWindow 
, RgnHandle inRgn 
) 
 681     RgnHandle updateRgn 
= NewRgn() ; 
 682     GetWindowUpdateRgn( inWindow 
, updateRgn 
) ; 
 684     Point zero 
= { 0 , 0 } ; 
 685     LocalToGlobal( &zero 
) ; 
 686     OffsetRgn( updateRgn 
, -zero
.h 
, -zero
.v 
) ; 
 688     UpdateControls( inWindow 
, inRgn 
) ; 
 689     InvalWindowRgn( inWindow
, updateRgn
) ; 
 690     DisposeRgn( updateRgn 
) ; 
 693 bool UMAIsWindowFloating( WindowRef inWindow 
) 
 697     GetWindowClass( inWindow 
, &cl 
) ; 
 698     return cl 
== kFloatingWindowClass 
; 
 701 bool UMAIsWindowModal( WindowRef inWindow 
) 
 705     GetWindowClass( inWindow 
, &cl 
) ; 
 706     return cl 
< kFloatingWindowClass 
; 
 711 void UMAHighlightAndActivateWindow( WindowRef inWindowRef 
, bool inActivate 
) 
 715 //        bool isHighlighted = IsWindowHighlited( inWindowRef ) ; 
 716 //        if ( inActivate != isHightlited ) 
 719         SetPortWindowPort( inWindowRef 
) ; 
 720         HiliteWindow( inWindowRef 
, inActivate 
) ; 
 721         ControlHandle control 
= NULL 
; 
 722         ::GetRootControl( inWindowRef 
, & control 
) ; 
 726                 UMAActivateControl( control 
) ; 
 728                 UMADeactivateControl( control 
) ; 
 734 OSStatus 
UMADrawThemePlacard( const Rect 
*inRect 
, ThemeDrawState inState 
) 
 736     return ::DrawThemePlacard( inRect 
, inState 
) ; 
 740 static OSStatus helpMenuStatus 
= noErr 
; 
 741 static MenuItemIndex firstCustomItemIndex 
= 0 ; 
 744 OSStatus 
UMAGetHelpMenu( 
 745   MenuRef 
*        outHelpMenu
, 
 746   MenuItemIndex 
*  outFirstCustomItemIndex
) 
 749     return HMGetHelpMenu( outHelpMenu 
, outFirstCustomItemIndex 
) ; 
 751     MenuRef helpMenuHandle 
; 
 752     helpMenuStatus 
= HMGetHelpMenuHandle( &helpMenuHandle 
) ; 
 753     if ( firstCustomItemIndex 
== 0 && helpMenuStatus 
== noErr 
) 
 755         firstCustomItemIndex 
= CountMenuItems( helpMenuHandle 
) + 1 ; 
 757     if ( outFirstCustomItemIndex 
) 
 759         *outFirstCustomItemIndex 
= firstCustomItemIndex 
; 
 761     *outHelpMenu 
= helpMenuHandle 
; 
 762     return helpMenuStatus 
; 
 766 wxMacPortStateHelper::wxMacPortStateHelper( GrafPtr newport
) 
 772 wxMacPortStateHelper::wxMacPortStateHelper() 
 777 void wxMacPortStateHelper::Setup( GrafPtr newport 
) 
 779     GetPort( &m_oldPort 
) ; 
 781     wxASSERT_MSG( m_clip 
== NULL 
, wxT("Cannot call setup twice") ) ; 
 784     m_textFont 
= GetPortTextFont( (CGrafPtr
) newport
); 
 785     m_textSize 
= GetPortTextSize( (CGrafPtr
) newport
); 
 786     m_textStyle 
= GetPortTextFace( (CGrafPtr
) newport
); 
 787     m_textMode 
= GetPortTextMode( (CGrafPtr
) newport
); 
 788     GetThemeDrawingState( &m_drawingState 
) ; 
 789     m_currentPort 
= newport 
; 
 791 void wxMacPortStateHelper::Clear() 
 795         DisposeRgn( m_clip 
) ; 
 796         DisposeThemeDrawingState( m_drawingState 
) ; 
 801 wxMacPortStateHelper::~wxMacPortStateHelper() 
 805         SetPort( m_currentPort 
) ; 
 807         DisposeRgn( m_clip 
) ; 
 808         TextFont( m_textFont 
); 
 809         TextSize( m_textSize 
); 
 810         TextFace( m_textStyle 
); 
 811         TextMode( m_textMode 
); 
 812         SetThemeDrawingState( m_drawingState 
, true ) ; 
 813         SetPort( m_oldPort 
) ; 
 817 OSStatus 
UMAPutScrap( Size size 
, OSType type 
, void *data 
) 
 819     OSStatus err 
= noErr 
; 
 821     err 
= PutScrap( size 
, type 
, data 
) ; 
 824     err 
= GetCurrentScrap (&scrap
); 
 827         err 
= PutScrapFlavor (scrap
, type 
, 0, size
, data
);