describug
← 기록

제목표시줄을 없앴더니 닫기 버튼도 같이 사라졌다

띠 하나를 지우는 일인 줄 알았는데, 창을 닫을 방법까지 지워졌습니다.

맥데스크톱앱

Summary

과제
맥에서 운영체제가 그리는 제목표시줄과 앱 헤더가 겹쳐 띠가 두 줄로 보였다.
수단
frameless 로 합쳤다. 그 바람에 숨겨진 신호등 버튼을 창이 뜰 때 되살리고, 윈도우에는 적용하지 않았다.

DETAILED DESCRIPTION

docx2patent 맥 버전에는 띠가 두 줄 있었습니다. 위는 운영체제가 그리는 회색 제목표시줄, 아래는 앱이 그리는 남색 헤더입니다. 같은 걸 두 번 그리고 있는 셈이라 창이 답답해 보였습니다.

없애는 건 한 줄이었다

pywebview에는 frameless 옵션이 있습니다. 운영체제가 그리는 테두리를 안 그리게 하는 설정입니다. 켜면 회색 띠가 사라지고 남색 헤더 하나만 남습니다. 여기까지는 예상대로였습니다.

문제는 그 회색 띠 왼쪽에 신호등 버튼이 얹혀 있었다는 것입니다. 맥 창 왼쪽 위의 빨강·노랑·초록 동그라미 — 닫기·최소화·확대입니다. 띠를 지우니 버튼도 같이 안 보이게 됐습니다. 창을 닫을 수가 없었습니다.

지워진 게 아니라 숨겨진 것이었다

다행히 버튼 자체가 없어진 건 아니었습니다. frameless를 켜도 창의 속성값(닫을 수 있음·최소화할 수 있음)은 그대로 남아 있고, pywebview가 화면에 안 보이게 감춰둔 것뿐이었습니다.

그래서 창이 뜨는 순간 세 버튼을 도로 보이게 했습니다.

여기서 한 번 더 막혔습니다. 창의 모양을 바꾸는 일은 맥에서 메인 스레드에서만 허용됩니다. 프로그램이 여러 일을 동시에 하려고 작업을 여러 갈래로 나눠 도는데, 창을 건드리는 일만은 그중 정해진 한 갈래에서 해야 한다는 규칙입니다. 다른 갈래에서 부르면 그냥 무시되거나 죽습니다. 버튼을 되살리는 코드를 그 갈래로 넘겨서 해결했습니다.

마지막으로 헤더 왼쪽 88픽셀을 비웠습니다. 안 그러면 되살아난 신호등 버튼과 앱 로고가 겹칩니다.

윈도우에는 안 썼다

같은 옵션을 윈도우에서도 켜봤습니다. 여기서는 버튼이 숨겨지는 게 아니라 닫기 버튼까지 진짜로 없어졌습니다. 맥과 윈도우가 창을 그리는 방식이 달라서, 맥에서 통한 되살리기가 윈도우에서는 통하지 않습니다.

그래서 이 설정은 맥에서만 켭니다. 윈도우는 회색 띠를 그대로 둡니다. 양쪽을 똑같이 만들겠다고 윈도우 사용자에게 못 닫는 창을 줄 수는 없었습니다.

남은 것

띠를 합치고 나니 두께도 줄일 수 있어서 52픽셀에서 40픽셀로 낮췄습니다. 카드 테두리와 그림자, 바깥 여백도 걷어내서 창 자체가 앱이 되도록 했습니다.

한 줄짜리 설정인 줄 알았던 게 결국 세 군데를 건드렸습니다. 운영체제가 대신 그려주던 것을 직접 그리겠다고 하면, 그게 대신 해주던 나머지도 같이 떠안게 됩니다.

Troubleshooting

증상
맥에서 frameless 창을 만들었더니 닫기·최소화·확대 버튼이 사라진다
원인
pywebview 가 frameless 창에서 그 버튼들을 숨긴다. 없어진 게 아니라 감춰진 것이다
해결
창이 뜨는 시점(shown)에 버튼을 다시 보이게 한다. 창 모양 변경은 메인 스레드에서만 되므로 메인 큐로 넘긴다
확인
창을 띄웠을 때 왼쪽 위 세 버튼이 보이고 닫기가 동작하면 해결. 윈도우에는 적용하지 않는다 — 거기서는 닫기 버튼이 진짜로 없어진다