WIMP: 윈도우 관리 프로그램

시간 제한1초메모리 제한128 MB

문제

윈도우 관리자(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모든 창을 뒤에서 앞 순서로 다시 그린다
ZZWIMP를 종료한다

x, y, l, t, r, b는 모두 화면 범위 안의 음이 아닌 정수이다. CR 이벤트는 항상 올바른 형태의 창을 만든다. 창은 서로 겹칠 수 있으므로, RE 이벤트에서는 뒤(가장 오래전에 맨 앞으로 온 창)에서 앞(가장 최근에 맨 앞으로 온 창) 순서로 다시 그려야 화면에 올바르게 겹쳐 보인다.

일부 창이 겹쳐 있어도 WIMP는 모든 창을 관리해야 한다. 규칙은 다음과 같다.

  1. 새로 만든 창은 항상 완전히 보인다(다른 모든 창보다 '맨 앞'에 있다).
  2. 어떤 창의 보이는 부분에서 DN 이벤트가 일어나면 그 창이 선택되어 맨 앞으로 오고, 창 전체가 보이게 된다. 어떤 창의 보이는 부분에도 해당하지 않는 DN 이벤트는 현재 선택된 창에 영향을 주지 않는다.
  3. 창을 닫거나 확대하려면 알맞은 상자 안에서 DN 이벤트와 그에 이어지는 UP 이벤트가 필요하다. 그 사이에 AT 이벤트가 하나 이상 있을 수 있다. DN과 UP은 같은 상자 안에서 일어나야 하지만, 정확히 같은 위치일 필요는 없다.
  4. 창을 닫으면 화면에서 사라진다.
  5. 확대는 토글이다. 창이 화면 전체를 차지하게 하거나, 원래 크기로 되돌린다.
  6. 이동 막대에서 DN 이벤트가 일어나면 창을 옮길 수 있다. UP 이벤트로 이동이 끝난다. 창은 DN과 UP 사이에 마우스가 움직인 거리와 방향만큼 이동한다.
  7. 창을 옮기는 도중의 AT 이벤트는 창의 현재 위치를 출력해야 한다. 그 밖의 상황에서 일어나는 AT 이벤트는 아무것도 출력하지 않는다.
  8. 화면 전체를 차지한 창은 옮길 수 없다.
  9. 창은 보이는 화면 밖으로 일부가 나갈 수 있다.
  10. AT 이벤트는 아무 때나 일어날 수 있다.

입력

입력은 한 줄에 이벤트 하나씩, 한 줄 이상으로 이루어진다. 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