머스크 5단계 분석 — RustDesk 모바일 Toolbar 단순화

2026-05-24 대상: Galaxy Fold 6 사용자 자가용 도구: musk-think (deep)
"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 _fnF1-F12 펼침 토글 — 펼침 자체 제거 → 불필요
bool _moremore 펼침 토글 — more 자체 제거 → 불필요
bool _pin고정 토글 — keyboardVisible 조건이 대체
hasModifierOnmodifier 활성 계산 — 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주 사용해본 후 결정.

실행·검증·롤백

실행 (자동, 진행 중)

  1. flutter build apk --target-platform android-arm64 --release
  2. adb uninstall com.carriez.flutter_hbb
  3. adb install --no-streaming app-release.apk
  4. adb shell am start -n com.carriez.flutter_hbb/.MainActivity

검증 시나리오

#시나리오기대
1앱 실행 — connection pagetoolbar 안 보임 (키보드 닫힘)
2원격 연결 + 입력 영역 탭키보드 등장 + 키보드 바로 위에 8개 키 1줄
3키보드 닫기 (back/제스처)toolbar 도 같이 사라짐
4Esc 탭 → 원격 PC 에서 Esc 동작메뉴 닫기 등 정상
5Cmd+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/방향키 입력입력 영역 한 번 탭해 키보드 호출