1///////////////////////////////////////////////////////////////////////////// 2// Name: src/mac/classic/uma.cpp 3// Purpose: UMA support 4// Author: Stefan Csomor 5// Modified by: 6// Created: 04/01/98 7// RCS-ID: $Id: uma.cpp 38790 2006-04-18 09:05:00Z ABX $ 8// Copyright: (c) Stefan Csomor 9// Licence: The wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12#include "wx/wxprec.h" 13 14#ifdef __BORLANDC__ 15 #pragma hdrstop 16#endif 17 18#if wxUSE_GUI 19 20#include "wx/dc.h" 21#include <MacTextEditor.h> 22 23#ifndef __DARWIN__ 24# include <Navigation.h> 25# if defined(TARGET_CARBON) 26# if PM_USE_SESSION_APIS 27# include <PMCore.h> 28# endif 29# include <PMApplication.h> 30# else 31# include <Printing.h> 32# endif 33#endif 34 35#ifndef __DARWIN__ 36#include <Scrap.h> 37#endif 38#include "wx/mac/uma.h" 39 40 41// since we have decided that we only support 8.6 upwards we are 42// checking for these minimum requirements in the startup code of 43// the application so all wxWidgets code can safely assume that appearance 1.1 44// windows manager, control manager, navigation services etc. are 45// present 46 47static bool sUMAHasAppearance = false ; 48static long sUMAAppearanceVersion = 0 ; 49static long sUMASystemVersion = 0 ; 50static bool sUMAHasAquaLayout = false ; 51 52static bool sUMAHasInittedAppearance = false; 53 54extern int gAGABackgroundColor ; 55bool UMAHasAppearance() { return sUMAHasAppearance ; } 56long UMAGetAppearanceVersion() { return sUMAAppearanceVersion ; } 57long UMAGetSystemVersion() { return sUMASystemVersion ; } 58 59static bool sUMAHasWindowManager = false ; 60static long sUMAWindowManagerAttr = 0 ; 61 62bool UMAHasWindowManager() { return sUMAHasWindowManager ; } 63long UMAGetWindowManagerAttr() { return sUMAWindowManagerAttr ; } 64bool UMAHasAquaLayout() { return sUMAHasAquaLayout ; } 65 66 67void UMACleanupToolbox() 68{ 69 if (sUMAHasInittedAppearance) 70 { 71 UnregisterAppearanceClient() ; 72 } 73 if ( NavServicesAvailable() ) 74 { 75 NavUnload() ; 76 } 77 if ( TXNTerminateTextension != (void*) kUnresolvedCFragSymbolAddress ) 78 TXNTerminateTextension( ) ; 79} 80void UMAInitToolbox( UInt16 inMoreMastersCalls, bool isEmbedded ) 81{ 82#if !TARGET_CARBON 83 ::MaxApplZone(); 84 for (long i = 1; i <= inMoreMastersCalls; i++) 85 ::MoreMasters(); 86 87 if (!isEmbedded) 88 { 89 ::InitGraf(&qd.thePort); 90 ::InitFonts(); 91 ::InitMenus(); 92 ::TEInit(); 93 ::InitDialogs(0L); 94 ::FlushEvents(everyEvent, 0); 95 } 96 97 long total,contig; 98 PurgeSpace(&total, &contig); 99#endif 100 101 ::InitCursor(); 102 103 if ( Gestalt(gestaltSystemVersion, &sUMASystemVersion) != noErr) 104 sUMASystemVersion = 0x0000 ; 105 106 long theAppearance ; 107 if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr ) 108 { 109 sUMAHasAppearance = true ; 110 OSStatus status = RegisterAppearanceClient(); 111 // If status equals appearanceProcessRegisteredErr it means the 112 // appearance client already was registered (For example if we run 113 // embedded, the host might have registered it). In such a case 114 // we don't unregister it later on. 115 if (status != appearanceProcessRegisteredErr) 116 { 117 // Appearance client wasn't registered yet. 118 sUMAHasInittedAppearance = true; 119 } 120 121 if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr ) 122 { 123 sUMAAppearanceVersion = theAppearance ; 124 } 125 else 126 { 127 sUMAAppearanceVersion = 0x0100 ; 128 } 129 } 130 if ( Gestalt( gestaltWindowMgrAttr, &sUMAWindowManagerAttr ) == noErr ) 131 { 132 sUMAHasWindowManager = sUMAWindowManagerAttr & gestaltWindowMgrPresent ; 133 } 134 135#if TARGET_CARBON 136// Call currently implicitely done : InitFloatingWindows() ; 137#else 138 if (!isEmbedded) 139 { 140 if ( sUMAHasWindowManager ) 141 InitFloatingWindows() ; 142 else 143 InitWindows(); 144 } 145#endif 146 147 if ( NavServicesAvailable() ) 148 { 149 NavLoad() ; 150 } 151 152 long menuMgrAttr ; 153 Gestalt( gestaltMenuMgrAttr , &menuMgrAttr ) ; 154 if ( menuMgrAttr & gestaltMenuMgrAquaLayoutMask ) 155 sUMAHasAquaLayout = true ; 156 157 if ( TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress ) 158 { 159 FontFamilyID fontId ; 160 Str255 fontName ; 161 SInt16 fontSize ; 162 Style fontStyle ; 163 GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; 164 GetFNum( fontName, &fontId ); 165 166 TXNMacOSPreferredFontDescription fontDescriptions[] = 167 { 168 { fontId , (fontSize << 16) ,kTXNDefaultFontStyle, kTXNSystemDefaultEncoding } 169 } ; 170 int noOfFontDescriptions = sizeof( fontDescriptions ) / sizeof(TXNMacOSPreferredFontDescription) ; 171 172 // kTXNAlwaysUseQuickDrawTextMask might be desirable because of speed increases but it crashes the app under OS X upon key stroke 173#if 0 174 // leads to unexpected content for clients, TODO configurable 175 OptionBits options = kTXNWantMoviesMask | kTXNWantSoundMask | kTXNWantGraphicsMask ; 176#else 177 OptionBits options = 0 ; 178#endif 179 180#if TARGET_CARBON 181 if ( !UMAHasAquaLayout() ) 182#endif 183 { 184 options |= kTXNAlwaysUseQuickDrawTextMask ; 185 } 186 TXNInitTextension(fontDescriptions, noOfFontDescriptions, options ); 187 } 188 189 190 UMASetSystemIsInitialized(true); 191 192} 193 194/* 195Boolean CanUseATSUI() 196 { 197 long result; 198 OSErr err = Gestalt(gestaltATSUVersion, &result); 199 return (err == noErr); 200 } 201*/ 202// process manager 203long UMAGetProcessMode() 204{ 205 OSErr err ; 206 ProcessInfoRec processinfo; 207 ProcessSerialNumber procno ; 208 209 procno.highLongOfPSN = NULL ; 210 procno.lowLongOfPSN = kCurrentProcess ; 211 processinfo.processInfoLength = sizeof(ProcessInfoRec); 212 processinfo.processName = NULL; 213 processinfo.processAppSpec = NULL; 214 215 err = ::GetProcessInformation( &procno , &processinfo ) ; 216 wxASSERT( err == noErr ) ; 217 return processinfo.processMode ; 218} 219 220bool UMAGetProcessModeDoesActivateOnFGSwitch() 221{ 222 return UMAGetProcessMode() & modeDoesActivateOnFGSwitch ; 223} 224 225// menu manager 226 227MenuRef UMANewMenu( SInt16 id , const wxString& title , wxFontEncoding encoding ) 228{ 229 wxString str = wxStripMenuCodes( title ) ; 230 MenuRef menu ; 231#if TARGET_CARBON 232 CreateNewMenu( id , 0 , &menu ) ; 233 SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding ) ) ; 234#else 235 Str255 ptitle ; 236 wxMacStringToPascal( str , ptitle ) ; 237 menu = ::NewMenu( id , ptitle ) ; 238#endif 239 return menu ; 240} 241 242void UMASetMenuTitle( MenuRef menu , const wxString& title , wxFontEncoding encoding) 243{ 244 wxString str = wxStripMenuCodes( title ) ; 245#if TARGET_CARBON 246 SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding) ) ; 247#else 248 Str255 ptitle ; 249 wxMacStringToPascal( str , ptitle ) ; 250 SetMenuTitle( menu , ptitle ) ; 251#endif 252} 253 254void UMASetMenuItemText( MenuRef menu, MenuItemIndex item, const wxString& title , wxFontEncoding encoding) 255{ 256 wxString str = wxStripMenuCodes( title ) ; 257#if TARGET_CARBON 258 SetMenuItemTextWithCFString( menu , item , wxMacCFStringHolder(str , encoding) ) ; 259#else 260 Str255 ptitle ; 261 wxMacStringToPascal( str , ptitle ) ; 262 SetMenuItemText( menu , item , ptitle ) ; 263#endif 264} 265 266 267UInt32 UMAMenuEvent( EventRecord *inEvent ) 268{ 269 return MenuEvent( inEvent ) ; 270} 271 272void UMAEnableMenuItem( MenuRef inMenu , MenuItemIndex inItem , bool enable) 273{ 274 if ( enable ) 275 EnableMenuItem( inMenu , inItem ) ; 276 else 277 DisableMenuItem( inMenu , inItem ) ; 278} 279 280void UMAAppendSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , SInt16 id ) 281{ 282 MacAppendMenu(menu, "\pA"); 283 UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding ); 284 SetMenuItemHierarchicalID( menu , CountMenuItems( menu ) , id ) ; 285} 286 287void UMAInsertSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , SInt16 id ) 288{ 289 MacInsertMenuItem(menu, "\pA" , item); 290 UMASetMenuItemText(menu, item , title , encoding); 291 SetMenuItemHierarchicalID( menu , item , id ) ; 292} 293 294void UMASetMenuItemShortcut( MenuRef menu , MenuItemIndex item , wxAcceleratorEntry *entry ) 295{ 296 if ( !entry ) 297 return ; 298 299 UInt8 modifiers = 0 ; 300 SInt16 key = entry->GetKeyCode() ; 301 if ( key ) 302 { 303 bool explicitCommandKey = false ; 304 305 if ( entry->GetFlags() & wxACCEL_CTRL ) 306 { 307 explicitCommandKey = true ; 308 } 309 310 if (entry->GetFlags() & wxACCEL_ALT ) 311 { 312 modifiers |= kMenuOptionModifier ; 313 } 314 315 if (entry->GetFlags() & wxACCEL_SHIFT) 316 { 317 modifiers |= kMenuShiftModifier ; 318 } 319 320 SInt16 glyph = 0 ; 321 SInt16 macKey = key ; 322 if ( key >= WXK_F1 && key <= WXK_F15 ) 323 { 324 // for some reasons this must be 0 right now 325 // everything else leads to just the first function key item 326 // to be selected. Thanks to Ryan Wilcox for finding out. 327 macKey = 0 ; 328 glyph = kMenuF1Glyph + ( key - WXK_F1 ) ; 329 if ( key >= WXK_F13 ) 330 glyph += 13 ; 331 if ( !explicitCommandKey ) 332 modifiers |= kMenuNoCommandModifier ; 333 } 334 else 335 { 336 switch( key ) 337 { 338 case WXK_BACK : 339 macKey = kBackspaceCharCode ; 340 glyph = kMenuDeleteLeftGlyph ; 341 break ; 342 case WXK_TAB : 343 macKey = kTabCharCode ; 344 glyph = kMenuTabRightGlyph ; 345 break ; 346 case kEnterCharCode : 347 macKey = kEnterCharCode ; 348 glyph = kMenuEnterGlyph ; 349 break ; 350 case WXK_RETURN : 351 macKey = kReturnCharCode ; 352 glyph = kMenuReturnGlyph ; 353 break ; 354 case WXK_ESCAPE : 355 macKey = kEscapeCharCode ; 356 glyph = kMenuEscapeGlyph ; 357 break ; 358 case WXK_SPACE : 359 macKey = ' ' ; 360 glyph = kMenuSpaceGlyph ; 361 break ; 362 case WXK_DELETE : 363 macKey = kDeleteCharCode ; 364 glyph = kMenuDeleteRightGlyph ; 365 break ; 366 case WXK_CLEAR : 367 macKey = kClearCharCode ; 368 glyph = kMenuClearGlyph ; 369 break ; 370 case WXK_PAGEUP : 371 macKey = kPageUpCharCode ; 372 glyph = kMenuPageUpGlyph ; 373 break ; 374 case WXK_PAGEDOWN : 375 macKey = kPageDownCharCode ; 376 glyph = kMenuPageDownGlyph ; 377 break ; 378 case WXK_LEFT : 379 macKey = kLeftArrowCharCode ; 380 glyph = kMenuLeftArrowGlyph ; 381 break ; 382 case WXK_UP : 383 macKey = kUpArrowCharCode ; 384 glyph = kMenuUpArrowGlyph ; 385 break ; 386 case WXK_RIGHT : 387 macKey = kRightArrowCharCode ; 388 glyph = kMenuRightArrowGlyph ; 389 break ; 390 case WXK_DOWN : 391 macKey = kDownArrowCharCode ; 392 glyph = kMenuDownArrowGlyph ; 393 break ; 394 } 395 } 396 397 SetItemCmd( menu, item , macKey ); 398 SetMenuItemModifiers(menu, item , modifiers ) ; 399 400 if ( glyph ) 401 SetMenuItemKeyGlyph(menu, item , glyph ) ; 402 } 403} 404 405void UMAAppendMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , wxAcceleratorEntry *entry ) 406{ 407 MacAppendMenu(menu, "\pA"); 408 UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding ); 409 UMASetMenuItemShortcut( menu , (SInt16) ::CountMenuItems(menu), entry ) ; 410} 411 412void UMAInsertMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , wxAcceleratorEntry *entry ) 413{ 414 MacInsertMenuItem( menu , "\pA" , item) ; 415 UMASetMenuItemText(menu, item+1 , title , encoding ); 416 UMASetMenuItemShortcut( menu , item+1 , entry ) ; 417} 418 419// quickdraw 420 421#if !TARGET_CARBON 422 423int gPrOpenCounter = 0 ; 424 425OSStatus UMAPrOpen() 426{ 427 OSErr err = noErr ; 428 ++gPrOpenCounter ; 429 if ( gPrOpenCounter == 1 ) 430 { 431 PrOpen() ; 432 err = PrError() ; 433 wxASSERT( err == noErr ) ; 434 } 435 return err ; 436} 437 438OSStatus UMAPrClose() 439{ 440 OSErr err = noErr ; 441 wxASSERT( gPrOpenCounter >= 1 ) ; 442 if ( gPrOpenCounter == 1 ) 443 { 444 PrClose() ; 445 err = PrError() ; 446 wxASSERT( err == noErr ) ; 447 } 448 --gPrOpenCounter ; 449 return err ; 450} 451 452pascal QDGlobalsPtr GetQDGlobalsPtr (void) ; 453pascal QDGlobalsPtr GetQDGlobalsPtr (void) 454{ 455 return QDGlobalsPtr (* (Ptr*) LMGetCurrentA5 ( ) - 0xCA); 456} 457 458#endif 459 460void UMAShowWatchCursor() 461{ 462 OSErr err = noErr; 463 464 CursHandle watchFob = GetCursor (watchCursor); 465 466 if (!watchFob) 467 err = nilHandleErr; 468 else 469 { 470 #if TARGET_CARBON 471// Cursor preservedArrow; 472// GetQDGlobalsArrow (&preservedArrow); 473// SetQDGlobalsArrow (*watchFob); 474// InitCursor ( ); 475// SetQDGlobalsArrow (&preservedArrow); 476 SetCursor (*watchFob); 477 #else 478 SetCursor (*watchFob); 479 #endif 480 } 481} 482 483void UMAShowArrowCursor() 484{ 485#if TARGET_CARBON 486 Cursor arrow; 487 SetCursor (GetQDGlobalsArrow (&arrow)); 488#else 489 SetCursor (&(qd.arrow)); 490#endif 491} 492 493// window manager 494 495GrafPtr UMAGetWindowPort( WindowRef inWindowRef ) 496{ 497 wxASSERT( inWindowRef != NULL ) ; 498#if TARGET_CARBON 499 return (GrafPtr) GetWindowPort( inWindowRef ) ; 500#else 501 return (GrafPtr) inWindowRef ; 502#endif 503} 504 505void UMADisposeWindow( WindowRef inWindowRef ) 506{ 507 wxASSERT( inWindowRef != NULL ) ; 508 DisposeWindow( inWindowRef ) ; 509} 510 511void UMASetWTitle( WindowRef inWindowRef , const wxString& title , wxFontEncoding encoding) 512{ 513#if TARGET_CARBON 514 SetWindowTitleWithCFString( inWindowRef , wxMacCFStringHolder(title , encoding) ) ; 515#else 516 Str255 ptitle ; 517 wxMacStringToPascal( title , ptitle ) ; 518 SetWTitle( inWindowRef , ptitle ) ; 519#endif 520} 521 522// appearance additions 523 524void UMASetControlTitle( ControlHandle inControl , const wxString& title , wxFontEncoding encoding) 525{ 526#if TARGET_CARBON 527 SetControlTitleWithCFString( inControl , wxMacCFStringHolder(title , encoding) ) ; 528#else 529 Str255 ptitle ; 530 wxMacStringToPascal( title , ptitle ) ; 531 SetControlTitle( inControl , ptitle ) ; 532#endif 533} 534 535void UMAActivateControl( ControlHandle inControl ) 536{ 537 // we have to add the control after again to the update rgn 538 // otherwise updates get lost 539 if ( !IsControlActive( inControl ) ) 540 { 541 bool visible = IsControlVisible( inControl ) ; 542 if ( visible ) 543 SetControlVisibility( inControl , false , false ) ; 544 ::ActivateControl( inControl ) ; 545 if ( visible ) { 546 SetControlVisibility( inControl , true , false ) ; 547 Rect ctrlBounds ; 548 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 549 } 550 } 551} 552 553void UMADrawControl( ControlHandle inControl ) 554{ 555 WindowRef theWindow = GetControlOwner(inControl) ; 556 wxMacPortStateHelper help( (GrafPtr) GetWindowPort(theWindow) ) ; 557 RgnHandle updateRgn = NewRgn() ; 558 GetWindowUpdateRgn( theWindow , updateRgn ) ; 559 Point zero = { 0 , 0 } ; 560 LocalToGlobal( &zero ) ; 561 OffsetRgn( updateRgn , -zero.h , -zero.v ) ; 562 ::DrawControlInCurrentPort( inControl ) ; 563 InvalWindowRgn( theWindow, updateRgn) ; 564 DisposeRgn( updateRgn ) ; 565} 566 567void UMAMoveControl( ControlHandle inControl , short x , short y ) 568{ 569 bool visible = IsControlVisible( inControl ) ; 570 if ( visible ) { 571 SetControlVisibility( inControl , false , false ) ; 572 Rect ctrlBounds ; 573 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 574 } 575 ::MoveControl( inControl , x , y ) ; 576 if ( visible ) { 577 SetControlVisibility( inControl , true , false ) ; 578 Rect ctrlBounds ; 579 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 580 } 581} 582 583void UMASizeControl( ControlHandle inControl , short x , short y ) 584{ 585 bool visible = IsControlVisible( inControl ) ; 586 if ( visible ) { 587 SetControlVisibility( inControl , false , false ) ; 588 Rect ctrlBounds ; 589 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 590 } 591 ::SizeControl( inControl , x , y ) ; 592 if ( visible ) { 593 SetControlVisibility( inControl , true , false ) ; 594 Rect ctrlBounds ; 595 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 596 } 597} 598 599void UMADeactivateControl( ControlHandle inControl ) 600{ 601 // we have to add the control after again to the update rgn 602 // otherwise updates get lost 603 bool visible = IsControlVisible( inControl ) ; 604 if ( visible ) 605 SetControlVisibility( inControl , false , false ) ; 606 ::DeactivateControl( inControl ) ; 607 if ( visible ) { 608 SetControlVisibility( inControl , true , false ) ; 609 Rect ctrlBounds ; 610 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 611 } 612} 613// shows the control and adds the region to the update region 614void UMAShowControl (ControlHandle inControl) 615{ 616 SetControlVisibility( inControl , true , false ) ; 617 Rect ctrlBounds ; 618 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 619} 620 621// shows the control and adds the region to the update region 622void UMAHideControl (ControlHandle inControl) 623{ 624 SetControlVisibility( inControl , false , false ) ; 625 Rect ctrlBounds ; 626 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ; 627} 628// keyboard focus 629OSErr UMASetKeyboardFocus (WindowPtr inWindow, 630 ControlHandle inControl, 631 ControlFocusPart inPart) 632{ 633 OSErr err = noErr; 634 GrafPtr port ; 635 GetPort( &port ) ; 636 637 SetPortWindowPort( inWindow ) ; 638 639 err = SetKeyboardFocus( inWindow , inControl , inPart ) ; 640 SetPort( port ) ; 641 return err ; 642} 643 644 645// events 646void UMAUpdateControls( WindowPtr inWindow , RgnHandle inRgn ) 647{ 648 wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) inWindow) ) ; 649 RgnHandle updateRgn = NewRgn() ; 650 GetWindowUpdateRgn( inWindow , updateRgn ) ; 651 652 Point zero = { 0 , 0 } ; 653 LocalToGlobal( &zero ) ; 654 OffsetRgn( updateRgn , -zero.h , -zero.v ) ; 655 656 UpdateControls( inWindow , inRgn ) ; 657 InvalWindowRgn( inWindow, updateRgn) ; 658 DisposeRgn( updateRgn ) ; 659} 660 661bool UMAIsWindowFloating( WindowRef inWindow ) 662{ 663 WindowClass cl ; 664 665 GetWindowClass( inWindow , &cl ) ; 666 return cl == kFloatingWindowClass ; 667} 668 669bool UMAIsWindowModal( WindowRef inWindow ) 670{ 671 WindowClass cl ; 672 673 GetWindowClass( inWindow , &cl ) ; 674 return cl < kFloatingWindowClass ; 675} 676 677// others 678 679void UMAHighlightAndActivateWindow( WindowRef inWindowRef , bool inActivate ) 680{ 681 if ( inWindowRef ) 682 { 683// bool isHighlighted = IsWindowHighlited( inWindowRef ) ; 684// if ( inActivate != isHightlited ) 685 GrafPtr port ; 686 GetPort( &port ) ; 687 SetPortWindowPort( inWindowRef ) ; 688 HiliteWindow( inWindowRef , inActivate ) ; 689 ControlHandle control = NULL ; 690 ::GetRootControl( inWindowRef , & control ) ; 691 if ( control ) 692 { 693 if ( inActivate ) 694 UMAActivateControl( control ) ; 695 else 696 UMADeactivateControl( control ) ; 697 } 698 SetPort( port ) ; 699 } 700} 701 702OSStatus UMADrawThemePlacard( const Rect *inRect , ThemeDrawState inState ) 703{ 704 return ::DrawThemePlacard( inRect , inState ) ; 705} 706 707#if !TARGET_CARBON 708static OSStatus helpMenuStatus = noErr ; 709static MenuItemIndex firstCustomItemIndex = 0 ; 710#endif 711 712OSStatus UMAGetHelpMenu( 713 MenuRef * outHelpMenu, 714 MenuItemIndex * outFirstCustomItemIndex) 715{ 716#if TARGET_CARBON 717 return HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ; 718#else 719 MenuRef helpMenuHandle ; 720 helpMenuStatus = HMGetHelpMenuHandle( &helpMenuHandle ) ; 721 if ( firstCustomItemIndex == 0 && helpMenuStatus == noErr ) 722 { 723 firstCustomItemIndex = CountMenuItems( helpMenuHandle ) + 1 ; 724 } 725 if ( outFirstCustomItemIndex ) 726 { 727 *outFirstCustomItemIndex = firstCustomItemIndex ; 728 } 729 *outHelpMenu = helpMenuHandle ; 730 return helpMenuStatus ; 731#endif 732} 733 734wxMacPortStateHelper::wxMacPortStateHelper( GrafPtr newport) 735{ 736 m_clip = NULL ; 737 Setup( newport ) ; 738} 739 740wxMacPortStateHelper::wxMacPortStateHelper() 741{ 742 m_clip = NULL ; 743} 744 745void wxMacPortStateHelper::Setup( GrafPtr newport ) 746{ 747 GetPort( &m_oldPort ) ; 748 SetPort( newport ) ; 749 SetOrigin(0,0); 750 wxASSERT_MSG( m_clip == NULL , wxT("Cannot call setup twice") ) ; 751 m_clip = NewRgn() ; 752 GetClip( m_clip ); 753 m_textFont = GetPortTextFont( (CGrafPtr) newport); 754 m_textSize = GetPortTextSize( (CGrafPtr) newport); 755 m_textStyle = GetPortTextFace( (CGrafPtr) newport); 756 m_textMode = GetPortTextMode( (CGrafPtr) newport); 757 GetThemeDrawingState( &m_drawingState ) ; 758 m_currentPort = newport ; 759} 760void wxMacPortStateHelper::Clear() 761{ 762 if ( m_clip ) 763 { 764 DisposeRgn( m_clip ) ; 765 DisposeThemeDrawingState( m_drawingState ) ; 766 m_clip = NULL ; 767 } 768} 769 770wxMacPortStateHelper::~wxMacPortStateHelper() 771{ 772 if ( m_clip ) 773 { 774 SetPort( m_currentPort ) ; 775 SetClip( m_clip ) ; 776 DisposeRgn( m_clip ) ; 777 TextFont( m_textFont ); 778 TextSize( m_textSize ); 779 TextFace( m_textStyle ); 780 TextMode( m_textMode ); 781 SetThemeDrawingState( m_drawingState , true ) ; 782 SetPort( m_oldPort ) ; 783 } 784} 785 786OSStatus UMAPutScrap( Size size , OSType type , void *data ) 787{ 788 OSStatus err = noErr ; 789#if !TARGET_CARBON 790 err = PutScrap( size , type , data ) ; 791#else 792 ScrapRef scrap; 793 err = GetCurrentScrap (&scrap); 794 if ( !err ) 795 { 796 err = PutScrapFlavor (scrap, type , 0, size, data); 797 } 798#endif 799 return err ; 800} 801 802#endif // wxUSE_GUI 803 804#if wxUSE_BASE 805 806static bool sUMASystemInitialized = false ; 807 808bool UMASystemIsInitialized() 809{ 810 return sUMASystemInitialized ; 811} 812 813void UMASetSystemIsInitialized(bool val) 814{ 815 sUMASystemInitialized = val; 816} 817 818 819#endif // wxUSE_BASE 820