윈도우 관리자(window manager)는 그래픽 사용자 인터페이스에서 여러 창(window)을 만들고, 표시하고, 옮기고, 크기를 바꾸는 일을 처리한다. 또한 이러한 창 관리 작업과 관련된 입력 이벤트(예: 마우스 클릭)도 처리한다. 이 문제에서는 간단한 윈도우 관리 프로그램 WIMP(WIndow Manager Program)를 구현한다.
WIMP는 1024 × 1024 픽셀 크기의 화면을 제어하며, 화면의 왼쪽 위 픽셀이 (0, 0)이다. x좌표는 화면 왼쪽 끝의 0부터 오른쪽 끝의 1023까지이고, y좌표는 화면 위쪽 끝의 0부터 아래쪽 끝의 1023까지이다. 모든 좌표는 정수이다. 사용자는 마우스를 움직이고 버튼을 눌러 직사각형 모양의 창을 만들고 조작한다. 하나의 창은 서로 겹치지 않는 다음 4개 영역으로 이루어진다.
| 영역 | 위치와 크기 |
|---|---|
| 닫기 상자(Close box) | 창의 왼쪽 위 모서리, 25 × 25 픽셀 |
| 확대 상자(Zoom box) | 창의 오른쪽 위 모서리, 25 × 25 픽셀 |
| 이동 막대(Motion bar) | 창의 맨 위 25픽셀 중 닫기 상자와 확대 상자를 뺀 부분 |
| 데이터 영역(Data area) | 창의 나머지 부분 |
모든 창은 네 영역이 모두 비어 있지 않도록 항상 최소 51 × 26 크기이다. 각 창에는 0부터 시작하는 고유한 정수 식별자가 부여된다(가장 먼저 만든 창의 id가 0, 두 번째가 1, 이런 식이다). 식별자는 재사용하지 않는다.
WIMP는 다음 이벤트를 받는다.
| 이벤트 | 의미 |
|---|---|
| DN x y | 사용자가 위치 (x, y)에서 마우스 버튼을 눌렀다 |
| UP x y | 사용자가 위치 (x, y)에서 마우스 버튼을 뗐다 |
| AT x y | 사용자가 마우스를 위치 (x, y)로 옮겼다 |
| CR l t r b | 왼쪽 l, 위 t, 오른쪽 r, 아래 b 위치로 새 창을 만든다 |
| RE | 모든 창을 뒤에서 앞 순서로 다시 그린다 |
| ZZ | WIMP를 종료한다 |
x, y, l, t, r, b는 모두 화면 범위 안의 음이 아닌 정수이다. CR 이벤트는 항상 올바른 형태의 창을 만든다. 창은 서로 겹칠 수 있으므로, RE 이벤트에서는 뒤(가장 오래전에 맨 앞으로 온 창)에서 앞(가장 최근에 맨 앞으로 온 창) 순서로 다시 그려야 화면에 올바르게 겹쳐 보인다.
일부 창이 겹쳐 있어도 WIMP는 모든 창을 관리해야 한다. 규칙은 다음과 같다.
입력은 한 줄에 이벤트 하나씩, 한 줄 이상으로 이루어진다. ZZ 이벤트는 입력의 끝을 나타낸다. 모든 이벤트는 같은 세션에 속한다.
각 사용자 동작에 대해 그에 해당하는 메시지를 출력한다. RE 이벤트에서는 아래 형식에 따라 모든 창의 위치를 뒤에서 앞 순서로 출력한다.
| 동작 | 메시지 |
|---|---|
| 창 생성 | Created window n at l, t, r, b |
| 창 선택 | Selected window n |
| 창 닫기 | Closed window n |
| 창 이동 | Moved window n to l, t, r, b |
| 창 확대/복원 | Resized window n to l, t, r, b |
| 다시 그리기 | Window n at l, t, r, b |