Index: trunk/Server/Makefile
===================================================================
--- trunk/Server/Makefile	(revision 243)
+++ trunk/Server/Makefile	(revision 244)
@@ -55,4 +55,13 @@
 	brc32 -r -fo$@ tewi.rc
 
+gui.res: gui.rc gui.h
+	$(WINDRES) gui.rc -O coff -o $@
+
+gui_vc6.res: gui.rc gui.h
+	rc /fo$@ gui.rc
+
+gui_bcc.res: gui.rc gui.h
+	brc32 -r -fo$@ gui.rc
+
 clean:
 	rm -f *.o tewi *.exe *.res *.elf *.sfo *.pbp *.self *.pkg *.obj
Index: trunk/Server/gui.c
===================================================================
--- trunk/Server/gui.c	(revision 244)
+++ trunk/Server/gui.c	(revision 244)
@@ -0,0 +1,224 @@
+/* $Id$ */
+
+#include "../config.h"
+
+#include "gui.h"
+
+#include <windows.h>
+#include <commctrl.h>
+
+HINSTANCE hInst;
+HBRUSH pbtewi_brush;
+HWND logarea;
+HWND button_start;
+HWND button_stop;
+HWND button_about;
+HWND status;
+BOOL tewi_alive;
+BOOL was_starting;
+BOOL exiting;
+
+#define WINWIDTH(rc) (rc.right - rc.left)
+#define WINHEIGHT(rc) (rc.bottom - rc.top)
+
+#define DIALOG_X(n) (HIWORD(GetDialogBaseUnits()) * n)
+#define DIALOG_Y(n) (LOWORD(GetDialogBaseUnits()) * n)
+
+void ShowBitmapSize(HWND hWnd, HDC hdc, const char* name, int x, int y, int w, int h){
+	HBITMAP hBitmap = LoadBitmap(hInst, name);
+	BITMAP bmp;
+	HDC hmdc;
+	GetObject(hBitmap, sizeof(bmp), &bmp);
+	hmdc = CreateCompatibleDC(hdc);
+	SelectObject(hmdc, hBitmap);
+	if(w == 0 && h == 0){
+		StretchBlt(hdc, x, y, bmp.bmWidth, bmp.bmHeight, hmdc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
+	}else{
+		StretchBlt(hdc, x, y, w, h, hmdc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
+	}
+	DeleteDC(hmdc);
+	DeleteObject(hBitmap);
+}
+
+void ShowBitmap(HWND hWnd, HDC hdc, const char* name, int x, int y){
+	ShowBitmapSize(hWnd, hdc, name, x, y, 0, 0);
+}
+
+LRESULT CALLBACK VersionDialog(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
+	if(msg == WM_COMMAND){
+		if(LOWORD(wp) == IDOK) EndDialog(hWnd, IDOK);
+	}else if(msg == WM_PAINT){
+		HDC hdc;
+		PAINTSTRUCT ps;
+		RECT size;
+
+		size.left = size.top = 5;
+		size.right = size.bottom = 32 + 5;
+		MapDialogRect(hWnd, &size);
+
+		hdc = BeginPaint(hWnd, &ps);
+		ShowBitmapSize(hWnd, hdc, "TEWILOGO", size.left, size.top, WINWIDTH(size), WINWIDTH(size));
+		EndPaint(hWnd, &ps);
+	}else{
+		return FALSE;
+	}
+	return TRUE;
+}
+
+void StartTewi(void){
+	was_starting = TRUE;
+}
+
+void StopTewi(void){
+	was_starting = TRUE;
+}
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
+	if(msg == WM_COMMAND){
+		int trig = LOWORD(wp);
+		int ev = HIWORD(wp);
+		if(trig == GUI_BUTTON_ABOUT){
+			if(ev == BN_CLICKED){
+				DialogBox(hInst, "VERSIONDLG", hWnd, VersionDialog);
+			}
+		}else if(trig == GUI_BUTTON_START){
+			if(ev == BN_CLICKED){
+				SendMessage(status, SB_SETTEXT, 0, (LPARAM)"Starting Tewi HTTPd");
+				StartTewi();
+			}
+		}else if(trig == GUI_BUTTON_STOP){
+			if(ev == BN_CLICKED){
+				SendMessage(status, SB_SETTEXT, 0, (LPARAM)"Stopping Tewi HTTPd");
+				StopTewi();
+			}
+		}else if(trig == GUI_BUTTON_EXIT){
+			if(ev == BN_CLICKED){
+				if(tewi_alive){
+					SendMessage(status, SB_SETTEXT, 0, (LPARAM)"Stopping Tewi HTTPd");
+					StopTewi();
+					exiting = TRUE;
+				}else{
+					SendMessage(hWnd, WM_CLOSE, 0, 0);
+				}
+			}
+		}else if(trig == GUI_LOG){
+		}
+	}else if(msg == WM_CLOSE){
+		DestroyWindow(hWnd);
+	}else if(msg == WM_DESTROY){
+		DeleteObject(pbtewi_brush);
+		PostQuitMessage(0);
+	}else if(msg == WM_CREATE){
+		RECT rc, src;
+		GetClientRect(hWnd, &rc);
+
+		InitCommonControls();
+
+		status = CreateStatusWindow(WS_CHILD | WS_VISIBLE | CCS_BOTTOM, NULL, hWnd, GUI_STATUS);
+		SendMessage(status, SB_SIMPLE, 0, 0);
+		SendMessage(status, SB_SETTEXT, 0, (LPARAM)"Welcome to Tewi HTTPd");
+		SendMessage(status, SB_GETRECT, 0, (LPARAM)&src);
+
+		pbtewi_brush = CreateSolidBrush(RGB(0xf7, 0xc9, 0xf3));
+		button_start = CreateWindow("BUTTON", "&Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, WINWIDTH(rc) - 100, 20 * 0, 100, 20, hWnd, (HMENU)GUI_BUTTON_START, hInst, NULL);
+		button_stop = CreateWindow("BUTTON", "S&top", WS_CHILD | WS_VISIBLE | WS_DISABLED | BS_PUSHBUTTON, WINWIDTH(rc) - 100, 20 * 1, 100, 20, hWnd, (HMENU)GUI_BUTTON_STOP, hInst, NULL);
+		button_about = CreateWindow("BUTTON", "&About", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, WINWIDTH(rc) - 100, 20 * 2, 100, 20, hWnd, (HMENU)GUI_BUTTON_ABOUT, hInst, NULL);
+		button_about = CreateWindow("BUTTON", "E&xit", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, WINWIDTH(rc) - 100, WINHEIGHT(rc) - WINHEIGHT(src) - 20, 100, 20, hWnd, (HMENU)GUI_BUTTON_EXIT, hInst, NULL);
+		logarea = CreateWindow("LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, 0, 40, WINWIDTH(rc) - 100, WINHEIGHT(rc) - 40 - WINHEIGHT(src), hWnd, (HMENU)GUI_LOG, hInst, NULL);
+		SetTimer(hWnd, TIMER_WATCH_TEWI, 100, NULL);
+	}else if(msg == WM_TIMER){
+		if(wp == TIMER_WATCH_TEWI){
+			if(tewi_alive){
+				if(was_starting){
+					was_starting = FALSE;
+					SendMessage(status, SB_SETTEXT, 0, (LPARAM)"Started Tewi HTTPd");
+				}
+				EnableWindow(button_start, FALSE);
+				EnableWindow(button_stop, TRUE);
+			}else{
+				if(was_starting){
+					was_starting = FALSE;
+					SendMessage(status, SB_SETTEXT, 0, (LPARAM)"Stopped Tewi HTTPd");
+				}
+				EnableWindow(button_start, TRUE);
+				EnableWindow(button_stop, FALSE);
+				if(exiting){
+					KillTimer(hWnd, TIMER_WATCH_TEWI);
+					SendMessage(hWnd, WM_CLOSE, 0, 0);
+				}
+			}
+		}
+	}else if(msg == WM_PAINT){
+		HDC hdc;
+		PAINTSTRUCT ps;
+		RECT rc;
+		RECT fill;
+
+		GetClientRect(hWnd, &rc);
+		hdc = BeginPaint(hWnd, &ps);
+		SetRect(&fill, 0, 0, WINWIDTH(rc), 40);
+		FillRect(hdc, &fill, pbtewi_brush);
+		ShowBitmap(hWnd, hdc, "PBTEWI", 0, 0);
+		EndPaint(hWnd, &ps);
+	}else{
+		return DefWindowProc(hWnd, msg, wp, lp);
+	}
+	return 0;
+}
+
+BOOL InitApp(void){
+	WNDCLASS wc;
+	wc.style = CS_HREDRAW | CS_VREDRAW;
+	wc.lpfnWndProc = WndProc;
+	wc.cbClsExtra = 0;
+	wc.cbWndExtra = 0;
+	wc.hInstance = hInst;
+	wc.hIcon = LoadIcon(hInst, "TEWI");
+	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+	wc.hbrBackground = GetSysColorBrush(COLOR_MENU);
+	wc.lpszMenuName = NULL;
+	wc.lpszClassName = "tewihttpd";
+	return RegisterClass(&wc);
+}
+
+BOOL InitWindow(int nCmdShow){
+	HWND hWnd;
+	RECT deskrc, rc;
+	HWND hDeskWnd = GetDesktopWindow();
+	GetWindowRect(hDeskWnd, &deskrc);
+	hWnd = CreateWindow("tewihttpd", "Tewi HTTPd", (WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME) ^ WS_MAXIMIZEBOX, 0, 0, 600, 200, NULL, 0, hInst, NULL);
+
+	if(!hWnd){
+		return FALSE;
+	}
+	GetWindowRect(hWnd, &rc);
+	SetWindowPos(hWnd, HWND_TOP, (deskrc.right - (rc.right - rc.left)) / 2, (deskrc.bottom - (rc.bottom - rc.top)) / 2, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);
+	ShowWindow(hWnd, nCmdShow);
+	UpdateWindow(hWnd);
+	return TRUE;
+}
+
+int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow){
+	MSG msg;
+	BOOL bret;
+	hInst = hCurInst;
+	tewi_alive = FALSE;
+	was_starting = FALSE;
+	exiting = FALSE;
+	if(!InitApp()){
+		return FALSE;
+	}
+	if(!InitWindow(nCmdShow)){
+		return FALSE;
+	}
+
+	while((bret = GetMessage(&msg, NULL, 0, 0)) != 0){
+		if(bret == -1) {
+			break;
+		} else {
+			TranslateMessage(&msg);
+			DispatchMessage(&msg);
+		}
+	}
+	return (int)msg.wParam;
+}
Index: trunk/Server/gui.h
===================================================================
--- trunk/Server/gui.h	(revision 244)
+++ trunk/Server/gui.h	(revision 244)
@@ -0,0 +1,20 @@
+/* $Id$ */
+
+#ifndef __GUI_H__
+#define __GUI_H__
+
+#define GUI_HELP_ABOUT 100
+#define GUI_BUTTON_START 101
+#define GUI_BUTTON_STOP 102
+#define GUI_BUTTON_ABOUT 103
+#define GUI_STATUS 104
+#define GUI_TEWI_ICON 105
+#define GUI_TEWI_NAME 106
+#define GUI_TEWI_ORIGINAL 107
+#define GUI_TEWI_DATE 108
+#define GUI_LOG 109
+#define GUI_BUTTON_EXIT 104
+
+#define TIMER_WATCH_TEWI 1000
+
+#endif
Index: trunk/Server/gui.rc
===================================================================
--- trunk/Server/gui.rc	(revision 244)
+++ trunk/Server/gui.rc	(revision 244)
@@ -0,0 +1,18 @@
+/* $Id$ */
+
+#include <windows.h>
+#include "gui.h"
+#include "tw_version.h"
+
+PBTEWI BITMAP "../Binary/pbtewi.bmp"
+TEWILOGO BITMAP "../Binary/tewi.bmp"
+
+VERSIONDLG DIALOG 0, 0, 200, 50
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Version Information"
+{
+	LTEXT "Tewi HTTPd version " TW_VERSION, GUI_TEWI_NAME, 42, 5, 192, 50
+	LTEXT "Original by Nishi <nishi@nishi.boats>", GUI_TEWI_ORIGINAL, 42, 5 + 8, 192, 50
+	LTEXT "Compilation date: " __DATE__ " " __TIME__, GUI_TEWI_DATE, 42, 5 + 8 + 8, 192, 50
+	DEFPUSHBUTTON "&OK", IDOK, 75, 35, 50, 10
+}
Index: trunk/Server/main.c
===================================================================
--- trunk/Server/main.c	(revision 243)
+++ trunk/Server/main.c	(revision 244)
@@ -8,4 +8,5 @@
 
 #pragma resource "tewi_bcc.res"
+#pragma resource "gui_bcc.res"
 
 #endif
@@ -31,5 +32,5 @@
 #include "tw_version.h"
 
-#if defined(__MINGW32__) || defined(_MSC_VER) || defined(__BORLANDC__)
+#if defined(__MINGW32__) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__)
 #include <windows.h>
 #endif
@@ -525,4 +526,5 @@
 #endif
 
+#if !defined(BUILD_GUI) || !(defined(__MINGW32__) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__))
 int main(int argc, char** argv) {
 	int st;
@@ -705,4 +707,5 @@
 	return 0;
 }
+#endif
 
 int startup(int argc, char** argv) {
Index: trunk/Server/tewi.rc
===================================================================
--- trunk/Server/tewi.rc	(revision 243)
+++ trunk/Server/tewi.rc	(revision 244)
@@ -3,5 +3,5 @@
 #include "../config.h"
 
-id ICON "../Binary/tewi.ico"
+TEWI ICON "../Binary/tewi.ico"
 VS_VERSION_INFO VERSIONINFO
 	FILEVERSION 1,0,0,0
