ไดรเวอร์ macOS ของ Wacom สำหรับไม้ไผ่, graphire, intuos 1, 2 & 3 และ cintiq 1st แท็บเล็ต Gen มีข้อบกพร่องในนั้นซึ่งทำให้พวกเขาล้มเหลวอย่างสมบูรณ์ในการเริ่มต้นใน MacOS 10.15 Catalina และรุ่นต่อมา (รวมถึง 11 Big Sur และ 12 Monterey) สิ่งนี้ใช้ไม่ได้กับไดรเวอร์ Windows หรือกับไดรเวอร์สำหรับแท็บเล็ตที่ใหม่กว่า
เมื่อคุณพยายามเปิดบานหน้าต่างการตั้งค่า Wacom ด้วยแท็บเล็ตไม้ไผ่คุณจะได้รับข้อความแสดงข้อผิดพลาดว่า "กำลังรอการซิงโครไนซ์" จากนั้นในที่สุด "มีปัญหากับไดรเวอร์แท็บเล็ตของคุณโปรดรีบูตระบบของคุณหากปัญหายังคงติดตั้งใหม่ หรืออัปเดตไดรเวอร์ " สำหรับแท็บเล็ต Gen Intuos 3 หรือ Cintiq 1st บานหน้าต่างการตั้งค่าจะเปิดขึ้น แต่การคลิกสิ่งใดก็ตามจะทำให้มันผิดพลาดกับข้อความ "มีข้อผิดพลาดในการตั้งค่าแท็บเล็ต Wacom" สำหรับแท็บเล็ต Graphire และ Intuos 1 & 2 ตัวติดตั้งคนขับไม่สามารถทำงานบน Catalina ได้
โชคดีที่ฉันสามารถติดตามปัญหาและฉันได้แก้ไขไดรเวอร์เพื่อแก้ไข!
ไดรเวอร์ ไม้ไผ่ คงที่ของฉัน (v5.3.7-6) รองรับแท็บเล็ตเหล่านี้:
ไดรเวอร์ graphire 1 & 2 และ intuos 1 & 2 (v6.1.6-4) รองรับแท็บเล็ตเหล่านี้:
ไดรเวอร์ graphire 3 คงที่ของฉัน (v5.2.6-5) รองรับแท็บเล็ตเหล่านี้:
ไดรเวอร์ graphire 4 คงที่ของฉัน (v5.3.0-3) รองรับแท็บเล็ตเหล่านี้:
และไดรเวอร์ Intuos 3 และ Cintiq ที่แก้ไขแล้วของฉัน (v6.3.15-3) รองรับแท็บเล็ตเหล่านี้:
สำหรับ Intuos 4 ไม่จำเป็นต้องมีการแก้ไขของฉัน คุณสามารถใช้ไดรเวอร์อย่างเป็นทางการของ Wacom V6.3.41-2 แทน
- คำแนะนำภาษาอังกฤษที่ง่ายขึ้น
- - Instruções Em Português
- 日本語で表示
- และ
- คำแนะนำ en español
- Instrukcja po polsku
- คำแนะนำ en français
ดาวน์โหลดตัวติดตั้งที่ถูกต้องสำหรับแท็บเล็ตของคุณที่นี่และดับเบิลคลิกเพื่อเรียกใช้งานนี้จะติดตั้งไดรเวอร์ Wacom เวอร์ชันคงที่ของฉัน:
หากคุณได้รับข้อความแสดงข้อผิดพลาดที่ Mac ของคุณอนุญาตให้ติดตั้งแอพจาก App Store ให้คลิกขวาแล้วคลิก "เปิด" แทน
หลังจากติดตั้งให้ทำตามคำแนะนำในส่วนถัดไปเพื่อแก้ไขสิทธิ์ของแท็บเล็ต
แตะเคล็ดลับปากกาของคุณไปยังแท็บเล็ตของคุณและควรแจ้งให้คุณทราบการตั้งค่าระบบ> ความปลอดภัยและความเป็นส่วนตัว> แท็บความเป็นส่วนตัวเพื่อให้สิทธิ์แท็บเล็ต
ในหน้าการเข้าถึงให้คลิกที่กุญแจเพื่อปลดล็อกหน้าจากนั้นค้นหาและทำเครื่องหมายและทำเครื่องหมาย PenTabletDriver
, WacomTabletDriver
TabletDriver
หรือรายการ WacomTabletSpringboard
ที่คุณเห็นในรายการ ทำเช่นเดียวกันในหน้าการตรวจสอบอินพุต
หากแท็บเล็ตของคุณรองรับการสัมผัสให้แตะแท็บเล็ตด้วยนิ้วของคุณก็ควรแจ้งให้คุณอนุญาตอีกครั้ง ในหน้าการเข้าถึงติ๊กรายการ ConsumerTouchDriver
หรือ WacomTouchDriver
ด้วยแท็บเล็ตบางตัวไดรเวอร์อาจปรากฏบนหน้าการตรวจสอบอินพุตเท่านั้นและคุณอาจต้องรีบูตครั้งที่สองเพื่อให้ปรากฏในหน้าการเข้าถึงด้วย
คุณน่าจะมีสิทธิ์ที่เหลือจากไดรเวอร์แท็บเล็ตก่อนหน้านี้และรายการเก่าเหล่านี้จำเป็นต้องลบออกเช่น:
ในหน้า "การเข้าถึง" ของความปลอดภัยและความเป็นส่วนตัวค้นหาสิ่งที่เกี่ยวข้องกับ Wacom ในรายการ (เช่น PenTabletDriver
, WacomTabletDriver
, TabletDriver
, ConsumerTouchDriver
, WacomTabletSpringboard
, WacomTouchDriver
) เลือกและคลิกปุ่ม minus เพื่อลบออก ไปที่ "หน้าการตรวจสอบอินพุต" และทำเช่นเดียวกันที่นั่น
ตอนนี้รีบูตคอมพิวเตอร์ของคุณหรือเรียกใช้คำสั่งทั้งสองนี้ในเทอร์มินัลเพื่อโหลดไดรเวอร์แท็บเล็ตใหม่ สำหรับไม้ไผ่และ graphire 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:
สำหรับไม้ไผ่และ graphire 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 คลิกไป -> ไปที่โฟลเดอร์และวางเส้นทางนี้ไว้ในนั้นแล้วคลิกตกลง:
/Library/Application Support/Tablet/
ในนั้นคุณควรเห็นไฟล์ "PentabletDriver" (ไม้ไผ่), "Pentabletspringboard" (graphire 3 & 4) หรือ "Wacomtabletspringboard" (graphire 1 & 2, intuos, cintiq)
ปลดล็อกหน้าการตรวจสอบอินพุตจากนั้นลากไฟล์ pentabletDriver / Pentabletspringboard / wacomtabletspringboard ลงบนมันเพื่อเพิ่มลงในรายการและตรวจสอบให้แน่ใจ ตอนนี้รีบูตคอมพิวเตอร์ของคุณและเมื่อคุณพยายามใช้แท็บเล็ตควรแจ้งให้คุณติ๊กในหน้าการเข้าถึงด้วยหลังจากนั้นควรเริ่มทำงาน
ตรวจสอบให้แน่ใจว่าคุณยังไม่ได้ติดตั้งไดรเวอร์ล่าสุดของ Wacom ใช้ "Utility Wacom"/ "Utility Tablet" เพื่อถอนการติดตั้งไดรเวอร์ทั้งหมดของ Wacom ทั้งหมด (แทนที่จะลากไปยังถังขยะ) จากนั้นติดตั้งไดรเวอร์ของฉันอีกครั้ง
การตั้งค่าที่เสียหายสามารถป้องกันสิ่งต่าง ๆ จากการทำงานโดยเฉพาะอย่างยิ่งหากคุณติดตั้งเวอร์ชันไดรเวอร์ที่แตกต่างกันในขณะที่พยายามทำงานให้ทำงาน ใช้ยูทิลิตี้ Wacom เพื่อรีเซ็ตการตั้งค่ารีบูตและลองใช้แท็บเล็ตอีกครั้ง
หากคุณสนุกกับการมีแท็บเล็ตของคุณกลับมาทำงานโปรดลองส่งคำแนะนำให้ฉัน!
สิ่งนี้จะช่วยฉันและการพัฒนาเพิ่มเติมของไดรเวอร์คงที่เหล่านี้
PentabletDriver เปิดตัวไดรเวอร์ย่อยสองตัวเพื่อทำงานให้กับมัน CerserTouchDriver และ 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 ++ ฉันไม่ได้พูด OBJC!
เมื่อ CFURL สร้างเส้นทางการนับจำนวนการอ้างอิงจะเริ่มต้นที่ 1 มันคิวจำนวนการอ้างอิงที่จะลดลงในภายหลังโดยการเรียก autorelease()
บนนั้นจากนั้นส่งคืนไปยังไดรเวอร์ของ Wacom การเรียกร้องให้ใช้ autorelease
จับคู่กับการโทร retainAutoreleasedReturnValue()
ของ Wacom และออกจากการอ้างอิงของเส้นทางที่ไม่มีใครแตะต้องที่ 1
แต่ตอนนี้ไดรเวอร์ wacom เรียก _objc_release()
บนเส้นทาง สิ่งนี้จะลดจำนวนการอ้างอิงเป็น 0 และเส้นทางจะเป็นอิสระทันที!
เส้นทางที่เป็นอิสระนี้ใช้ในขณะที่เปิดตัวไดรเวอร์ย่อยซึ่งสามารถกระตุ้น segfault ใน ProcessUtils::LaunchApplicationWithBundleID()
สิ่งนี้ฆ่าคนขับ
การแก้ไขเป็นการเปลี่ยนแปลงแบบไบต์เดียวซึ่งแทนที่การเรียกใช้ _objc_release()
ใน PathFromURL
เป็นการโทรไปที่ _objc_retain()
สิ่งนี้จะป้องกันไม่ให้เส้นทางเป็นอิสระก่อนที่จะใช้ซึ่งจะรักษา Segfault
CerserTouchDriver ยังมีข้อผิดพลาดเดียวกันนี้และแพตช์ก็เหมือนกัน
ทั้งไดรเวอร์ปากกาและไดรเวอร์ Touch ต้องการการแก้ไขเพื่อหยุดยั้งพวกเขาจากการชนเมื่อมีการทำท่าทางแบบมัลติทัชหรือใช้แหวนเลื่อนเพื่อซูม
เมื่อมีการแสดงท่าทางฟังก์ชั่น 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 eventSubType
จะเป็นประเภท eventDirAmount
ได้รับมอบหมายโดยตรง ทั้งสองการเขียนนี้ทำให้เกิดการทุจริตกองบน Catalina และก่อให้เกิดความผิดพลาดเนื่องจากเลย์เอาต์ของ CGEvent
มีการเปลี่ยนแปลงตั้งแต่เซียร่า!
วิธีที่เหมาะสมในการจัดเก็บค่าเข้าสู่เหตุการณ์คือการใช้ CGEVENTETINTEGEGERVALEFIELD API ซึ่งช่วยให้คุณสามารถอ้างถึงฟิลด์ของ CGEVENT โดย ID ตรรกะแทนตำแหน่งในหน่วยความจำ แล้ว ID ฟิลด์ที่เทียบเท่าสำหรับทั้งสองเขียนว่าไดรเวอร์ Wacom ต้องทำ?
ฉันแยกชิ้นส่วน Skylight ของ MacOS Sierra ซึ่งมีการใช้งานสำหรับ CGEventSetIntegerValueField
เพื่อดูว่า IDS ควรเป็นอย่างไรสำหรับสาขาเหล่านั้น ปรากฏว่า eventSubType
สามารถเขียนได้โดย Field ID 110 และ eventDirAmount
สามารถเขียนได้ด้วย ID 115 แต่รหัสฟิลด์เหล่านี้ไม่มีที่ไหนที่จะพบได้ในเอกสารของ Apple ซึ่งอธิบายว่าทำไม Wacom ไม่สามารถใช้งานได้!
ฉันทำ googling และค้นพบว่าฟิลด์เหล่านี้ไม่มีเอกสารเพราะพวกเขาเป็นส่วนหนึ่งของ API ส่วนตัวของ Apple ส่วนหัว webkit นี้เผยชื่อของพวกเขา:
kCGEventGestureHIDType = 110
kCGEventGestureSwipeValue = 115
kCGEventGesturePhase = 132
และฟิลด์ API ส่วนตัวเหล่านั้นมีความเสถียรจากเซียร่าไปจนถึงบิ๊กซูร์! ตอนนี้เรารู้สิ่งนี้แล้วการมอบหมายงานสองรายการสามารถแทนที่ด้วยการโทรเหล่านี้และการล่มของไดรเวอร์จะถูกกำจัด:
_CGEventSetIntegerValueField (eventStructure, 110 /* kCGEventGestureHIDType */ , gestureType_I);
_CGEventSetIntegerValueField (eventStructure, 115 /* kCGEventGestureSwipeValue */ , eventDirAmount);
Postgersture รุ่นลอยตัวมีปัญหาเดียวกัน:
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
)
ไดรเวอร์ Intuos 3 และ Cintiq มีข้อผิดพลาดในบานหน้าต่างการตั้งค่าซึ่งทำให้มันผิดพลาดทันทีที่มีการคลิกรายการ
หนึ่งในคุณสมบัติหลักของ UI ของ Preference Pane คือรายการของไอคอนที่แสดงถึงแท็บเล็ตเครื่องมือและแอปพลิเคชันที่คุณสามารถกำหนดค่าได้ การควบคุมรายการไอคอนนั้นใช้ฟังก์ชั่นเช่นนี้เพื่อส่งเหตุการณ์ (เช่นคลิก) ให้กับเด็ก ๆ :
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()
เพื่อส่งคืนวัตถุซึ่งจะเก็บรักษาไว้อย่างไร้ประโยชน์ () และเผยแพร่ () แต่หนึ่งในฟังก์ชั่น 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()
ฟังก์ชั่นนี้ถูกออกแบบมาเพื่ออัพเกรดไฟล์การตั้งค่าที่เก่ากว่าเป็นเวอร์ชันปัจจุบัน แต่น่าเสียดายที่ในกระบวนการมันเขียนทับ ImportFileVersion
อย่างไม่มีเงื่อนไขด้วยเวอร์ชันปัจจุบัน (5)! สิ่งนี้ทำให้ 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 เป็นรูปแบบเก่าที่ Catalina ไม่รองรับอีกต่อไปดังนั้นฉันจึงต้องสร้างใหม่อย่างสมบูรณ์
บานหน้าต่างการตั้งค่าของ Graphire อาศัยสัญลักษณ์ส่วนตัวอย่างไม่ถูกต้องจากไลบรารีมาตรฐาน MacOS ที่ไม่มีอยู่ใน Catalina อีกต่อไปดังนั้นจึงไม่สามารถเริ่มต้นได้อีกต่อไป
ตัวอย่างเช่น nsnibwakakingoverride ของ Wacom :: AwakeFromnib () ฟังก์ชั่นเรียกว่าในระหว่าง GUI deserialization และเพิ่มการควบคุม GUI ที่โหลดลงในแผนที่เพื่อให้สามารถเข้าถึงได้ด้วยแท็กในภายหลัง:
void NSNibWakingOverride::awakeFromNib (NSControl * this ) {
OMasterDictionaryPtr-> addObject :withTag:( this , this -> _tag ));
}
แต่สิ่งนี้อาศัยการอ่าน nscontrol._tag ซึ่งเป็นเขตข้อมูลส่วนตัว ใน MacOS 10.9 ที่ใช้งานได้เพราะ NSCONTROL ถูกกำหนดเช่นนี้:
@interface NSControl : NSView
{
/* All instance variables are private */
NSInteger _tag;
id _cell;
struct __conFlags {
...
} _conFlags;
}
แต่ใน MacOS 10.10, Nscontrol ถูก refactored เพื่อย้ายฟิลด์ _tag ไปยังฟิลด์ _aux ใหม่ทำให้ไม่สามารถเข้าถึงได้:
@interface NSControl : NSView
{
/* All instance variables are private */
NSControlAuxiliary *_aux;
id _cell;
struct __conFlags {
...
} _conFlags;
}
@property NSInteger tag;
ฉันแก้ไข AwakeFromnib เพื่อให้เรียกฟังก์ชัน Accessor สาธารณะอย่างถูกต้องสำหรับฟิลด์นี้:
void NSNibWakingOverride::awakeFromNib (NSControl * this ) {
OMasterDictionaryPtr-> addObject :withTag:( this , this -> tag ()));
}
ในฟังก์ชั่น OpopUpUpOutLineView :: ReloadData () ของ Wacom, ฟิลด์ส่วนตัว nstableview._datasource ถูกอ่านไม่ถูกต้องโดยตรง:
void OPopupOutlineView::reloadData (OPopupOutlineView * this ) {
this -> _dataSource . willReloadDataForOutlineView ( this );
...
}
ดังนั้นฉันจึงแก้ไขสิ่งนี้เพื่อใช้ accessor สาธารณะแทน:
void OPopupOutlineView::reloadData (OPopupOutlineView * this ) {
this -> dataSource ()-> willReloadDataForOutlineView ( this );
...
}
ไดรเวอร์เหล่านี้มีปัญหาเช่นเดียวกับไดรเวอร์ graphire 3 & 4 รวมถึงปัญหา _dataSource
เดียวกันใน ORadialSubMenuTableView::reloadData() method
พร้อมการแก้ไขเดียวกัน