머스크 5단계 분석 — RustDesk 모바일 Toolbar 단순화
"The best part is no part. The best process is no process."
— 30+ 개 키를 가진 KeyHelpTools 를 8개로, state 3개를 0개로, 코드 150줄을 30줄로 줄인 결과를 5단계로 추적.
Phase 1Question — 가정 의심
사용자가 제시한 요구의 가정 3개를 흔들었다. 각각 "거짓이면?" 으로 영향 분석.
| # | 가정 | 출처 | 거짓이면? | 사용자 결정 |
|---|---|---|---|---|
| 1 | "Esc·Enter·방향키·Cmd+C/V 8개로 충분" | 사용자 직관 | Tab(폼 이동)·Ctrl+Z(undo)·Cmd+S(저장)·Shift+클릭(다중선택) 등 일상 단축키 불가 | 수용 — 8개 유지 |
| 2 | "modifier 토글(Ctrl/Alt/Shift) 제거 OK" | "사전 정의 콤보로 충분" 추측 | 임의 multi-key 조합(Ctrl+T·Alt+F4·Shift+Tab·Cmd+Q) 완전 불가 | 수용 — 위험 인지 후 진행 |
| 3 | "키보드 닫히면 toolbar 도 hide" | 화면 가림 회피 | 마우스 모드(터치=드래그)에서 Esc/방향키 입력 불가 | 수용 — 키보드 표시 시만 |
가정 #2 가 가장 위험. 그러나 사용자가 의식적으로 위험을 인지하고 수용 (Phase 1 dialogue 결과). Cmd+C/V 외의 단축키 필요 시 별도 입력 방법 (BT 키보드 등) 가정.
Phase 2Delete — 삭제 후보 22개 / 실제 삭제 22개
10% 룰 통과 — 단 한 항목도 되돌릴 가능성 없음. 모두 진짜 불필요.
삭제 대상 (22개)
Ctrl
Alt
Shift
Cmd/Win
Fn 토글
📌 pin
⋯ more 토글
F1-F12 (12개)
Tab
Home
End
Ins
Del
PgUp
PgDn
PrtScr
ScrollLock
Pause
Menu
Cmd+S
state·조건 삭제 (5개)
bool _fn | F1-F12 펼침 토글 — 펼침 자체 제거 → 불필요 |
bool _more | more 펼침 토글 — more 자체 제거 → 불필요 |
bool _pin | 고정 토글 — keyboardVisible 조건이 대체 |
hasModifierOn | modifier 활성 계산 — modifier 자체 제거 → 불필요 |
requestShow | 외부 강제 표시 — 단순 표시 조건만 사용 |
유지 (8개 키)
Esc
Enter
←
↑
↓
→
Cmd+C / Ctrl+C
Cmd+V / Ctrl+V
Phase 3Simplify — 숫자로 검증
키 개수
30+ → 8
−73%
state 변수
3 → 0
−100%
조건 분기
3 → 1
−67%
코드 라인
150 → 30
−80%
화면 가림
3줄 → 1줄
−67%
위치
상단 → 키보드 위
⑦ 패턴
코드 변경 위치
flutter/lib/mobile/pages/remote_page.dart line 887-1052 — _KeyHelpToolsState.build() 메서드 통째로 교체.
새 build() — 30줄
@override
Widget build(BuildContext context) {
// [Custom ⑦] 키보드 표시 시에만 toolbar 노출
if (!widget.keyboardIsVisible) {
gFFI.cursorModel
.keyHelpToolsVisibilityChanged(null, widget.keyboardIsVisible);
return Offstage();
}
final size = MediaQuery.of(context).size;
final pi = gFFI.ffiModel.pi;
final isMac = pi.platform == kPeerPlatformMacOS;
// [Custom ⑦] 8개 키만 유지
final keys = <Widget>[
wrap('Esc', () => inputModel.inputKey('VK_ESCAPE')),
wrap('Enter', () => inputModel.inputKey('VK_ENTER')),
wrap('', () => inputModel.inputKey('VK_LEFT'),
icon: Icons.keyboard_arrow_left),
wrap('', () => inputModel.inputKey('VK_UP'),
icon: Icons.keyboard_arrow_up),
wrap('', () => inputModel.inputKey('VK_DOWN'),
icon: Icons.keyboard_arrow_down),
wrap('', () => inputModel.inputKey('VK_RIGHT'),
icon: Icons.keyboard_arrow_right),
wrap(isMac ? 'Cmd+C' : 'Ctrl+C', () => sendPrompt(isMac, 'VK_C')),
wrap(isMac ? 'Cmd+V' : 'Ctrl+V', () => sendPrompt(isMac, 'VK_V')),
];
final space = size.width > 320 ? 4.0 : 2.0;
Future.delayed(Duration(milliseconds: 500), () => _updateRect());
return Container(
key: _key,
color: Color(0xAA000000),
padding: EdgeInsets.symmetric(vertical: 4),
child: Wrap(
spacing: space, runSpacing: space,
alignment: WrapAlignment.center,
children: keys,
),
);
}
부모 Stack 의 Positioned (이미 적용됨)
Positioned(
left: 0, right: 0,
bottom: keyboardIsVisible
? MediaQuery.of(context).viewInsets.bottom
: 0,
child: KeyHelpTools(
keyboardIsVisible: keyboardIsVisible,
showGestureHelp: _showGestureHelp),
),
Phase 4Accelerate — 사이클 시간
| 흐름 | 변경 전 단계 | 변경 후 단계 |
|---|---|---|
| Esc 입력 | 3 — more 토글 → Esc 위치 찾기 → 탭 | 1 — 즉시 탭 |
| Cmd+C | 3 — more 토글 → Cmd+C 위치 → 탭 | 1 — 즉시 탭 |
| ↑ 방향키 | 3 — more 토글 → 방향키 위치 → ↑ 탭 | 1 — 즉시 탭 |
| 학습 비용 | 모드 토글 패턴 학습 (pin/more/Fn 의미) | 0 — 키가 모두 라벨로 노출 |
Phase 5Automate — 아직 금지
flutter_keyboard_visibility 가 이미 키보드 표시 상태 자동 감지를 제공.
추가 자동화 (예: modifier 자동 복원, 자주 쓰는 키 학습) 는 데이터·패턴이 모이기 전에는 의미 없음.
지금은 단순화·가속화의 안정성을 1주 사용해본 후 결정.
실행·검증·롤백
실행 (자동, 진행 중)
flutter build apk --target-platform android-arm64 --releaseadb uninstall com.carriez.flutter_hbbadb install --no-streaming app-release.apkadb shell am start -n com.carriez.flutter_hbb/.MainActivity
검증 시나리오
| # | 시나리오 | 기대 |
|---|---|---|
| 1 | 앱 실행 — connection page | toolbar 안 보임 (키보드 닫힘) |
| 2 | 원격 연결 + 입력 영역 탭 | 키보드 등장 + 키보드 바로 위에 8개 키 1줄 |
| 3 | 키보드 닫기 (back/제스처) | toolbar 도 같이 사라짐 |
| 4 | Esc 탭 → 원격 PC 에서 Esc 동작 | 메뉴 닫기 등 정상 |
| 5 | Cmd+C → 텍스트 복사 | 원격 클립보드에 복사 |
| 6 | 방향키 ↑ → 커서 이동 | 정상 |
롤백
RustDesk fork 의 git 에서 이전 commit (d0d034b) 로 reset 후 재빌드. 또는 git revert HEAD.
알려진 trade-off
| 잃은 것 | 대체 방법 |
|---|---|
| 임의 modifier 조합 (Ctrl+Z, Cmd+S, Shift+Tab, Alt+F4 ...) | BT 키보드 사용 또는 원격 PC 측에서 직접 |
| Tab (폼 이동·자동완성) | 마우스 탭으로 다음 필드 직접 |
| F1-F12 펑션 키 | BT 키보드 또는 화상 키보드 |
| Home/End/PgUp/PgDn | 방향키 길게 누름 또는 마우스 스크롤 |
| PrtScr/ScrollLock/Pause/Menu (Win/Linux) | 거의 안 씀 — 원격에서 직접 |
| 마우스 모드에서 Esc/방향키 입력 | 입력 영역 한 번 탭해 키보드 호출 |