Skip to content

fix: 클립보드가 잠깐 바쁠 때 복사·붙여넣기가 조용히 실패하던 것 - #55

Merged
centwon merged 2 commits into
mainfrom
fix/clipboard-busy-retry
Sep 23, 2026
Merged

centwon merged 2 commits into
mainfrom
fix/clipboard-busy-retry

Conversation

@centwon

@centwon centwon commented Sep 23, 2026

Copy link
Copy Markdown
Owner

문제

클립보드 기록(Win+V) 같은 감시 프로그램이 변경 직후 클립보드를 잠깐 연다. 그때 닿은 호출은 CLIPBRD_E_CANT_OPEN(0x800401D0)으로 실패하고, 모든 호출부가 삼킨 채 다음 형식으로 넘어갔다.

  • 붙여넣기: 웹 페이지가 평문으로 붙거나, 아무것도 안 붙음
  • 복사: 조용히 사라짐

가끔 실패하던 ControlFeatureFlagTests.AllowRemoteImagesOnPaste_…PastingHtml…(PR #54에서 보고)의 원인이다.

수정

  • 그 오류만 await로 20 ms × 최대 10회 재시도(RetryWhileClipboardBusyAsync). Thread.Sleep 재시도는 안 된다 — 잠근 쪽이 우리 UI 스레드에 형식 렌더링을 요청하는 중이라 끝까지 안 풀린다(실측).
  • 잘라내기: 복사 시작 → 삭제 → 쓰기 대기(대기 중 입력이 선택을 옮겨 다른 곳을 지우지 않게).
  • 링크 복사 메뉴: 같은 재시도 + 예외 보고(전에는 예외 처리 없음).

검증 (개발 PC, 실제 경합)

붙여넣기 실패 복사 유실
수정 전 9 / 150 18 / 300
sleep 재시도 — 5 / 300
await 재시도(3회 반복) 0 / 450 0 / 900

전체 테스트 3회 887 통과. 계측은 임시 코드라 커밋하지 않았다. 같은 프로세스 스레드로 클립보드를 잡는 결정적 테스트도 시도했지만, 실제 경합과 동작이 달라(읽기가 오류 대신 빈 내용을 돌려줌) 넣지 않았다.

🤖 Generated with Claude Code

centwon and others added 2 commits September 24, 2026 07:33
클립보드를 지켜보는 프로그램(클립보드 기록 등)이 변경 직후 클립보드를 잠깐 연다. 그때 닿은 호출은
CLIPBRD_E_CANT_OPEN(0x800401D0)으로 실패하는데, 모든 호출부가 삼키고 다음 형식으로 넘어갔다 —
HTML이 평문으로 붙거나 아무것도 안 붙고, 복사가 사라졌다.

- 그 오류만 await로 20 ms × 최대 10회 재시도(RetryWhileClipboardBusyAsync). 읽기·쓰기·GetContent 모두.
  sleep 재시도는 안 된다: 잠근 쪽이 우리 UI 스레드에 형식 렌더링을 요청하는 중이라 끝까지 안 풀린다.
- 잘라내기는 복사 시작 → 삭제 → 쓰기 대기 순서(대기 중 입력이 선택을 옮겨 다른 곳을 지우지 않게).
- 링크 복사 메뉴도 같은 재시도 + 예외 보고(전에는 예외 처리 없음).

실측(개발 PC, 실제 경합): 수정 전 붙여넣기 9/150·복사 18/300 실패 → sleep 재시도 복사 5/300 →
await 재시도 3회 반복 붙여넣기 0/450·복사 0/900. 전체 테스트 3회 887 통과.
가끔 실패하던 ControlFeatureFlagTests의 HTML 붙여넣기 테스트의 원인이다. 같은 프로세스 스레드로 클립보드를
잡는 결정적 테스트는 실제 경합과 동작이 달라(읽기가 빈 내용을 돌려줌) 넣지 않았다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@centwon
centwon merged commit ab393e2 into main Sep 23, 2026
2 checks passed
@centwon
centwon deleted the fix/clipboard-busy-retry branch September 23, 2026 22:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant