선배님의 개쩌는 캐리를 받아 새로 장만한 맥북에 기존에 사용하던 라이브 배경화면을 이식한 후기.
맥북을 장만했다!! M2 Max 32GB!!
개쩌는 배터리와 엄청난 수명의 배터리, 엄청난 시간동안 사용할 수 있게 해주는 배터리와 써도써도 닳지 않는 배터리가 정말 인상적이었다.
물론 엄청난 속도는 말할 것도 없고(나는 포토샵이 이렇게 빨리 켜질 수 있는지 처음 알았다...).
아무튼, 맥북을 장만한 김에 이전 리눅스와 윈도우에서 가능했던 라이브 배경화면을 쓰고싶었다.
리눅스에서는 KDE가 원만한 방법으로(qml을 사용해 wallpaper 플러그인을 만들면 설정할 수 있었다) 지원했고, 윈도우에서는 월페이퍼 엔진을 가져다가 아무 프로그램이나 배경화면에 깔 수 있었다.
그러다가 드디어 MacOS의 차례가 온 것이다!
당연히 Wallpaper Engine 처럼 편리한 것이 있나 찾아보았지만... 기본적으로 유료이면서 원하는 기능이 지원되는지는 명확히게 서술되어있지 않았다. 사놓고 아 이거 안되네... 할 지도 모른다는 뜻이었다.
사실 이게 없어서 거의 포기하려고 했는데, 주변에 계시던 개쩌는 능력을 가지신 선배님께서 아주 좋은 얘기를 해주셨다. 정리하자면 다음과 같았다.
그리하여, 이번에는 직접 배경화면 레이어에 깔리는 배경화면 프로그램을 제작해보기로 한 것이다!
그러나... 거의 모든 것은 선배님이 해줬다. 실제로 내가 만진 부분은... UI쪽 부분과 코드를 최종 패키징하여 로그인 시 실행할 수 있도록 한 것 정도였다.
최종 목표는 이러했다:
단순한 목표다. 단순했어야했다. 그러나... 너무 많은 삽질을 해주셨다.
CGSInternal
이었는데... 주로는 CGSWindow
를 사용해 CGSSetWindowLevel
를 호출하여 데스크탑 레이어로 이동시켰다.CGSTexture
에서 bind
함수를 비롯한 여러 OpenGL에 의존하는 코드가 삭제되고 다시 디자인되었다는 것이었다.이 문제는 선배님이 해결해주셨다. 근본적인 원인은 이 소스가 OpenGL을 사용한다는 것을 전제로 하고 있었고, QImage 를 CGSTexture 로 바꾸어, 그것을 렌더링하도록 되어있었는데 그것을 사용하지 못한다는 것이었다.
그래서 원래 Qt 5에서 CGSTexture.bind()
에 있던 코드를 참고해, OpenGL 에서 사용할 수 있게 GlFunction 을 호출하는 별도의 텍스쳐 클래스를 만드셨다.
그러고 나니 일단 '로그인 시 자동으로 실행될 것'을 제외한 목표가 달성되었다.
UI는 시시한 이야기이므로 몇 가지만 얘기하고 제끼고, 패키징한 이야기로 건너뛰어보자.
CGSSetWindowLevel
을 호출하면 무시되는데, 한 번 창이 뜬 이후에 호출해야하므로 그 사이에는 일반 윈도우로 취급되었다.CSGSetWindowLevel
을 호출, 다시 그 0.5초 뒤에 Qml UI의 opacity 를 transition과 함께 1로 설정했다.
나름 만족스럽게 void setCurrentAppAsAgent() { ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType(&psn, kProcessTransformToUIElementApplication); }
이제 이 모든 것이 하나의 프로그램으로 패키징되어야했다. 아래와 같은 과정을 거쳤다.
.dylib
과 qmldir
파일로 출력되는데, 그것을 내 Cpp 프로그램의 Qml Loader 가 인식할 수 있게 해야했다.QML2_IMPORT_PATH
환경변수에 최종 출력 파일들의 경로를 지정해줌으로써 해결했다. 당연히 수동으로 설정한 것이 아닌 프로그램 실행 시 C 표준의 putenv
를 사용하여 진행했다..skel
과 .atlas
, .png
를 전달해주기 어려운 문제가 있었다.qrc:
접미어를 통해 프로그램 리소스에 있는 파일을 불러올 수 있었다..app
으로 완성되는 패키징 결과물이 사실은 디렉터리였다...Contents/Resources/
에 .icn
파일을 추가하여 앱 아이콘도 만들고... Contents/Info.plist
를 수정해서 앱 이름이나 번들이름같은것도 바꾸고 그랬다.마지막으로, 패키징한 프로그램을 MacOS 설정에서 로그인 항목에 추가했다.
이제 배터리 사용량 변화 추이를 보고 실사용을 할지 말지를 결정하면 될 것 같다.
쓰고 보니 진짜 내가 한 건 별로 없는 것 같다...
선배님은 4시간동안 삽질하시면서도 하나하나 해결해나가시던데 대단하시다 싶었다.
특히 OpenGL Function 문서 뒤지시면서 '나 이거 안해봐서 모르는데...'라고 하시다가도 금방 다음 단계로 넘어가시는게...
나는 진짜 거의 UI 부분만 했다고 봐도 무방한데... 어차피 UI는 시시한 이야기 이므로.
뭐 아무튼 이전에는 항상 좌측에 시계와 우측에 Spine 으로 만든 오퍼레이터를 표시했는데, 이번에는 시계를 생략하고 간단한 메시지만 표시하도록 했다. 물론 매번 같으면 재미가 없으므로 로그인마다 랜덤하게 바뀌도록 했다.
제발 다음에 내가 이 장난감을 메인터넌스할 일이 생기면 그 때는 이 선배님이 짜주신 코드들을 이해할 수 있게 되길 바랄 뿐이다. 나는 아직까지는 CPP 문법도 제대로 모르는 뉴비일 뿐이므로.