think different
 
Search on x86OSx.com
 
제목 작성자 내용 태그 코멘트
  News and Notice
    공지사항  [버그신고]
    새로운 소식
    IRC 대화방
    내 스크랩



  Community
    자유 게시판
    OS X 설치 Tips
    OS X 설치 Q&A 
    OS X 설치 후기
    만능 Q&A




  RealMacCommunity
    데스크탑 패밀리
    맥북&아이폰 패밀리



  Software Forum
    OS X Applications
    Other Applications



  Hardware Forum
    MainBoard
    GraphicCard
    SoundCard
    NetworkCard
    Etc Hardware



  Usefulness
    추천 사용기
    유용한 사이트
    BenchMark DB
    Hardware DB
    회원 장터



  Public Data Service
    자료실
    Picture Gallery



x86OSx.com is an open community and we do not offer Mac OS X DVD image files of Apple Inc. Please be aware that doing so is committing an illegal act against Apple Inc. The purpose of this community is to foster information sharing and public use of legal subject matters only.


x86OSx.com



Compatibility Lists


Incompatible Lists








Visitor's Infomation
오늘 방문자
어제 방문자
전체 방문자
최대 방문자



제목:

KeyRemap4Macbook 5.1.60 소스코드 수정 방법소개.

이름: 삐도리 * http://trip2me.tistory.com
Date: 2009-06-18 15:47Read: 5761






이전에 올린 글을 연장선상으로서 이번에는 소스코드의 어디를 고쳤는지에 대한 부분입니다.

아무래도 이녀석이 기본적으로 수많은 리맵 옵션이 있어서 키보드 이벤트 처리 속도에 미약하나마 지장을 줄 수 있으므로 혹자중에 다이어트를 원하는 분이 있을까 하여 올립니다. 또한 원하는 키 리맵을 수정 추가 하려는 분에게도 해당됩니다.

cHicKen 님의 이전글에서의 내용과 비슷하지만 새로 리비전이 올라간 버전은 다소 변경 사항이 있으며 PS/2 키보드의 지원이나 특정 어플리케이션의 인식 및 좀 더 자동화된 스크립트 생성 구조를 위해서는 설명이 필요합니다.

먼저 제가 수정한 부분의 파일 위치는 KeyRemap4Macbook 소스코드 최상위 디렉토리를 기준으로 아래 파일들입니다.
./files/prefpane/checkbox.xml
./src/core/kext/keycode.hpp
./src/core/kext/RemapUtil.cpp
./src/core/kext/util/ListHookedKeyboard.cpp
./src/core/kext/util/ListHookedPointing.cpp
./src/core/kext/remap.cpp
./src/core/server/server.cpp

설명은 이해의 편의를 돕기 위해서 임의로 시작하겠습니다.

keycode.hpp 파일에는 프로젝트에서 사용하는 대부분의 상수가 정의되어 있습니다. 키에 해당하는 키코드, 특정 키보드 제품의 모델넘버 등입니다.

ListHookedKeyboard.cpp, ListHookedPointing.cpp 에는 PS/2 키보드 사용자 및 특정 키보드 커널 익스텐션을 사용하는 키보드들(로지텍등등...)에서 KeyRemap4Macbook으로 리매핑이 되지 않을경우 수정할 필요가 있습니다.  이전글에서 설명한 것처럼 자신의 키보드가 어떤 클래스를 상속받아서 구현이 되는지 알아야 합니다. 이는 ioreg나 IORegistry expolrer등을 이용하면 확인가능합니다. 필요한 분이 아니면 수정하지 않아도 됩니다. 추가로 third party키보드란 옵션이 있는데 위 파일의 소스코드에서처럼 목록에 없는 클래스의 경우 3rd party keyboard가 됩니다.


server.cpp 파일은 KeyRemap4Macbook이 어느 프로그램에서 작동 할 지, 하지 말 것인지를 결정하기 위해 현재 포커스를 가지는 어플리케이션이 무엇인지를 판단하게 해 주는 부분이 들어있습니다. 191라인의 do_ActiveApplicationInfo 라는 함수를 들여다 보면 app에서 얻어온 이름을 가지고 비교한 후 ./src/core/bridge/bridge.hpp 에 미리 정의된  어플리케이션 그룹의 상수를 세팅하게 됩니다. 만약 자신이 원하는 어플리케이션 그룹이 필요하거나 어플리케이션의 인식 스트링이 변한다면 수정이 필요합니다. 저의 경우 VirtualBox를 추가하고, Parallels desktop의 변경된 인식 스트링을 적용하였습니다. 만약 본인이 추가할 어플리케이션의 인식 스트링을 모르겠다면 ./util/getActiveApplication 에  터미널로 들어가서 make 명령을 내려 getname 이란 바이너리를 만든 후 이를 실행해서 현재 포커스를 가지는 어플리케이션의 인식 스트링을 찍게 만들어 놓고 원하는 어플리케이션으로 포커스를 옮겨 보면 됩니다. 혹은 원하는 어플리케이션의 Info.plist파일에 CFBundleIdentifier를 살펴보아도 됩니다. ( http://x86osx.com/bbs/view.php?id=freeboard&no=16458 )

RemapUtil.cpp 파일은 ./src/core/kext/remap.cpp 파일에서 공통적으로 사용하는 리맵핑 기능들을 모아서 만든 유틸리티 펑션들이 모인 파일입니다. 일반화 시켜서 적용할 기능기 생성 함수가 있다면 여기에 추가하고 ./src/core/kext/remap.cpp 에서 사용해주면 됩니다. 그리고 여기서 추가로 하나 더 살펴볼 부분이 있는데 isInternalKeyboard 란 함수입니다. 이 녀석의 이름과 같이 환경설정 메뉴에서 'internal 키보드만 리매핑하기'혹은 'external...' 의 설정을 하면 이 함수에서 키보드의 모델넘버를 살펴보고 리맵할지 말지를 결정합니다. 여기에 저는  PS/2 키보드를 맥북 키보드들과 함계 내장키보드로 작동하게 하기 위해서 2개의 상수값을 추가했습니다. 상수값은 이전에 설명한  keycode.hpp 에 정의하면 됩니다.

remap.cpp은 수정하지는 않았지만 리매핑시 핵심 파일입니다. 여기에 모든 매핑 함수가 정의되고 키가 눌릴때마다 함수가 실행되서 지정된 키값으로 변경하는 함수들을 호출하는 시발점이 됩니다. 일반적인 키매핑 기능이 아닌 독자적인 기능이 필요하다면 이곳에 자신이 직접 함수를 만들어 추가하고 특정 매핑을 수행하게 코딩하면 됩니다. cHicKen님의 5.1.0버전에는 여기에서 모든 코드를 수정했으니 참고가 될 껍니다.

checkbox.xml 파일은 아마도 원하는대로 리맵을 하기 위해서 여러분이 가장 많이 수정할 파일입니다. 또한 여기에서 설정한 값이 환경설정에 나타나는 키맵 메뉴를 정의합니다. 메뉴목록에만 나오게 그치는 것이 아니라 대부분의 리맵핑은 이 파일을 수정하는 것만으로도 해결 할 수 있습니다.  그 이유는 이곳에 자동생성을 위한 태그가 몇개 추가되어 있기 때문입니다.  ./src/core/kext/config/make-code.rb 라는 파일이 이 xml파일에 있는 일부 태그를 읽어서 자동으로 소스코드를 만들어 준 후 remap.cpp 파일에서 include하기 때문에 여러분은 그냥 단순히 c++의 코딩을 하지 않고도 리매핑을 수정 할 수 있습니다.

좀 더 자세한 설명을 위해서 파일를 일부 살펴 보겠습니다.
Quote:            <item>
                  <name>In VMware Fusion, Parallels Desktop, Remote Desktop Connection</name>
                  <sysctl>option.emacsmode_controlAE_vm</sysctl>
                  <only>VIRTUALMACHINE, REMOTEDESKTOPCONNECTION</only>
                  <autogen>--KeyToKey-- KeyCode::A, VK_CONTROL, KeyCode::HOME
                  <autogen>--KeyToKey-- KeyCode::E, VK_CONTROL, KeyCode::END
            </item>

위 아이템은 VM이나 RDC에서 포커스가 맞추어 졌을때 Ctrl-A 키를 Home 키로, Ctrl-E키를 END 키로 리매핑하는 부분입니다.

하나의 리매핑 목록은  리스트 <list>라는 태그로 묶어지고 하나의 리매핑 목록은 하나의 <iterm>태그로 묶입니다. 그리고 <name>태그는 환경설정에서 나타낼 목록이름이고 <sysctl>은 sysctl로 접근하기 위한 키값이자 프로그램에서 해당 옵션을 켰는지 껐는지를 살필 하나의 토글 변수가 됩니다. 그리고 <only>란 태그는 위에서 설명한 지정한 어플리케이션에서만 작동하게 할 때 그룹을 지정해 주는 것입니다. 또한 <not>이란 태그는 <only>의 정반대 역할을 하는 태그가 됩니다.  <autogen> 태그는 실제 c++소스코드로 바뀔 주요 내용으로  앞의 --KeyToKey-- 부분은 make-code.rb 파일이 읽어서 특정 코드로 생성하기 위한 인식자가 되고 나머지는 소스코드에 그대로 들어갈 파라미터 리스트가 됩니다. 이  <autogen> 태그는 위에서처럼 하나의 아이템에 동시에 여러개를 등록할 수 있습니다. 단 하나의 키에 여러 키가 순서대로 발생하게 하려면 언급했더 특수한 함수를 직접 만들어야 합니다.
make-code.rb과 RemapUtil.cpp 파일을 살펴보면 어떤 리매핑 방법이 있는지 정확히 파악이 가능하지만 xml파일을 둘러봐도 대부분의 방식에 대한 실제 사용법을 살펴 볼 수 있습니다. 인식가능한 리맵명령중 자주 사용되는 것으로는 아래가 있습니다.

Quote:--KeyToKey-- : 입력된 키 하나를 다른 키 하나로 대체합니다. 여기 modifier키를 동시에 지정해줄 수 있습니다. 즉 Ctrl-C 를 Cmd-K 처럼 바꾸는게 가능하다는 것입니다.

--KeyOverlaidModifier-- : 지정한 modifer키만 눌리면 특정 함수를 실행해서 원하는 키값이 매핑되게 합니다.
가령 Right Cmd 키가 그냥 눌리면 한영키가 눌린 것으로 작동되게 가능하고 다른 키조합에서는 Cmd키로 작동되게 가능하다는 뜻입니다.
파라미더에 사용되는 상수에 대한 좀 더 자세한 내용은 이미 언급한 keycode.hpp 파일을 보면 모두 나열되어 있으니 참고하면 됩니다. 그리고 사용되는 함수들은 RemapUtil.cpp 에 있으니 참고하세요.


설명이 길고 장황하게 적혀서 읽으시는데 짜증이 나시지 않을까 걱정이 되네요.
한분의 사용자에게라도 조금의 도움이 되었으면 좋겠네요.

위 설명을 이해하시면 자신에게 맞는 리맵을 간단하게 해 줄 수 있습니다.
궁금한 사항은 질문 주시기 바랍니다.

P.S. 올려놓은 소스에서 왜 F16키와 § 키를 한영키와 한자키를 이용해 생성하게 했는가 이유를 물으신다면 이는 한자키를 CapsLock으로 생성하는 VMware와 아예 한영키 한자키를 인식하지 않는 VirtualBox의 상황을 빠져나가기 위한 하나의 트릭이라고 답변해드리고 싶네요. 자신의 좋은 아이디어가 있다면 적용하시고 알려주시면 감사하겠습니다.





Mac OS X Leopard 10.5.8 in Thinkpad X60T 6365-CTO

<Thinkpad X60 tablet>
Core Duo L2400 1.66GHz, 3GB Ram
Seagate 320GB 5400.5 SATA HDD
Intel 82573L Gigabit ethernet adapter
Atheros AR5008 A/B/G/N mini-PCIe wireless adapter
Intel GMA 950 integrated Video card
1400x1050 SXVGA+ with Wacom penabled tablet
Broadcom bluetooth 2.0 & 56KBps CXT Modem
SoundMAX integrated AD1981HD Audio
Ricoh R5C822 SD memory card
Ricoh R5C552 IEEE 1394a
Ricoh RL5c476 II PCMCIA ( Not tested yet )
 
       
의견(코멘트)을 작성하실 수 없습니다. 이유: 권한이 없는 회원레벨

       
Copyright 1999-2017 Zeroboard / skin by DQ'Style

About Us          Terms of Use          Privacy Policy

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
All user-submitted text and content on this website is licensed under a Creative Commons Attribution-Noncommercial 2.5 License in Korea unless otherwise noted.

Copyright © 23,Aug 2005 x86OSx.com 3rd season, All rights reserved.
Creative Commons License    

Session Excuted : 0.000      
Connect Checked : 0.001      
Query Excuted : 0.002      
PHP Excuted : 0.018      
Check Lists : 0.010      
Skins Excuted : 0.023      
Total Excuted Time : 0.044