Saturday, September 30, 2017

Windows 3.1 Shell Replacements

Windows 3.1 시절에 갖고 놀던 Program Manager 대체제 몇 개가 있는데
  1. Silver Wolf Desktop (SWD):맥 OS 분위기가 나게 만드는 것
  2. Workplace Shell (WPS): OS/2처럼 만드는 것
  3. Sparta(?): SWD보다 좀 더 나은 모양
  4. Wayfarer: customizing 지존


Silver Wolf Desktop 실행 화면. 오오 위엄돋는 늑대 오오

프로그램관리자가 최소화되고(작업표시줄이 없던 Windows 3.xx 시절에는 실행중인 프로그램을 최소화된 아이콘으로 표시했기 때문에 바탕화면에는 바로가기라는 것이 있을 수 없었다)
Drag and drop을 받을 수 있는 Print, View, Edit, Trash가 오른쪽 아래에 생긴다.
오른쪽 위에는 드라이브 아이콘들이 생긴다. 당시 맥에는 CD나 디스켓을 넣으면 바탕화면에 표시되는 (놀라운!) 기능이 있었는데 그것을 표현한 것이다. 물론 Windows니까 그런 기능은 없었고 지금의 탐색기처럼 드라이브 나열만 하는 것이지만, 당시의 File Manager에 비하면 엄청나게 좋았다. 지금의 탐색기 수준. 특이한 것은 오른쪽 버튼 사용을 거의 지원하지 않기 때문에 (당시 맥은 마우스 버튼이 1개였으므로...) 그것을 피해가기 위한 꼼수가 쓰이고 있다는 것. 예를 들어 파일 아이콘을 더블클릭하면 (탐색기처럼) 열기/실행이 되지만, 이름 부분을 더블클릭하면 오른쪽클릭->속성 누른 것처럼 파일 속성창이 뜬다.

SWD는 shell replacement 기능뿐 아니라 몇 가지 편의 기능을 더 지원했는데, 연결된 프로그램이 없을 때 기본적으로 실행되는 hex editor라든가, 설치된 프로그램들의 목록을 보는 기능, 바탕화면 배경 바꾸기 기능 같은 것들이 있었다. 제어판 기본 기능에는 browse... 버튼이 없기
참고로 바탕화면은 Windows 3.1에 기본으로 들어 있던 256color.bmp인데, Super VGA 테스트용으로 깔아 둔 것이다.


Workplace Shell은 IBM에서 자사의 OS/2 인터페이스를 Windows용으로 이식한 것이다.
Workplace Shell과 Silver Wolf Desktop의 공존
Drag and drop을 매우 적극적으로 이용하던 shell이었는데(OS/2가 그랬다고 한다), OS/2에 들어 있는 그런 기능들 중 일부만 구현돼 있었다. 팔레트에서 색을 끌어다 창에 바르는 건 할 수 없었다(OS/2에서는 그런 게 됐다고 한다 - 글꼴도 끌어다 막 발랐다고...).
Template 기능이 굉장히 인상적이었는데 Template 폴더에 들어 있는 재료를 끌어다 놓으면 (뭔가가) 붕어빵 만들 듯이 생성되는 것이다. 쓸데없이 휴지통shredder을 여러 개 만들 수 있다. 더 실용적으로는 Data File 템플릿을 끌어서 새 문서를 target 폴더에 만드는 게 되겠지만 Windows 용 짝퉁의 한계인지 바로가기 생성 머신이 되고 말았다. 원래 OS/2의 기능 대로라면 아마도, 현대의 Windows에서 [탐색기 오른쪽 버튼 메뉴 -> 새로 만들기 -> 문서 종류]에 해당하지 않을까 싶다.
Customizing이 (설계 대로라면) 극한으로 가능한데, 폴더 별로 표시하는 글꼴이나 배경 색/그림을 설정할 수 있다.

Sparta는 SWD처럼 맥OS 클론인데 SWD보다 좀 더 깔끔한 대신 (한글 윈도우 기준으로) 훨씬 자주 죽었다(종종 블루스크린). 근데 이건 다운로드 할 수 있는 곳이 없는 듯? Microsoft Edge 나오기 전에 코드명이 Spartan이어서 이제 검색도 잘 안 된다(...)

Wayfarer는 메뉴를 이것저것 커스터마이징할 수 있는 거였는데 이것도 못 찾았다. 설치해 보고 이어서 써야지.

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...