Bamboo, Graphire, Intuos 1, 2 & 3 및 Cintiq 1 Gen 태블릿 용 Wacom의 MacOS 드라이버에는 버그가있어 MacOS 10.15 카탈리나 및 이후 버전 (11 Big SU 및 12 Monterey 포함)에서 완전히 시작하지 못합니다. 이것은 Windows 드라이버 또는 새로운 태블릿 드라이버에게는 적용되지 않습니다.
대나무 태블릿으로 Wacom 기본 설정 창을 열면 "동기화를 기다리는 중"이라는 오류 메시지가 표시되면 마지막으로 "태블릿 드라이버에 문제가 있습니다. 시스템을 재부팅하십시오. 문제가 계속되면 다시 설치하십시오. 또는 드라이버를 업데이트하십시오. " Intuos 3 또는 Cintiq 1 Gen 태블릿의 경우 기본 설정 창이 열리지 만 무엇이든 클릭하면 "Wacom 태블릿 환경 설정에 오류가있었습니다." Graphire 및 Intuos 1 & 2 정제의 경우 운전자 설치 프로그램은 카탈리나에서도 실행할 수 없었습니다.
고맙게도 나는 문제를 추적 할 수 있었고 문제를 해결하기 위해 운전자를 패치했습니다!
고정 된 대나무 드라이버 (v5.3.7-6)는이 태블릿을 지원합니다.
내 고정 된 그래파이어 1 & 2 와 Intuos 1 & 2 드라이버 (v6.1.6-4)는 다음을 지원합니다.
내 고정 된 그래이어 3 드라이버 (v5.2.6-5)는이 태블릿을 지원합니다.
내 고정 된 그래이어 4 드라이버 (v5.3.0-3)는이 태블릿을 지원합니다.
그리고 나의 고정 된 Intuos 3 과 Cintiq 드라이버 (v6.3.15-3)는이 태블릿을 지원합니다.
Intuos 4 의 경우 내 수정이 필요하지 않습니다. 대신 Wacom의 공식 드라이버 v6.3.41-2를 사용할 수 있습니다.
?? 단순화 된 영어 지침
?? / ??? instruções em português
?? 日本語で表示
?? инструкция на русском я :
?? Español의 강사
?? instrukcja po polsku
?? en français
여기에 태블릿의 올바른 설치 프로그램을 다운로드하고 두 번 클릭하여 실행하면 고정 버전의 Wacom 드라이버가 설치됩니다.
Mac에서 앱 스토어에서 앱을 설치할 수 있다는 오류 메시지가 표시되면 마우스 오른쪽 버튼을 클릭하고 대신 "열기"를 클릭하십시오.
설치 한 후 다음 섹션의 지침을 따르면 태블릿의 권한을 수정하십시오.
펜 팁을 태블릿에 터치하면 시스템 환경 설정> 보안 및 개인 정보 보호> 개인 정보 보호 탭을 방문하여 태블릿 권한을 부여해야합니다.
접근성 페이지에서 자물쇠를 클릭하여 페이지를 잠금 해제 한 다음 PenTabletDriver
, WacomTabletDriver
TabletDriver
또는 WacomTabletSpringboard
항목을 찾아서 틱합니다. 입력 모니터링 페이지에서 동일하게 수행하십시오.
태블릿이 터치를 지원하는 경우 손가락으로 태블릿을 터치하면 다시 권한을 부여하라는 메시지가 표시됩니다. 접근성 페이지에서 ConsumerTouchDriver
또는 WacomTouchDriver
항목을 선택하십시오.
일부 태블릿을 사용하면 운전자가 입력 모니터링 페이지에만 나타날 수 있으며 액세스 가능성 페이지에도 두 번째로 다시 부팅해야 할 수도 있습니다.
이전 태블릿 드라이버에서 남은 권한이 있었을 것입니다.이 오래된 항목은 모두 그렇게 제거해야합니다.
보안 및 개인 정보 보호의 "접근성"페이지에서 목록에서 Wacom과 관련된 모든 것을 찾으십시오 (예 : PenTabletDriver
, WacomTabletDriver
, TabletDriver
, ConsumerTouchDriver
, WacomTabletSpringboard
, WacomTouchDriver
)를 선택하고 마이너스 버튼을 클릭하여 제거하십시오. "입력 모니터링 페이지"로 이동하여 여기서도 마찬가지입니다.
이제 컴퓨터를 재부팅하거나 터미널 에서이 두 명령을 실행하여 태블릿 드라이버를 다시로드하십시오. 대나무 및 그래퍼 3 & 4 정제 :
launchctl unload /Library/LaunchAgents/com.wacom.pentablet.plist
launchctl load -w /Library/LaunchAgents/com.wacom.pentablet.plist
Graphire 1 & 2, Intuos 및 Cintiq 정제의 경우 :
launchctl unload /Library/LaunchAgents/com.wacom.wacomtablet.plist
launchctl load -w /Library/LaunchAgents/com.wacom.wacomtablet.plist
이것은 권한을 추가하도록 요청하는 프롬프트를 복원해야하므로 이제이 섹션에서 지침을 다시 시작하십시오.
소수의 사람들의 경우 Wacom 드라이버는 입력 모니터링 목록에 나타나지 않습니다. 이 문제를 해결하려면 먼저 "터미널"앱을 열고이 줄을 붙여 넣고 Enter를 눌러 Wacom 서비스가 활성화되어 있는지 확인하십시오.
대나무 및 그래퍼 3 & 4 정제 :
launchctl load -w /Library/LaunchAgents/com.wacom.pentablet.plist
Graphire 1 & 2, Intuos 및 Cintiq 정제의 경우 :
launchctl load -w /Library/LaunchAgents/com.wacom.wacomtablet.plist
태블릿을 사용하려고 할 때 입력 모니터링 권한을 추가하도록 요청하지 않으면 대신 수동으로 추가 할 수 있습니다.
Finder에서 Go-> 폴더로 이동 하여이 경로를 붙여 넣고 확인을 클릭하십시오. 확인을 클릭하십시오.
/Library/Application Support/Tablet/
거기에는 "PentableTdriver"파일 (대나무), "Pentabletspringboard"(Graphire 3 & 4) 또는 "Wacomtabletspringboard"(Graphire 1 & 2, Intuos, Cintiq)가 표시됩니다.
입력 모니터링 페이지를 잠금 해제 한 다음 PentableTdriver / Pentabletspringboard / Wacomtabletspringboard 파일을 그 목록에 추가하여 똑딱 거리는 지 확인하십시오. 이제 컴퓨터를 재부팅하면 태블릿을 사용하려고하면 접근성 페이지에서 태블릿을 선택하라는 메시지가 표시되며 그 후 작동을 시작해야합니다.
여전히 Wacom의 최신 드라이버가 설치되어 있지 않은지 확인하십시오. "Wacom Utility"/ "Tablet Utility"를 사용하여 Wacom의 드라이버를 완전히 제거한 다음 (쓰레기로 드래그하는 대신) 내 드라이버를 다시 설치하십시오.
부패한 환경 설정은 일이 작동하는 것을 방해 할 수 있습니다. 특히 작업을 수행하려고 노력하면서 다양한 드라이버 버전을 설치 한 경우 특히 그렇습니다. Wacom 유틸리티를 사용하여 기본 설정을 재설정하고 재부팅하고 태블릿을 다시 사용해보십시오.
태블릿을 다시 작동하는 것을 즐겼다면 팁을 보내주십시오!
이것은 나에게 자금을 지원하고 이러한 고정 운전자의 추가 개발에 도움이 될 것입니다.
PentableTdriver는 Consumertouchdriver 및 Tabletdriver,이 작업을 수행하기 위해 두 개의 하위 드라이버를 출시합니다. 리소스 폴더 내에서 해당 드라이버를 찾으려면 결국 URL에서 경로를 추출하기 위해이 기능을 호출합니다.
CFString * MacPaths::PathFromURL (CFURL *url)
{
CFString *path;
path = _objc_retainAutoreleasedReturnValue (url-> path ());
_objc_release (path); /* Whoops, path is destroyed here! */
return path; /* Now returning a free'd path */
}
원래 목표 C 코드를 C ++로 말하는 것을 용서하십시오. 나는 OBJC를 말하지 않습니다!
CFURL이 경로를 생성하면 참조 수는 1에서 시작됩니다. autorelease()
호출하여 나중에 참조 수를 줄인 다음 Wacom의 드라이버로 반환합니다. autorelease
에 대한이 호출은 Wacom의 retainAutoreleasedReturnValue()
호출과 쌍을 이루어서 경로의 참조 수를 1로 그대로 둡니다.
그러나 이제 Wacom 드라이버는 경로에서 _objc_release()
호출합니다. 이것은 참조 수를 0으로 줄이고 경로는 즉시 해방됩니다!
이 자유 경로는 서브 드라이버를 시작하는 동안 사용되며, 이는 ProcessUtils::LaunchApplicationWithBundleID()
에서 segfault를 트리거 할 수 있습니다. 이것은 운전자를 죽인다.
이 수정은 단일 바이트 변경으로, PathFromURL
의 _objc_release()
를 _objc_retain()
로 호출로 대체하는 단일 바이트 변경입니다. 이것은 경로가 사용되기 전에 해방되는 것을 방지하여 segfault를 치료합니다.
Consumertouchdriver에는 동일한 버그도 포함되어 있으며 패치는 동일합니다.
펜 드라이버와 터치 드라이버는 멀티 터치 제스처가 수행 될 때 충돌을 막기 위해 수정이 필요하거나 스크롤 링이 확대하는 데 사용됩니다.
제스처가 수행되면 CMacHIDGestureEventOSX1010::PostGesture
의 기능이 해당 제스처를 운영 체제로 보내는 책임이 있습니다.
void CMacHIDGestureEventOSX1010::PostGesture (EIOHIDEventType gestureType_I, int32_t eventDirAmount)
{
__CFDataOSX1010 *eventStructure;
if (gestureType_I == 61 /* kCGHIDEventTypeGestureStarted */ ) {
this -> eventPhase = 1 /* kCGSGesturePhaseBegan */ ;
} else {
this -> eventPhase = 4 /* kCGSGesturePhaseEnded */ ;
(**(code **)(*( long *) this + 0x18 ))( 0 , this ,( uint32_t ) eventDirAmount);
}
eventStructure = (__CFDataOSX1010 *) _CGEventCreate ( 0 ); // Dubious
_CGEventSetType (eventStructure, 29 /* kCGSEventGesture */ );
eventStructure-> eventSubType = gestureType_I; // Relies on the exact memory layout of CGEvent (!)
eventStructure-> eventDirAmount = eventDirAmount; // Ditto
_CGEventPost ( 0 , eventStructure);
_CFRelease (eventStructure);
}
Cgeventcreate의 결과가 어떻게 구조로 캐스팅되는지 주목하십시오. Cgevent는 불투명 한 유형이어야하며, 프로그램은 OS 버전에서 OS 버전으로의 구조가 변경되므로 레이아웃을 알거나 의존해서는 안되지만 여기에서는 eventSubType
및 eventDirAmount
필드가 할 수 있도록 구조로 캐스트됩니다. 직접 할당됩니다. 이 두 글은 시에라 이후 CGEvent
의 레이아웃이 바뀌었기 때문에 카탈리나에서 힙 부패를 일으키고 충돌을 일으 킵니다!
이벤트에 값을 저장하는 올바른 방법은 CGEVENTETINTEGERVALUEFIELD API를 사용하는 것입니다.이를 통해 메모리의 위치 대신 논리적 ID로 CGEVENT 필드를 참조 할 수 있습니다. 그렇다면 WACOM 운전자가해야한다는 두 글자에 대한 동등한 필드 ID는 무엇입니까?
CGEventSetIntegerValueField
의 구현을 포함하는 MacOS Sierra의 Skylight 프레임 워크를 분해하여 해당 필드에 대한 ID가 무엇인지 확인했습니다. eventSubType
Field ID 110에 의해 작성 될 수 있으며 eventDirAmount
는 ID 115에 의해 작성 될 수 있습니다. 그러나 이러한 필드 ID는 Apple의 문서에서 찾을 수있는 곳이 없으며 Wacom이 사용 할 수없는 이유를 설명합니다!
나는 인터넷 검색을 했고이 들판들이 Apple의 개인 API의 일부이기 때문에 문서화되지 않은 것을 발견했습니다. 이 WebKit 헤더는 이름을 밝힙니다.
kCGEventGestureHIDType = 110
kCGEventGestureSwipeValue = 115
kCGEventGesturePhase = 132
그리고 그 개인 API 필드는 시에라에서 빅 서 (Big Sur)까지 안정적입니다! 이제 우리가 이것을 알았으므로, 이벤트 구조에 대한 두 가지 과제는 이러한 통화로 대체 될 수 있으며 운전자 충돌이 제거됩니다.
_CGEventSetIntegerValueField (eventStructure, 110 /* kCGEventGestureHIDType */ , gestureType_I);
_CGEventSetIntegerValueField (eventStructure, 115 /* kCGEventGestureSwipeValue */ , eventDirAmount);
우체국의 부동 소수점 버전은 같은 문제가 있습니다.
void CMacHIDGestureEventOSX1010::PostGesture (EIOHIDEventType eventSubType, float dirAmount)
{
__CFDataOSX1010 *eventStructure;
eventStructure = (__CFDataOSX1010 *) _CGEventCreate ( 0 );
_CGEventSetType (eventStructure, 29 /* kCGSEventGesture */ );
eventStructure-> eventSubType = eventSubType; // !
eventStructure-> eventDirAmount = reinterpret_cast < int32_t &>(dirAmount); // !
eventStructure-> eventState = this -> eventPhase ; // !
if ( this -> eventPhase == 1 /* kCGSGesturePhaseBegan */ ) {
this -> eventPhase = 2 /* kCGSGesturePhaseChanged */ ;
}
_CGEventSetLocation (eventStructure, GetMouseLocationInScreenCoordinates ());
_CGEventPost ( 0 , eventStructure);
_CFRelease (eventStructure);
}
그리고 우리는 그렇게 패치 할 수 있습니다.
_CGEventSetIntegerValueField (eventStructure, 110 /* kCGEventGestureHIDType */ , gestureType_I);
_CGEventSetIntegerValueField (eventStructure, 115 /* kCGEventGestureSwipeValue */ , reinterpret_cast < int32_t &>(dirAmount));
_CGEventSetIntegerValueField (eventStructure, 132 /* kCGEventGesturePhase */ , this ->eventPhase);
Wacom의 선호 창에서 Wacom은 Apple Bug 8746551에 희생됩니다. MacOS Catalina 이후 선호도 창은 모든 창 유형이 활성 창, 심지어 시트가 될 수 있도록 NSApp->mainWindow
의 작동을 효과적으로 중단시킵니다. 이전 버전에서는 불가능했습니다. MACOS 및 독립형 앱 (이전 버전에서는 실제 기본 환경 설정 창만 mainWindow
가됩니다).
모달 시트가 열리고 사용자가 새 시트를 열려면 원래 시트를 먼저 닫아야합니다. 그러나 Apple의 버그는 Wacom의 수표가 현재 실패 할 시트가 있는지 확인하게합니다. 시트가 mainWindow
에 부착되어 있는지 확인할 때 대신 현재 시트에 부착 된 시트가 확인되기 때문에 설명하지 않습니다. mainWindow
되십시오. 이로 인해 충돌이 발생합니다 (예 : 펜 매핑 설정에서).
나는 mainWindow
의 액세스를 패치하여 읽는 첫 번째 값이 나중에 캐시되도록했는데, 초기 값이 합리적이면 mainWindow
첫 번째로 열린 시트를 가리 키도록 업데이트 된 후에는 깨지지 않습니다 ( PenTablet.prefpane.newcode.asm
참조. PenTablet.prefpane.newcode.asm
).
Intuos 3 및 Cintiq 드라이버에는 선호 창에 버그가있어 항목을 클릭하자마자 충돌합니다.
선호도 창의 UI의 주요 기능 중 하나는 구성 할 수있는 태블릿, 도구 및 응용 프로그램을 나타내는 아이콘 목록입니다. 해당 아이콘 목록 컨트롤은 이와 같은 기능을 사용하여 이벤트 (예 : 클릭)를 어린이에게 발산합니다.
void WTCCPLIconList::action:(ID event, SEL param_2, ID param_3) {
int selectedIndex;
ID target;
ID action;
target = _objc_retainAutoreleasedReturnValue (event-> target ());
action = event-> action ();
selectedIndex = event-> selectedIndex ();
event-> scrollIndexToVisible (selectedIndex);
if ((target != 0 ) && (action != 0 )) {
code* handler = target-> methodForSelector (action);
Object *result = handler (target, action, event);
result = _objc_retainAutoreleasedReturnValue (result); // (!)
_objc_release (result); // (!)
}
event-> updateButtonStates ();
_objc_release (target);
}
이 코드의 문제점은 객체를 반환하기 위해 이벤트의 handler()
함수가 필요하다는 것입니다. 그러면 쓸모가 없게 ()를 유지하고 릴리스합니다 (). 그러나 호출 될 핸들러 함수 중 하나는 OEventDispatcher_Professional::listClickAction()
이며 해당 함수는 void
함수입니다 (잘 정의 된 반환 값이없는)!
따라서 action:()
쓰레기 포인터에서 retain()
및 release()
호출하여 segfault를 유발합니다.
여기의 패치는 쉽습니다 - 쓸모없는 retain()
및 release()
호출이 삭제됩니다. 동일한 버그가 동일한 수정으로 ONumberTextField::textDidChange:
에 있습니다.
이 드라이버에는 또 다른 문제가 있습니다. 태블릿을 작동 시키려고하는 동안 실수로 최신 WACOM 드라이버 (Intuos 3을 지원하지 않는)를 설치하면 이전 Intuos 3 드라이버가 읽을 때 충돌하는 최신 형식 선호 파일을 씁니다. 또한이 상황은 스스로 해결되지 않으므로 사용자는 수동으로 Wacom 유틸리티를 사용하여 태블릿 환경 설정을 삭제하여 수정해야합니다.
기본 설정 파일에는이 상황을 피하도록 설계된 버전 번호가 포함되어 있기 때문에 이상합니다. 이전 드라이버는 버전 5를 사용하고 최신 드라이버는 버전 6을 사용합니다.
< ImportFileVersion type = " integer " >6</ ImportFileVersion >
그리고 드라이버 코드는이 버전 번호를 명시 적으로 확인하고 너무 새 경우 중단해야합니다.
CTabletDriver::ReadSettings (basic_string settingsFilename, ...)
{
basic_string settingsFileContent;
CSettingsMap settingsMap;
...
ReadFromXMLFile (settingsMap, settingsFilename, settingsFileContent);
SettingsMigration *migration = SettingsMigration::MigratePen (settingsMap);
if (migration != nullptr ) {
int fileVersion = settingsMap. IntegerForKeyWithDefault ( " ImportFileVersion " , - 1 )
if (fileVersion < 1 ) {
// Report error
} else if (fileVersion <= this -> supportedVersion ) {
// Accept the loaded settings
} else {
// Report error: Settings are too new
}
}
...
}
그러나 운전자는 결코 중단하지 않고 대신 선호도를로드하려고 시도하면서 충돌합니다. 그래서 여기서 뭐가 잘못 됐어? 비밀은 MigratePen()
함수 안에 있습니다. 이 기능은 이전 설정 파일을 현재 버전으로 업그레이드하도록 설계되었지만 불행히도 프로세스에서는 현재 버전 (5)으로 ImportFileVersion
을 무조건적으로 덮어 씁니다! 이로 인해 CTabletDriver::ReadSettings()
가 설정이 너무 새롭다는 것을 감지 할 수 없습니다.
이를 해결하기 위해 MigratePen()
에서 유효하지 않은 버전 탐지 코드를 강화했습니다.
if (settingsVersion < 1 ) {
// Report invalid settings version and return NULL
}
그것을 만들기 위해 :
if (settingsVersion < 1 || settingsVersion > 5 ) {
// Report invalid settings version and return NULL
}
따라서 선호도가 너무 새 경우 MigratePen()
을 업그레이드하려고 시도하지 않으며 ReadSettings()
는 환경 설정을 깨끗하게 건너 뜁니다. 이로 인해 기본 설정이 기본값을 유지하고 사용자가 기본 설정 창을 사용하여 설정을 편집하면 설정을 깨끗하게 덮어 써야합니다.
Graphire 드라이버의 설치 업체는 카탈리나가 더 이상 지원하지 않는 오래된 형식이므로 완전히 재건해야했습니다.
Graphire의 선호 창은 카탈리나에 더 이상 존재하지 않는 MacOS 표준 라이브러리의 개인 기호에 잘못 의존하여 더 이상 시작할 수 없습니다.
예를 들어, Wacom의 nsnibwakingoverride :: awakefromnib () 함수는 GUI Desorialization에서 호출되며로드 된 GUI 컨트롤을 맵에 추가하여 나중에 태그로 액세스 할 수 있습니다.
void NSNibWakingOverride::awakeFromNib (NSControl * this ) {
OMasterDictionaryPtr-> addObject :withTag:( this , this -> _tag ));
}
그러나 이것은 개인 분야 인 NSControl._tag를 읽는 데 의존합니다. NSControl이 다음과 같이 정의 되었기 때문에 MACOS 10.9에서 작동했습니다.
@interface NSControl : NSView
{
/* All instance variables are private */
NSInteger _tag;
id _cell;
struct __conFlags {
...
} _conFlags;
}
그러나 MACOS 10.10에서 NSControl은 _TAG 필드를 새로운 _aux 필드로 옮기기 위해 리팩토링되어 접근 할 수 없습니다.
@interface NSControl : NSView
{
/* All instance variables are private */
NSControlAuxiliary *_aux;
id _cell;
struct __conFlags {
...
} _conFlags;
}
@property NSInteger tag;
이 분야의 공개 액세서 기능을 올바르게 호출하도록 Awakefromnib를 패치했습니다.
void NSNibWakingOverride::awakeFromNib (NSControl * this ) {
OMasterDictionaryPtr-> addObject :withTag:( this , this -> tag ()));
}
Wacom의 opopupoutlineview :: ReloadData () 함수에서 private nstableview._datasource 필드는 직접 읽습니다.
void OPopupOutlineView::reloadData (OPopupOutlineView * this ) {
this -> _dataSource . willReloadDataForOutlineView ( this );
...
}
그래서 나는 대신 공개 액세서를 사용하기 위해 이것을 패치했습니다.
void OPopupOutlineView::reloadData (OPopupOutlineView * this ) {
this -> dataSource ()-> willReloadDataForOutlineView ( this );
...
}
이 드라이버는 Graphire 3 & 4 드라이버와 동일한 문제와 동일한 수정으로 ORadialSubMenuTableView::reloadData() method
에서 동일한 _dataSource
문제가 있습니다.