source: Main/trunk/Server/gui.c@ 269

Last change on this file since 269 was 255, checked in by Nishi, on Oct 4, 2024 at 1:08:58 PM

get listdir working [release 2.03E]

  • Property svn:keywords set to Id
File size: 8.1 KB
Line 
1/* $Id: gui.c 255 2024-10-04 04:08:58Z nishi $ */
2
3#include "../config.h"
4
5#include "gui.h"
6#include "tw_server.h"
7
8#include <cm_log.h>
9
10#include <stdio.h>
11#include <windows.h>
12#include <process.h>
13#include <commctrl.h>
14
15HINSTANCE hInst;
16HBRUSH pbtewi_brush;
17HWND logarea;
18HWND button_start;
19HWND button_stop;
20HWND button_about;
21HWND button_reset;
22HWND button_exit;
23HWND status;
24HFONT monospace;
25BOOL tewi_alive;
26BOOL was_starting;
27BOOL exiting;
28BOOL idle;
29extern FILE* logfile;
30extern int running;
31
32#define WINWIDTH(rc) (rc.right - rc.left)
33#define WINHEIGHT(rc) (rc.bottom - rc.top)
34
35int startup(int argc, char** argv);
36
37void ShowBitmapSize(HWND hWnd, HDC hdc, const char* name, int x, int y, int w, int h) {
38 HBITMAP hBitmap = LoadBitmap(hInst, name);
39 BITMAP bmp;
40 HDC hmdc;
41 GetObject(hBitmap, sizeof(bmp), &bmp);
42 hmdc = CreateCompatibleDC(hdc);
43 SelectObject(hmdc, hBitmap);
44 if(w == 0 && h == 0) {
45 StretchBlt(hdc, x, y, bmp.bmWidth, bmp.bmHeight, hmdc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
46 } else {
47 StretchBlt(hdc, x, y, w, h, hmdc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
48 }
49 DeleteDC(hmdc);
50 DeleteObject(hBitmap);
51}
52
53void ShowBitmap(HWND hWnd, HDC hdc, const char* name, int x, int y) { ShowBitmapSize(hWnd, hdc, name, x, y, 0, 0); }
54
55int max = 0;
56void AddLog(const char* str) {
57 HDC hdc;
58 PAINTSTRUCT ps;
59 SIZE sz;
60
61 SendMessage(logarea, LB_ADDSTRING, 0, (LPARAM)str);
62
63 hdc = CreateCompatibleDC(NULL);
64 SelectObject(hdc, monospace);
65 GetTextExtentPoint32(hdc, str, strlen(str), &sz);
66 DeleteDC(hdc);
67
68 if(max < sz.cx) {
69 max = sz.cx;
70 SendMessage(logarea, LB_SETHORIZONTALEXTENT, max, 0);
71 }
72}
73
74LRESULT CALLBACK VersionDialog(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
75 if(msg == WM_COMMAND) {
76 if(LOWORD(wp) == IDOK) EndDialog(hWnd, IDOK);
77 } else if(msg == WM_PAINT) {
78 HDC hdc;
79 PAINTSTRUCT ps;
80 RECT size;
81
82 size.left = size.top = 5;
83 size.right = size.bottom = 32 + 5;
84 MapDialogRect(hWnd, &size);
85
86 hdc = BeginPaint(hWnd, &ps);
87 ShowBitmapSize(hWnd, hdc, "TEWILOGO", size.left, size.top, WINWIDTH(size), WINWIDTH(size));
88 EndPaint(hWnd, &ps);
89 } else if(msg == WM_CTLCOLORDLG || msg == WM_CTLCOLORSTATIC) {
90 HDC dc = (HDC)wp;
91 SetBkMode(dc, TRANSPARENT);
92 return (LRESULT)GetSysColorBrush(COLOR_MENU);
93 } else {
94 return FALSE;
95 }
96 return TRUE;
97}
98
99void tewi_thread(void* ptr) {
100 int st = startup(0, NULL);
101 was_starting = TRUE;
102 if(st == -1) {
103 tewi_alive = TRUE;
104 idle = FALSE;
105 } else {
106 cm_force_log("Config error");
107 idle = FALSE;
108 _endthread();
109 }
110 running = 1;
111 tw_server_loop();
112 tewi_alive = FALSE;
113 was_starting = TRUE;
114 idle = FALSE;
115 _endthread();
116}
117
118void StartTewi(void) {
119 EnableWindow(button_start, FALSE);
120 EnableWindow(button_stop, FALSE);
121 _beginthread(tewi_thread, 0, NULL);
122}
123
124void StopTewi(void) {
125 EnableWindow(button_start, FALSE);
126 EnableWindow(button_stop, FALSE);
127 running = 0;
128}
129
130LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
131 if(msg == WM_COMMAND) {
132 int trig = LOWORD(wp);
133 int ev = HIWORD(wp);
134 if(trig == GUI_BUTTON_ABOUT) {
135 if(ev == BN_CLICKED) {
136 DialogBox(hInst, "VERSIONDLG", hWnd, (DLGPROC)VersionDialog);
137 }
138 } else if(trig == GUI_BUTTON_START) {
139 if(ev == BN_CLICKED) {
140 SendMessage(status, SB_SETTEXT, 0, (LPARAM) "Starting Tewi HTTPd");
141 StartTewi();
142 }
143 } else if(trig == GUI_BUTTON_STOP) {
144 if(ev == BN_CLICKED) {
145 SendMessage(status, SB_SETTEXT, 0, (LPARAM) "Stopping Tewi HTTPd");
146 StopTewi();
147 }
148 } else if(trig == GUI_BUTTON_RESET) {
149 if(ev == BN_CLICKED) {
150 SendMessage(logarea, LB_RESETCONTENT, 0, 0);
151 max = 0;
152 SendMessage(logarea, LB_SETHORIZONTALEXTENT, max, 0);
153 }
154 } else if(trig == GUI_BUTTON_EXIT) {
155 if(ev == BN_CLICKED) {
156 if(tewi_alive) {
157 SendMessage(status, SB_SETTEXT, 0, (LPARAM) "Stopping Tewi HTTPd");
158 StopTewi();
159 exiting = TRUE;
160 } else {
161 SendMessage(hWnd, WM_CLOSE, 0, 0);
162 }
163 }
164 } else if(trig == GUI_LOG) {
165 }
166 } else if(msg == WM_CLOSE) {
167 DestroyWindow(hWnd);
168 } else if(msg == WM_DESTROY) {
169 DeleteObject(pbtewi_brush);
170 PostQuitMessage(0);
171 } else if(msg == WM_CREATE) {
172 RECT rc, src;
173 GetClientRect(hWnd, &rc);
174
175 InitCommonControls();
176
177 monospace = (HFONT)GetStockObject(SYSTEM_FIXED_FONT);
178
179 status = CreateStatusWindow(WS_CHILD | WS_VISIBLE | CCS_BOTTOM, NULL, hWnd, GUI_STATUS);
180 SendMessage(status, SB_SIMPLE, 0, 0);
181 SendMessage(status, SB_SETTEXT, 0, (LPARAM) "Welcome to Tewi HTTPd");
182 SendMessage(status, SB_GETRECT, 0, (LPARAM)&src);
183
184 pbtewi_brush = CreateSolidBrush(RGB(0xf7, 0xc9, 0xf3));
185 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);
186 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);
187 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);
188 button_reset = CreateWindow("BUTTON", "&Reset", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, WINWIDTH(rc) - 100, WINHEIGHT(rc) - WINHEIGHT(src) - 20 - 20, 100, 20, hWnd, (HMENU)GUI_BUTTON_RESET, hInst, NULL);
189 button_exit = 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);
190 logarea = CreateWindow("LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LBS_NOINTEGRALHEIGHT | LBS_NOSEL, 0, 40, WINWIDTH(rc) - 100, WINHEIGHT(rc) - 40 - WINHEIGHT(src), hWnd, (HMENU)GUI_LOG, hInst, NULL);
191
192 SendMessage(logarea, WM_SETFONT, (WPARAM)monospace, TRUE);
193
194 SetTimer(hWnd, TIMER_WATCH_TEWI, 100, NULL);
195 } else if(msg == WM_TIMER) {
196 if(wp == TIMER_WATCH_TEWI) {
197 if(idle) {
198 } else if(tewi_alive) {
199 if(was_starting) {
200 was_starting = FALSE;
201 SendMessage(status, SB_SETTEXT, 0, (LPARAM) "Started Tewi HTTPd");
202 }
203 EnableWindow(button_start, FALSE);
204 EnableWindow(button_stop, TRUE);
205 idle = TRUE;
206 } else {
207 if(was_starting) {
208 was_starting = FALSE;
209 SendMessage(status, SB_SETTEXT, 0, (LPARAM) "Stopped Tewi HTTPd");
210 }
211 EnableWindow(button_start, TRUE);
212 EnableWindow(button_stop, FALSE);
213 if(exiting) {
214 KillTimer(hWnd, TIMER_WATCH_TEWI);
215 SendMessage(hWnd, WM_CLOSE, 0, 0);
216 }
217 idle = TRUE;
218 }
219 }
220 } else if(msg == WM_PAINT) {
221 HDC hdc;
222 PAINTSTRUCT ps;
223 RECT rc;
224 RECT fill;
225
226 GetClientRect(hWnd, &rc);
227 hdc = BeginPaint(hWnd, &ps);
228 SetRect(&fill, 0, 0, WINWIDTH(rc), 40);
229 FillRect(hdc, &fill, pbtewi_brush);
230 ShowBitmap(hWnd, hdc, "PBTEWI", 0, 0);
231 EndPaint(hWnd, &ps);
232 } else {
233 return DefWindowProc(hWnd, msg, wp, lp);
234 }
235 return 0;
236}
237
238BOOL InitApp(void) {
239 WNDCLASSEX wc;
240 wc.cbSize = sizeof(WNDCLASSEX);
241 wc.style = CS_HREDRAW | CS_VREDRAW;
242 wc.lpfnWndProc = WndProc;
243 wc.cbClsExtra = 0;
244 wc.cbWndExtra = 0;
245 wc.hInstance = hInst;
246 wc.hIcon = LoadIcon(hInst, "TEWI");
247 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
248 wc.hbrBackground = GetSysColorBrush(COLOR_MENU);
249 wc.lpszMenuName = NULL;
250 wc.lpszClassName = "tewihttpd";
251 wc.hIconSm = LoadIcon(hInst, "TEWI");
252 return RegisterClassEx(&wc);
253}
254
255BOOL InitWindow(int nCmdShow) {
256 HWND hWnd;
257 RECT deskrc, rc;
258 HWND hDeskWnd = GetDesktopWindow();
259 GetWindowRect(hDeskWnd, &deskrc);
260 hWnd = CreateWindow("tewihttpd", "Tewi HTTPd", (WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME) ^ WS_MAXIMIZEBOX, 0, 0, 600, 400, NULL, 0, hInst, NULL);
261
262 if(!hWnd) {
263 return FALSE;
264 }
265 GetWindowRect(hWnd, &rc);
266 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);
267 ShowWindow(hWnd, nCmdShow);
268 UpdateWindow(hWnd);
269 return TRUE;
270}
271
272int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) {
273 MSG msg;
274 BOOL bret;
275 hInst = hCurInst;
276 tewi_alive = FALSE;
277 was_starting = FALSE;
278 exiting = FALSE;
279 idle = TRUE;
280 logfile = stderr;
281 if(!InitApp()) {
282 return FALSE;
283 }
284 if(!InitWindow(nCmdShow)) {
285 return FALSE;
286 }
287
288 while((bret = GetMessage(&msg, NULL, 0, 0)) != 0) {
289 if(bret == -1) {
290 break;
291 } else {
292 TranslateMessage(&msg);
293 DispatchMessage(&msg);
294 }
295 }
296 return (int)msg.wParam;
297}
Note: See TracBrowser for help on using the repository browser.