2016년 10월 11일 화요일

Xi-Editor 소스 분석

https://github.com/google/xi-editor

front-end는 swift를 사용한 cocoa로 back-end는 rust로 되어있다.
(그냥 간단하게 맥쪽 코드는 swift라고 하고 rust쪽 코드는 rust라고 부르겠다.)

* Swift

- AppDelegate
CoreConnection을 초기화한다.
AppWindowController의 window를 화면에 띄운다.
AppWindowController가 실행되면 appWindowControllers 리스트에 등록하고 종료하면 리스트에서 제거한다.
rust로 부터 응답이 오면 실행되는 콜백을 CoreConnection에 등록한다: handleCoreCmd
메뉴 선택에 따른 연결 함수들이 여기에 있다.

- AppWindowController
첫 로딩시 "new_tab" 메시지를 rust에게 보낸다.
filename이 변경되면 window의 타이틀을 변경한다.
EditView와 ClipView의 constraint를 설정한다.
ScrollView의 frame이 바뀌거나 ScrollView.contentView의 bound가 바뀌면 EditView와 ShadowView의 scroll위치를 다시 지정한다.

- CoreConnection
NSTask를 사용하여 rust를 실행한다.
swift와 rust의 연결은 NSPipe를 사용해서
(swift의 writing -> rust의 standard input,
rust의 standard ooutput -> swift의 reading)로 연결한다.
rust로 보내는 메시지는 sync 또는 async로 보낼 수 있다.
sync의 경우는 semaphore를 사용해서 block되어 응답을 기다린다.
async의 경우는 응답이 오면 실행하기 위한 콜백을 등록한다. 콜백은 응답 json이 id를 가지고 있는 경우  실행된다.

- ShadowView
텍스트가 위(topShadow), 왼쪽(leadingShadow), 오른쪽(trailingShadow)을 벗어나는 경우 관련 shadow를 화면에 표시해준다.

- EditView
실제 텍스트를 보여주는 뷰

* Rust


댓글 없음:

댓글 쓰기

Building asynchronous views in SwiftUI 정리

Handling loading states within SwiftUI views self loading views View model 사용하기 Combine을 사용한 AnyPublisher Making SwiftUI views refreshable r...