📄 uma.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/carbon/uma.cpp// Purpose: UMA support// Author: Stefan Csomor// Modified by:// Created: 04/01/98// RCS-ID: $Id: uma.cpp,v 1.80 2006/10/14 15:24:58 SC Exp $// Copyright: (c) Stefan Csomor// Licence: The wxWindows licence/////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#if wxUSE_GUI#include "wx/toplevel.h"#include "wx/dc.h"#ifndef __DARWIN__# include <MacTextEditor.h># include <Navigation.h># if defined(TARGET_CARBON)# if PM_USE_SESSION_APIS# include <PMCore.h># endif# include <PMApplication.h># else# include <Printing.h># endif#endif#ifndef __DARWIN__# include <Scrap.h>#endif#include "wx/mac/uma.h"// since we have decided that we only support 8.6 upwards we are// checking for these minimum requirements in the startup code of// the application so all wxWidgets code can safely assume that appearance 1.1// windows manager, control manager, navigation services etc. are// presentstatic SInt32 sUMASystemVersion = 0 ;long UMAGetSystemVersion() { return sUMASystemVersion ; }void UMACleanupToolbox(){}void UMAInitToolbox( UInt16 inMoreMastersCalls, bool isEmbedded ){ ::InitCursor(); if ( Gestalt(gestaltSystemVersion, &sUMASystemVersion) != noErr) sUMASystemVersion = 0x0000 ;#ifndef __LP64__ { FontFamilyID fontId ; Str255 fontName ; SInt16 fontSize ; Style fontStyle ; GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; GetFNum( fontName, &fontId ); TXNMacOSPreferredFontDescription fontDescriptions[] = { { fontId , (fontSize << 16) , kTXNDefaultFontStyle, kTXNSystemDefaultEncoding } } ; int noOfFontDescriptions = sizeof( fontDescriptions ) / sizeof(TXNMacOSPreferredFontDescription) ; OptionBits options = 0 ; if ( UMAGetSystemVersion() < 0x1000 ) options |= kTXNAlwaysUseQuickDrawTextMask ; TXNInitTextension( fontDescriptions, noOfFontDescriptions, options ); }#endif UMASetSystemIsInitialized( true );}// process managerlong UMAGetProcessMode(){ OSErr err ; ProcessInfoRec processinfo; ProcessSerialNumber procno ; procno.highLongOfPSN = 0 ; procno.lowLongOfPSN = kCurrentProcess ; processinfo.processInfoLength = sizeof(ProcessInfoRec); processinfo.processName = NULL;#ifndef __LP64__ processinfo.processAppSpec = NULL;#endif err = ::GetProcessInformation( &procno , &processinfo ) ; wxASSERT( err == noErr ) ; return processinfo.processMode ;}bool UMAGetProcessModeDoesActivateOnFGSwitch(){ return UMAGetProcessMode() & modeDoesActivateOnFGSwitch ;}// menu managerMenuRef UMANewMenu( SInt16 id , const wxString& title , wxFontEncoding encoding ){ wxString str = wxStripMenuCodes( title ) ; MenuRef menu ;#if TARGET_CARBON CreateNewMenu( id , 0 , &menu ) ; SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding ) ) ;#else Str255 ptitle ; wxMacStringToPascal( str , ptitle ) ; menu = ::NewMenu( id , ptitle ) ;#endif return menu ;}void UMASetMenuTitle( MenuRef menu , const wxString& title , wxFontEncoding encoding ){ wxString str = wxStripMenuCodes( title ) ;#if TARGET_CARBON SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding) ) ;#else Str255 ptitle ; wxMacStringToPascal( str , ptitle ) ; SetMenuTitle( menu , ptitle ) ;#endif}void UMASetMenuItemText( MenuRef menu, MenuItemIndex item, const wxString& title, wxFontEncoding encoding ){ // we don't strip the accels here anymore, must be done before wxString str = title ;#if TARGET_CARBON SetMenuItemTextWithCFString( menu , item , wxMacCFStringHolder(str , encoding) ) ;#else Str255 ptitle ; wxMacStringToPascal( str , ptitle ) ; SetMenuItemText( menu , item , ptitle ) ;#endif}UInt32 UMAMenuEvent( EventRecord *inEvent ){ return MenuEvent( inEvent ) ;}void UMAEnableMenuItem( MenuRef inMenu , MenuItemIndex inItem , bool enable){ if ( enable ) EnableMenuItem( inMenu , inItem ) ; else DisableMenuItem( inMenu , inItem ) ;}void UMAAppendSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , SInt16 id ){ AppendMenuItemTextWithCFString( menu, CFSTR("A"), 0, 0,NULL); UMASetMenuItemText( menu, (SInt16) ::CountMenuItems(menu), title , encoding ); SetMenuItemHierarchicalID( menu , CountMenuItems( menu ) , id ) ;}void UMAInsertSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , SInt16 id ){ InsertMenuItemTextWithCFString( menu, CFSTR("A"), item, 0, 0); UMASetMenuItemText( menu, item+1, title , encoding ); SetMenuItemHierarchicalID( menu , item+1 , id ) ;}void UMASetMenuItemShortcut( MenuRef menu , MenuItemIndex item , wxAcceleratorEntry *entry ){ if ( !entry ) return ; UInt8 modifiers = 0 ; SInt16 key = entry->GetKeyCode() ; if ( key ) { bool explicitCommandKey = (entry->GetFlags() & wxACCEL_CTRL); if (entry->GetFlags() & wxACCEL_ALT) modifiers |= kMenuOptionModifier ; if (entry->GetFlags() & wxACCEL_SHIFT) modifiers |= kMenuShiftModifier ; SInt16 glyph = 0 ; SInt16 macKey = key ; if ( key >= WXK_F1 && key <= WXK_F15 ) { if ( !explicitCommandKey ) modifiers |= kMenuNoCommandModifier ; // for some reasons this must be 0 right now // everything else leads to just the first function key item // to be selected. Thanks to Ryan Wilcox for finding out. macKey = 0 ; glyph = kMenuF1Glyph + ( key - WXK_F1 ) ; if ( key >= WXK_F13 ) glyph += 13 ; } else { switch ( key ) { case WXK_BACK : macKey = kBackspaceCharCode ; glyph = kMenuDeleteLeftGlyph ; break ; case WXK_TAB : macKey = kTabCharCode ; glyph = kMenuTabRightGlyph ; break ; case kEnterCharCode : macKey = kEnterCharCode ; glyph = kMenuEnterGlyph ; break ; case WXK_RETURN : macKey = kReturnCharCode ; glyph = kMenuReturnGlyph ; break ; case WXK_ESCAPE : macKey = kEscapeCharCode ; glyph = kMenuEscapeGlyph ; break ; case WXK_SPACE : macKey = ' ' ; glyph = kMenuSpaceGlyph ; break ; case WXK_DELETE : macKey = kDeleteCharCode ; glyph = kMenuDeleteRightGlyph ; break ; case WXK_CLEAR : macKey = kClearCharCode ; glyph = kMenuClearGlyph ; break ; case WXK_PAGEUP : macKey = kPageUpCharCode ; glyph = kMenuPageUpGlyph ; break ; case WXK_PAGEDOWN : macKey = kPageDownCharCode ; glyph = kMenuPageDownGlyph ; break ; case WXK_LEFT : macKey = kLeftArrowCharCode ; glyph = kMenuLeftArrowGlyph ; break ; case WXK_UP : macKey = kUpArrowCharCode ; glyph = kMenuUpArrowGlyph ; break ; case WXK_RIGHT : macKey = kRightArrowCharCode ; glyph = kMenuRightArrowGlyph ; break ; case WXK_DOWN : macKey = kDownArrowCharCode ; glyph = kMenuDownArrowGlyph ; break ; case WXK_HOME : macKey = kHomeCharCode ; glyph = kMenuNorthwestArrowGlyph ; break ; case WXK_END : macKey = kEndCharCode ; glyph = kMenuSoutheastArrowGlyph ; break ; default : macKey = toupper( key ) ; break ; } // we now allow non command key shortcuts // remove in case this gives problems if ( !explicitCommandKey ) modifiers |= kMenuNoCommandModifier ; } // 1d and 1e have special meaning to SetItemCmd, so // do not use for these character codes. if (key != WXK_UP && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_LEFT) SetItemCmd( menu, item , macKey ); SetMenuItemModifiers( menu, item , modifiers ) ; if ( glyph ) SetMenuItemKeyGlyph( menu, item , glyph ) ; }}void UMAAppendMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , wxAcceleratorEntry *entry ){ AppendMenuItemTextWithCFString( menu, CFSTR("A"), 0, 0,NULL); // don't attempt to interpret metacharacters like a '-' at the beginning (would become a separator otherwise) ChangeMenuItemAttributes( menu , ::CountMenuItems(menu), kMenuItemAttrIgnoreMeta , 0 ) ; UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding ); UMASetMenuItemShortcut( menu , (SInt16) ::CountMenuItems(menu), entry ) ;}void UMAInsertMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , wxAcceleratorEntry *entry ){ InsertMenuItemTextWithCFString( menu, CFSTR("A"), item, 0, 0); // don't attempt to interpret metacharacters like a '-' at the beginning (would become a separator otherwise) ChangeMenuItemAttributes( menu , item+1, kMenuItemAttrIgnoreMeta , 0 ) ; UMASetMenuItemText(menu, item+1 , title , encoding ); UMASetMenuItemShortcut( menu , item+1 , entry ) ;}// quickdraw#if !TARGET_CARBONint gPrOpenCounter = 0 ;OSStatus UMAPrOpen(){ OSErr err = noErr ; ++gPrOpenCounter ; if ( gPrOpenCounter == 1 ) { PrOpen() ; err = PrError() ; wxASSERT( err == noErr ) ; } return err ;}OSStatus UMAPrClose(){ OSErr err = noErr ; wxASSERT( gPrOpenCounter >= 1 ) ; if ( gPrOpenCounter == 1 ) { PrClose() ; err = PrError() ; wxASSERT( err == noErr ) ; } --gPrOpenCounter ; return err ;}pascal QDGlobalsPtr GetQDGlobalsPtr() ;pascal QDGlobalsPtr GetQDGlobalsPtr()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -