1 |
/* Tera Term |
2 |
Copyright(C) 1994-1998 T. Teranishi |
3 |
All rights reserved. */ |
4 |
|
5 |
/* TTTEK.DLL, for TEK window */ |
6 |
#include "teraterm.h" |
7 |
#include "tttypes.h" |
8 |
#include "tektypes.h" |
9 |
#include "ttlib.h" |
10 |
#include <stdlib.h> |
11 |
#include <string.h> |
12 |
|
13 |
#include "ttcommon.h" |
14 |
#include "tekesc.h" |
15 |
|
16 |
#include "compat_w95.h" |
17 |
|
18 |
static HANDLE hInst; |
19 |
|
20 |
void FAR PASCAL TEKInit(PTEKVar tk, PTTSet ts) |
21 |
{ |
22 |
int i; |
23 |
|
24 |
tk->MemDC = NULL; |
25 |
tk->HBits = NULL; |
26 |
tk->Pen = NULL; |
27 |
tk->MemPen = NULL; |
28 |
tk->ps = PS_SOLID; |
29 |
tk->BackGround = NULL; |
30 |
tk->MemBackGround = NULL; |
31 |
for (i = 0 ; i <= 3; i++) |
32 |
tk->TEKFont[i] = NULL; |
33 |
tk->ScreenHeight = 0; |
34 |
tk->ScreenWidth = 0; |
35 |
tk->AdjustSize = FALSE; |
36 |
tk->ScaleFont = FALSE; |
37 |
tk->TextSize = 0; |
38 |
|
39 |
memset(&(tk->TEKlf), 0, sizeof(LOGFONT)); |
40 |
tk->TEKlf.lfHeight = ts->TEKFontSize.y; /* Font Height */ |
41 |
tk->TEKlf.lfWidth = ts->TEKFontSize.x; /* Font Width */ |
42 |
tk->TEKlf.lfCharSet = ts->TEKFontCharSet; /* Character Set */ |
43 |
strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), ts->TEKFont, _TRUNCATE); |
44 |
|
45 |
tk->MoveFlag = TRUE; |
46 |
|
47 |
tk->ParseMode = ModeFirst; |
48 |
tk->DispMode = IdAlphaMode; |
49 |
tk->Drawing = FALSE; |
50 |
|
51 |
tk->RubberBand = FALSE; |
52 |
tk->Select = FALSE; |
53 |
tk->ButtonDown = FALSE; |
54 |
|
55 |
tk->GIN = FALSE; |
56 |
tk->CrossHair = FALSE; |
57 |
tk->IgnoreCount = 0; |
58 |
tk->GINX = 0; |
59 |
tk->GINY = 0; |
60 |
|
61 |
tk->GTWidth = 39; |
62 |
tk->GTHeight = 59; |
63 |
tk->GTSpacing = 12; |
64 |
|
65 |
tk->MarkerType = 1; |
66 |
tk->MarkerFont = NULL; |
67 |
tk->MarkerFlag = FALSE; |
68 |
} |
69 |
|
70 |
void ToggleCrossHair(PTEKVar tk, PTTSet ts, BOOL OnFlag) |
71 |
{ |
72 |
HDC DC; |
73 |
HPEN TempPen, OldPen; |
74 |
|
75 |
if (tk->CrossHair==OnFlag) return; |
76 |
DC = GetDC(tk->HWin); |
77 |
TempPen = CreatePen(PS_SOLID, 1, ts->TEKColor[0]); |
78 |
OldPen = SelectObject(DC,TempPen); |
79 |
SetROP2(DC, R2_NOT); |
80 |
MoveToEx(DC,tk->GINX,0,NULL); |
81 |
LineTo(DC,tk->GINX,tk->ScreenHeight-1); |
82 |
MoveToEx(DC,0,tk->GINY,NULL); |
83 |
LineTo(DC,tk->ScreenWidth-1,tk->GINY); |
84 |
SelectObject(DC,OldPen); |
85 |
DeleteObject(TempPen); |
86 |
ReleaseDC(tk->HWin,DC); |
87 |
tk->CrossHair = OnFlag; |
88 |
} |
89 |
|
90 |
void TEKCaretOn(PTEKVar tk, PTTSet ts) |
91 |
{ |
92 |
if (! tk->Active) return; |
93 |
if (tk->DispMode == IdAlphaMode) |
94 |
{ |
95 |
if (ts->CursorShape==IdHCur) |
96 |
SetCaretPos(tk->CaretX, |
97 |
tk->CaretY - CurWidth); |
98 |
else |
99 |
SetCaretPos(tk->CaretX, tk->CaretY-tk->FontHeight); |
100 |
|
101 |
while (tk->CaretStatus > 0) |
102 |
{ |
103 |
ShowCaret(tk->HWin); |
104 |
tk->CaretStatus--; |
105 |
} |
106 |
} |
107 |
} |
108 |
|
109 |
void TEKCaretOff(PTEKVar tk) |
110 |
{ |
111 |
if (! tk->Active) return; |
112 |
if (tk->CaretStatus == 0) |
113 |
{ |
114 |
HideCaret(tk->HWin); |
115 |
tk->CaretStatus++; |
116 |
} |
117 |
} |
118 |
|
119 |
void SwitchRubberBand(PTEKVar tk, PTTSet ts, BOOL OnFlag) |
120 |
{ |
121 |
HDC DC; |
122 |
HPEN TempPen, OldPen; |
123 |
int OldMemRop; |
124 |
HBRUSH OldMemBrush; |
125 |
|
126 |
if (tk->RubberBand==OnFlag) return; |
127 |
|
128 |
TempPen = CreatePen(PS_DOT, 1, ts->TEKColor[0]); |
129 |
DC = GetDC(tk->HWin); |
130 |
SetBkMode(DC,1); |
131 |
SelectObject(DC,GetStockObject(HOLLOW_BRUSH)); |
132 |
OldPen = SelectObject(DC,TempPen); |
133 |
SetROP2(DC, R2_NOT); |
134 |
Rectangle(DC,tk->SelectStart.x,tk->SelectStart.y, |
135 |
tk->SelectEnd.x,tk->SelectEnd.y); |
136 |
SelectObject(DC,OldPen); |
137 |
ReleaseDC(tk->HWin,DC); |
138 |
DeleteObject(TempPen); |
139 |
|
140 |
TempPen = CreatePen(PS_DOT, 1, tk->MemForeColor); |
141 |
OldMemBrush = SelectObject(tk->MemDC,GetStockObject(HOLLOW_BRUSH)); |
142 |
SelectObject(tk->MemDC,TempPen); |
143 |
OldMemRop = SetROP2(tk->MemDC, R2_XORPEN); |
144 |
Rectangle(tk->MemDC,tk->SelectStart.x,tk->SelectStart.y, |
145 |
tk->SelectEnd.x,tk->SelectEnd.y); |
146 |
SelectObject(tk->MemDC,OldMemBrush); |
147 |
SetROP2(tk->MemDC,OldMemRop); |
148 |
SelectObject(tk->MemDC,tk->MemPen); |
149 |
DeleteObject(TempPen); |
150 |
|
151 |
tk->RubberBand = OnFlag; |
152 |
} |
153 |
|
154 |
void FAR PASCAL TEKChangeCaret(PTEKVar tk, PTTSet ts) |
155 |
{ |
156 |
UINT T; |
157 |
|
158 |
if (! tk->Active) return; |
159 |
switch (ts->CursorShape) { |
160 |
case IdHCur: |
161 |
CreateCaret(tk->HWin, 0, tk->FontWidth, CurWidth); |
162 |
break; |
163 |
case IdVCur: |
164 |
CreateCaret(tk->HWin, 0, CurWidth, tk->FontHeight); |
165 |
break; |
166 |
default: |
167 |
CreateCaret(tk->HWin, 0, tk->FontWidth, tk->FontHeight); |
168 |
} |
169 |
tk->CaretStatus = 1; |
170 |
TEKCaretOn(tk,ts); |
171 |
if (ts->NonblinkingCursor!=0) |
172 |
{ |
173 |
T = GetCaretBlinkTime() * 2 / 3; |
174 |
SetTimer(tk->HWin,IdCaretTimer,T,NULL); |
175 |
} |
176 |
} |
177 |
|
178 |
void FAR PASCAL TEKDestroyCaret(PTEKVar tk, PTTSet ts) |
179 |
{ |
180 |
DestroyCaret(); |
181 |
if (ts->NonblinkingCursor!=0) |
182 |
KillTimer(tk->HWin,IdCaretTimer); |
183 |
} |
184 |
|
185 |
void FAR PASCAL TEKResizeWindow(PTEKVar tk, PTTSet ts, int W, int H) |
186 |
{ |
187 |
int i, Height, Width; |
188 |
TEXTMETRIC Metrics; |
189 |
HDC TempDC; |
190 |
HFONT TempOldFont; |
191 |
RECT R; |
192 |
|
193 |
if (tk->Select) |
194 |
SwitchRubberBand(tk, ts, FALSE); |
195 |
tk->Select = FALSE; |
196 |
|
197 |
/* Delete old MemDC */ |
198 |
if (tk->MemDC != NULL) |
199 |
{ |
200 |
SelectObject(tk->MemDC, tk->OldMemFont); |
201 |
SelectObject(tk->MemDC, tk->OldMemBmp); |
202 |
SelectObject(tk->MemDC, tk->OldMemPen); |
203 |
DeleteDC(tk->MemDC); |
204 |
} |
205 |
|
206 |
/* Delete old fonts */ |
207 |
for (i =0; i <= 3; i++) |
208 |
if (tk->TEKFont[i] != NULL) |
209 |
DeleteObject(tk->TEKFont[i]); |
210 |
if (tk->MarkerFont!=NULL) |
211 |
DeleteObject(tk->MarkerFont); |
212 |
|
213 |
/* Delete old bitmap */ |
214 |
if (tk->HBits != NULL) DeleteObject(tk->HBits); |
215 |
|
216 |
/* Delete old pen */ |
217 |
if (tk->Pen != NULL) DeleteObject(tk->Pen); |
218 |
if (tk->MemPen != NULL) DeleteObject(tk->MemPen); |
219 |
|
220 |
/* Delete old brush */ |
221 |
if (tk->BackGround != NULL) DeleteObject(tk->BackGround); |
222 |
if (tk->MemBackGround != NULL) DeleteObject(tk->MemBackGround); |
223 |
|
224 |
/* get DC */ |
225 |
TempDC = GetDC(tk->HWin); |
226 |
tk->MemDC = CreateCompatibleDC(TempDC); |
227 |
|
228 |
/* Create standard size font */ |
229 |
if (tk->ScaleFont) |
230 |
{ |
231 |
tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 35.0); |
232 |
tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 74.0); |
233 |
} |
234 |
|
235 |
tk->TEKlf.lfWeight = FW_NORMAL; |
236 |
tk->TEKlf.lfItalic = 0; |
237 |
tk->TEKlf.lfUnderline = 0; |
238 |
tk->TEKlf.lfStrikeOut = 0; |
239 |
tk->TEKlf.lfOutPrecision = OUT_CHARACTER_PRECIS; |
240 |
tk->TEKlf.lfClipPrecision = CLIP_CHARACTER_PRECIS; |
241 |
tk->TEKlf.lfQuality = DEFAULT_QUALITY; |
242 |
tk->TEKlf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; |
243 |
|
244 |
tk->TEKFont[0] = CreateFontIndirect(&tk->TEKlf); |
245 |
/* Check standard font size */ |
246 |
TempOldFont = SelectObject(TempDC,tk->TEKFont[0]); |
247 |
GetTextMetrics(TempDC, &Metrics); |
248 |
tk->FW[0] = Metrics.tmAveCharWidth; |
249 |
tk->FH[0] = Metrics.tmHeight; |
250 |
|
251 |
if (! tk->ScaleFont) |
252 |
{ |
253 |
tk->ScreenHeight = tk->FH[0]*35; |
254 |
tk->ScreenWidth = tk->FW[0]*74; |
255 |
Width = (int)((float)tk->ScreenHeight / |
256 |
(float)ViewSizeY * (float)ViewSizeX); |
257 |
if (tk->ScreenWidth < Width) |
258 |
tk->ScreenWidth = Width; |
259 |
} |
260 |
|
261 |
Height = tk->TEKlf.lfHeight; |
262 |
Width = tk->TEKlf.lfWidth; |
263 |
|
264 |
/* marker font */ |
265 |
tk->TEKlf.lfCharSet = SYMBOL_CHARSET; |
266 |
strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), "Symbol", _TRUNCATE); |
267 |
tk->MarkerFont = CreateFontIndirect(&tk->TEKlf); |
268 |
tk->TEKlf.lfCharSet = ts->TEKFontCharSet; |
269 |
strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), ts->TEKFont, _TRUNCATE); |
270 |
SelectObject(TempDC,tk->MarkerFont); |
271 |
GetTextMetrics(TempDC, &Metrics); |
272 |
tk->MarkerW = Metrics.tmAveCharWidth; |
273 |
tk->MarkerH = Metrics.tmHeight; |
274 |
|
275 |
/* second font */ |
276 |
tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 38.0); |
277 |
tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 80.0); |
278 |
tk->TEKFont[1] = CreateFontIndirect(&tk->TEKlf); |
279 |
SelectObject(TempDC,tk->TEKFont[1]); |
280 |
GetTextMetrics(TempDC, &Metrics); |
281 |
tk->FW[1] = Metrics.tmAveCharWidth; |
282 |
tk->FH[1] = Metrics.tmHeight; |
283 |
|
284 |
/* third font */ |
285 |
tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 58.0); |
286 |
tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 121.0); |
287 |
tk->TEKFont[2] = CreateFontIndirect(&tk->TEKlf); |
288 |
SelectObject(TempDC,tk->TEKFont[2]); |
289 |
GetTextMetrics(TempDC, &Metrics); |
290 |
tk->FW[2] = Metrics.tmAveCharWidth; |
291 |
tk->FH[2] = Metrics.tmHeight; |
292 |
|
293 |
/* forth font */ |
294 |
tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 64.0); |
295 |
tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 133.0); |
296 |
tk->TEKFont[3] = CreateFontIndirect(&tk->TEKlf); |
297 |
SelectObject(TempDC,tk->TEKFont[3]); |
298 |
GetTextMetrics(TempDC, &Metrics); |
299 |
tk->FW[3] = Metrics.tmAveCharWidth; |
300 |
tk->FH[3] = Metrics.tmHeight; |
301 |
|
302 |
tk->OldMemFont = |
303 |
SelectObject(tk->MemDC,tk->TEKFont[tk->TextSize]); |
304 |
tk->FontWidth = tk->FW[tk->TextSize]; |
305 |
tk->FontHeight = tk->FH[tk->TextSize]; |
306 |
|
307 |
tk->TEKlf.lfHeight = Height; |
308 |
tk->TEKlf.lfWidth = Width; |
309 |
|
310 |
if (ts->TEKColorEmu>0) |
311 |
tk->HBits = |
312 |
CreateCompatibleBitmap(TempDC,tk->ScreenWidth,tk->ScreenHeight); |
313 |
else |
314 |
tk->HBits = |
315 |
CreateBitmap(tk->ScreenWidth, tk->ScreenHeight, 1, 1, NULL); |
316 |
|
317 |
tk->OldMemBmp = SelectObject(tk->MemDC, tk->HBits); |
318 |
|
319 |
tk->TextColor = ts->TEKColor[0]; |
320 |
if (ts->TEKColorEmu>0) |
321 |
{ |
322 |
tk->MemForeColor = ts->TEKColor[0]; |
323 |
tk->MemBackColor = ts->TEKColor[1]; |
324 |
} |
325 |
else { |
326 |
tk->MemForeColor = RGB(0,0,0); |
327 |
tk->MemBackColor = RGB(255,255,255); |
328 |
} |
329 |
tk->MemTextColor = tk->MemForeColor; |
330 |
|
331 |
SetTextColor(tk->MemDC, tk->MemTextColor); |
332 |
SetBkColor(tk->MemDC, tk->MemBackColor); |
333 |
SetBkMode(tk->MemDC, 1); |
334 |
SetTextAlign(tk->MemDC,TA_LEFT | TA_BOTTOM | TA_NOUPDATECP); |
335 |
|
336 |
tk->BackGround = CreateSolidBrush(ts->TEKColor[1]); |
337 |
tk->MemBackGround = CreateSolidBrush(tk->MemBackColor); |
338 |
|
339 |
tk->PenColor = ts->TEKColor[0]; |
340 |
tk->Pen = CreatePen(tk->ps,1,tk->PenColor); |
341 |
|
342 |
tk->MemPenColor = tk->MemForeColor; |
343 |
tk->MemPen = CreatePen(tk->ps,1,tk->MemPenColor); |
344 |
tk->OldMemPen = SelectObject(tk->MemDC, tk->MemPen); |
345 |
|
346 |
SelectObject(TempDC,TempOldFont); |
347 |
ReleaseDC(tk->HWin,TempDC); |
348 |
|
349 |
R.left = 0; |
350 |
R.right = tk->ScreenWidth; |
351 |
R.top = 0; |
352 |
R.bottom = tk->ScreenHeight; |
353 |
FillRect(tk->MemDC,&R,tk->MemBackGround); |
354 |
InvalidateRect(tk->HWin, &R, TRUE); |
355 |
|
356 |
tk->DispMode = IdAlphaMode; |
357 |
tk->HiY = 0; |
358 |
tk->Extra = 0; |
359 |
tk->LoY = 0; |
360 |
tk->HiX = 0; |
361 |
tk->LoX = 0; |
362 |
tk->CaretX = 0; |
363 |
tk->CaretOffset = 0; |
364 |
tk->CaretY = tk->FontHeight; |
365 |
if (tk->Active) TEKChangeCaret(tk,ts); |
366 |
|
367 |
GetClientRect(tk->HWin,&R); |
368 |
Width = W + tk->ScreenWidth - R.right + R.left; |
369 |
Height = H + tk->ScreenHeight - R.bottom + R.top; |
370 |
|
371 |
if ((Width != W) || (Height != H)) |
372 |
{ |
373 |
tk->AdjustSize = TRUE; |
374 |
SetWindowPos(tk->HWin,HWND_TOP,0,0,Width,Height,SWP_NOMOVE); |
375 |
} |
376 |
|
377 |
tk->ScaleFont = FALSE; |
378 |
} |
379 |
|
380 |
int FAR PASCAL TEKParse(PTEKVar tk, PTTSet ts, PComVar cv) |
381 |
{ |
382 |
BOOL f; |
383 |
int c; |
384 |
BYTE b; |
385 |
|
386 |
if (tk->ButtonDown) |
387 |
return 0; |
388 |
|
389 |
tk->ChangeEmu = 0; |
390 |
f = TRUE; |
391 |
|
392 |
do { |
393 |
c = CommRead1Byte(cv,&b); |
394 |
|
395 |
if (c > 0) |
396 |
{ |
397 |
if (tk->IgnoreCount <= 0) |
398 |
{ |
399 |
if (f) |
400 |
{ |
401 |
TEKCaretOff(tk); |
402 |
f = FALSE; |
403 |
if (tk->GIN) ToggleCrossHair(tk,ts,FALSE); |
404 |
if (tk->RubberBand) SwitchRubberBand(tk,ts,FALSE); |
405 |
} |
406 |
|
407 |
switch (tk->ParseMode) { |
408 |
case ModeFirst: |
409 |
ParseFirst(tk,ts,cv,b); |
410 |
break; |
411 |
case ModeEscape: |
412 |
TEKEscape(tk,ts,cv,b); |
413 |
break; |
414 |
case ModeCS: |
415 |
ControlSequence(tk,ts,cv,b); |
416 |
break; |
417 |
case ModeSelectCode: |
418 |
SelectCode(tk,ts,b); |
419 |
break; |
420 |
case Mode2OC: |
421 |
TwoOpCode(tk,ts,cv,b); |
422 |
break; |
423 |
case ModeGT: |
424 |
GraphText(tk,ts,cv,b); |
425 |
break; |
426 |
default: |
427 |
tk->ParseMode = ModeFirst; |
428 |
ParseFirst(tk,ts,cv,b); |
429 |
} |
430 |
} |
431 |
else tk->IgnoreCount--; |
432 |
} |
433 |
} while ((c!=0) && (tk->ChangeEmu==0)); |
434 |
|
435 |
ToggleCrossHair(tk,ts,tk->GIN); |
436 |
if (! f) |
437 |
{ |
438 |
TEKCaretOn(tk,ts); |
439 |
SwitchRubberBand(tk,ts,tk->Select); |
440 |
} |
441 |
|
442 |
if (tk->ChangeEmu > 0) tk->ParseMode = ModeFirst; |
443 |
return (tk->ChangeEmu); |
444 |
} |
445 |
|
446 |
void FAR PASCAL TEKReportGIN(PTEKVar tk, PTTSet ts, PComVar cv, BYTE KeyCode) |
447 |
{ |
448 |
BYTE Code[11]; |
449 |
int X, Y; |
450 |
|
451 |
ToggleCrossHair(tk,ts,FALSE); |
452 |
X = (int)((float)tk->GINX / |
453 |
(float)tk->ScreenWidth * (float)ViewSizeX); |
454 |
Y = (int)((1.0 - (float)(tk->GINY+1) / |
455 |
(float)tk->ScreenHeight) * (float)ViewSizeY); |
456 |
Code[0] = KeyCode; |
457 |
Code[1] = (X >> 7) + 32; |
458 |
Code[2] = ((X >> 2) & 0x1f) + 32; |
459 |
Code[3] = (Y >> 7) + 32; |
460 |
Code[4] = ((Y >> 2) & 0x1f) + 32; |
461 |
Code[5] = 0x0d; |
462 |
tk->GIN = FALSE; |
463 |
ReleaseCapture(); |
464 |
CommBinaryOut(cv, &Code[0],6); |
465 |
tk->IgnoreCount = 6; |
466 |
} |
467 |
|
468 |
void FAR PASCAL TEKPaint |
469 |
(PTEKVar tk, PTTSet ts, HDC PaintDC, PAINTSTRUCT *PaintInfo) |
470 |
{ |
471 |
int X,Y,W,H; |
472 |
|
473 |
if (PaintInfo->fErase) |
474 |
FillRect(PaintDC, &(PaintInfo->rcPaint),tk->BackGround); |
475 |
|
476 |
if (tk->GIN) ToggleCrossHair(tk,ts,FALSE); |
477 |
if (tk->Select) SwitchRubberBand(tk,ts,FALSE); |
478 |
X = PaintInfo->rcPaint.left; |
479 |
Y = PaintInfo->rcPaint.top; |
480 |
W = PaintInfo->rcPaint.right - X; |
481 |
H = PaintInfo->rcPaint.bottom - Y; |
482 |
SetTextColor(PaintDC, ts->TEKColor[0]); |
483 |
SetBkColor(PaintDC, ts->TEKColor[1]); |
484 |
BitBlt(PaintDC,X,Y,W,H,tk->MemDC,X,Y,SRCCOPY); |
485 |
SwitchRubberBand(tk,ts,tk->Select); |
486 |
if (tk->GIN) ToggleCrossHair(tk,ts,TRUE); |
487 |
} |
488 |
|
489 |
void FAR PASCAL TEKWMLButtonDown |
490 |
(PTEKVar tk, PTTSet ts, PComVar cv, POINT pos) |
491 |
{ |
492 |
BYTE b; |
493 |
|
494 |
if (tk->GIN) |
495 |
{ |
496 |
b = ts->GINMouseCode & 0xff; |
497 |
TEKReportGIN(tk,ts,cv,b); |
498 |
return; |
499 |
} |
500 |
|
501 |
if (tk->ButtonDown) return; |
502 |
|
503 |
/* Capture mouse */ |
504 |
SetCapture(tk->HWin); |
505 |
|
506 |
/* Is the position in client area? */ |
507 |
if ((pos.x>=0) && (pos.x < tk->ScreenWidth) && |
508 |
(pos.y>=0) && (pos.y < tk->ScreenHeight)) |
509 |
{ |
510 |
SwitchRubberBand(tk,ts,FALSE); |
511 |
tk->Select = FALSE; |
512 |
|
513 |
tk->SelectStart.x = pos.x; |
514 |
tk->SelectStart.y = pos.y; |
515 |
tk->SelectEnd = tk->SelectStart; |
516 |
tk->ButtonDown = TRUE; |
517 |
} |
518 |
} |
519 |
|
520 |
void FAR PASCAL TEKWMLButtonUp(PTEKVar tk, PTTSet ts) |
521 |
{ |
522 |
int X; |
523 |
|
524 |
ReleaseCapture(); |
525 |
tk->ButtonDown = FALSE; |
526 |
if ((abs(tk->SelectEnd.y - tk->SelectStart.y) > 2) && |
527 |
(abs(tk->SelectEnd.x - tk->SelectStart.x) > 2)) |
528 |
{ |
529 |
if (tk->SelectStart.x > tk->SelectEnd.x) |
530 |
{ |
531 |
X = tk->SelectEnd.x; |
532 |
tk->SelectEnd.x = tk->SelectStart.x; |
533 |
tk->SelectStart.x = X; |
534 |
} |
535 |
if (tk->SelectStart.y > tk->SelectEnd.y) |
536 |
{ |
537 |
X = tk->SelectEnd.y; |
538 |
tk->SelectEnd.y = tk->SelectStart.y; |
539 |
tk->SelectStart.y = X; |
540 |
} |
541 |
tk->Select = TRUE; |
542 |
} |
543 |
else { |
544 |
SwitchRubberBand(tk,ts,FALSE); |
545 |
tk->Select = FALSE; |
546 |
} |
547 |
} |
548 |
|
549 |
void FAR PASCAL TEKWMMouseMove(PTEKVar tk, PTTSet ts, POINT p) |
550 |
{ |
551 |
int X, Y; |
552 |
|
553 |
if ((! tk->ButtonDown) && (! tk->GIN)) return; |
554 |
/* get position */ |
555 |
X = p.x + 1; |
556 |
Y = p.y + 1; |
557 |
|
558 |
/* if out of client area, force into client area */ |
559 |
if (X<0) X = 0; |
560 |
else if (X > tk->ScreenWidth) X = tk->ScreenWidth - 1; |
561 |
if (Y<0) Y = 0; |
562 |
else if (Y > tk->ScreenHeight) Y = tk->ScreenHeight - 1; |
563 |
|
564 |
if (tk->GIN) |
565 |
{ |
566 |
ToggleCrossHair(tk,ts,FALSE); |
567 |
tk->GINX = X; |
568 |
tk->GINY = Y; |
569 |
ToggleCrossHair(tk,ts,TRUE); |
570 |
} |
571 |
else { |
572 |
SwitchRubberBand(tk,ts,FALSE); |
573 |
tk->SelectEnd.x = X + 1; |
574 |
tk->SelectEnd.y = Y + 1; |
575 |
SwitchRubberBand(tk,ts,TRUE); |
576 |
} |
577 |
|
578 |
if (tk->GIN) SetCapture(tk->HWin); |
579 |
} |
580 |
|
581 |
void FAR PASCAL TEKWMSize(PTEKVar tk, PTTSet ts, int W, int H, int cx, int cy) |
582 |
{ |
583 |
int Width, Height; |
584 |
|
585 |
Width = cx; |
586 |
Height = cy; |
587 |
|
588 |
if ((tk->ScreenWidth == Width) && |
589 |
(tk->ScreenHeight == Height)) |
590 |
{ |
591 |
tk->AdjustSize = FALSE; |
592 |
return; |
593 |
} |
594 |
|
595 |
if (tk->AdjustSize) |
596 |
{ // resized by myself |
597 |
Width = W + tk->ScreenWidth - Width; |
598 |
Height = H + tk->ScreenHeight - Height; |
599 |
SetWindowPos(tk->HWin,HWND_TOP,0,0,Width,Height,SWP_NOMOVE); |
600 |
} |
601 |
else { |
602 |
if ((tk->ScreenWidth==0) || // resized |
603 |
(tk->ScreenHeight==0)) return; // during initialization |
604 |
// resized by user |
605 |
tk->ScreenWidth = Width; |
606 |
tk->ScreenHeight = Height; |
607 |
tk->ScaleFont = TRUE; |
608 |
TEKResizeWindow(tk,ts,W,H); |
609 |
} |
610 |
} |
611 |
|
612 |
void CopyToClipboard |
613 |
(PTEKVar tk, PTTSet ts, int x, int y, int Width, int Height) |
614 |
{ |
615 |
HDC CopyDC; |
616 |
HBITMAP CopyBitmap; |
617 |
|
618 |
if (tk->Select) SwitchRubberBand(tk,ts,FALSE); |
619 |
TEKCaretOff(tk); |
620 |
if (OpenClipboard(tk->HWin) && EmptyClipboard()) |
621 |
{ |
622 |
/* Create the new bitmap */ |
623 |
CopyDC = CreateCompatibleDC(tk->MemDC); |
624 |
CopyBitmap = CreateCompatibleBitmap(tk->MemDC, Width, Height); |
625 |
CopyBitmap = SelectObject(CopyDC, CopyBitmap); |
626 |
BitBlt(CopyDC, 0, 0, Width, Height, tk->MemDC, x, y, SRCCOPY); |
627 |
CopyBitmap = SelectObject(CopyDC, CopyBitmap); |
628 |
/* Transfer the new bitmap to the clipboard */ |
629 |
SetClipboardData(CF_BITMAP, CopyBitmap); |
630 |
} |
631 |
|
632 |
CloseClipboard(); |
633 |
DeleteDC(CopyDC); |
634 |
|
635 |
TEKCaretOn(tk,ts); |
636 |
SwitchRubberBand(tk,ts,tk->Select); |
637 |
} |
638 |
|
639 |
void FAR PASCAL TEKCMCopy(PTEKVar tk, PTTSet ts) |
640 |
{ |
641 |
int x, y; |
642 |
|
643 |
if (! tk->Select) return; |
644 |
|
645 |
if (tk->SelectStart.x < tk->SelectEnd.x) |
646 |
x = tk->SelectStart.x; |
647 |
else x = tk->SelectEnd.x; |
648 |
if (tk->SelectStart.y < tk->SelectEnd.y) |
649 |
y = tk->SelectStart.y; |
650 |
else y = tk->SelectEnd.y; |
651 |
/* copy selected area to clipboard */ |
652 |
CopyToClipboard(tk, ts, x, y, |
653 |
abs(tk->SelectEnd.x - tk->SelectStart.x), |
654 |
abs(tk->SelectEnd.y - tk->SelectStart.y)); |
655 |
} |
656 |
|
657 |
void FAR PASCAL TEKCMCopyScreen(PTEKVar tk, PTTSet ts) |
658 |
{ |
659 |
/* copy fullscreen to clipboard */ |
660 |
CopyToClipboard(tk, ts, 0, 0, tk->ScreenWidth, tk->ScreenHeight); |
661 |
} |
662 |
|
663 |
void FAR PASCAL TEKPrint(PTEKVar tk, PTTSet ts, HDC PrintDC, BOOL SelFlag) |
664 |
{ |
665 |
POINT PPI; |
666 |
RECT Margin; |
667 |
int Caps; |
668 |
int PrnWidth, PrnHeight; |
669 |
int MemWidth, MemHeight; |
670 |
POINT PrintStart, PrintEnd; |
671 |
|
672 |
if (PrintDC == NULL) return; |
673 |
|
674 |
if (SelFlag) |
675 |
{ |
676 |
/* print selection */ |
677 |
PrintStart = tk->SelectStart; |
678 |
PrintEnd = tk->SelectEnd; |
679 |
} |
680 |
else { |
681 |
/* print current page */ |
682 |
PrintStart.x = 0; |
683 |
PrintStart.y = 0; |
684 |
PrintEnd.x = tk->ScreenWidth; |
685 |
PrintEnd.y = tk->ScreenHeight; |
686 |
} |
687 |
|
688 |
Caps = GetDeviceCaps(PrintDC,RASTERCAPS); |
689 |
if ((Caps & RC_BITBLT) != RC_BITBLT) |
690 |
{ |
691 |
char uimsg[MAX_UIMSG]; |
692 |
get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile); |
693 |
get_lang_msg("MSG_TEK_PRINT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Printer dose not support graphics", ts->UILanguageFile); |
694 |
MessageBox(tk->HWin,ts->UIMsg,uimsg,MB_ICONEXCLAMATION); |
695 |
return; |
696 |
} |
697 |
if (tk->Active) TEKCaretOff(tk); |
698 |
if (tk->RubberBand) SwitchRubberBand(tk,ts,FALSE); |
699 |
|
700 |
MemWidth = PrintEnd.x - PrintStart.x; |
701 |
MemHeight = PrintEnd.y - PrintStart.y; |
702 |
if ((MemWidth==0) || (MemHeight==0)) return; |
703 |
|
704 |
StartPage(PrintDC); |
705 |
|
706 |
if ((ts->TEKPPI.x>0) && (ts->TEKPPI.y>0)) |
707 |
PPI = ts->TEKPPI; |
708 |
else { |
709 |
PPI.x = GetDeviceCaps(PrintDC,LOGPIXELSX); |
710 |
PPI.y = GetDeviceCaps(PrintDC,LOGPIXELSY); |
711 |
} |
712 |
|
713 |
Margin.left = /* left margin */ |
714 |
(int)((float)ts->PrnMargin[0] / 100.0 * (float)PPI.x); |
715 |
Margin.right = /* right margin */ |
716 |
GetDeviceCaps(PrintDC,HORZRES) - |
717 |
(int)((float)ts->PrnMargin[1] / 100.0 * (float)PPI.x); |
718 |
Margin.top = /* top margin */ |
719 |
(int)((float)ts->PrnMargin[2] / 100.0 * (float)PPI.y); |
720 |
Margin.bottom = /* bottom margin */ |
721 |
GetDeviceCaps(PrintDC,VERTRES) - |
722 |
(int)((float)ts->PrnMargin[3] / 100.0 * (float)PPI.y); |
723 |
|
724 |
if ((Caps & RC_STRETCHBLT) == RC_STRETCHBLT) |
725 |
{ |
726 |
PrnWidth = (int)((float)MemWidth / |
727 |
(float)GetDeviceCaps(tk->MemDC,LOGPIXELSX) * (float)PPI.x); |
728 |
PrnHeight = (int)((float)MemHeight / |
729 |
(float)GetDeviceCaps(tk->MemDC,LOGPIXELSY) * (float)PPI.y); |
730 |
StretchBlt(PrintDC, Margin.left, Margin.top, PrnWidth, PrnHeight, |
731 |
tk->MemDC, PrintStart.x, PrintStart.y, MemWidth, MemHeight, SRCCOPY); |
732 |
} |
733 |
else |
734 |
BitBlt(PrintDC, Margin.left, Margin.top, MemWidth, MemHeight, |
735 |
tk->MemDC, PrintStart.x, PrintStart.y, SRCCOPY); |
736 |
|
737 |
EndPage(PrintDC); |
738 |
|
739 |
SwitchRubberBand(tk,ts,tk->Select); |
740 |
} |
741 |
|
742 |
void FAR PASCAL TEKClearScreen(PTEKVar tk, PTTSet ts) |
743 |
{ |
744 |
RECT R; |
745 |
|
746 |
GetClientRect(tk->HWin,&R); |
747 |
FillRect(tk->MemDC,&R,tk->MemBackGround); |
748 |
InvalidateRect(tk->HWin,&R,FALSE); |
749 |
tk->DispMode = IdAlphaMode; |
750 |
tk->CaretX = 0; |
751 |
tk->CaretOffset = 0; |
752 |
tk->CaretY = tk->FontHeight; |
753 |
TEKCaretOn(tk,ts); |
754 |
} |
755 |
|
756 |
void FAR PASCAL TEKSetupFont(PTEKVar tk, PTTSet ts) |
757 |
{ |
758 |
int W, H; |
759 |
// BOOL Ok; |
760 |
RECT R; |
761 |
|
762 |
// if (! LoadTTDLG()) return; |
763 |
// Ok = (*ChooseFontDlg)(tk->HWin,&tk->TEKlf,NULL); |
764 |
// FreeTTDLG(); |
765 |
// if (! Ok) return; |
766 |
|
767 |
strncpy_s(ts->TEKFont, sizeof(ts->TEKFont), tk->TEKlf.lfFaceName, _TRUNCATE); |
768 |
ts->TEKFontSize.x = tk->TEKlf.lfWidth; |
769 |
ts->TEKFontSize.y = tk->TEKlf.lfHeight; |
770 |
ts->TEKFontCharSet = tk->TEKlf.lfCharSet; |
771 |
|
772 |
GetWindowRect(tk->HWin, &R); |
773 |
W = R.right - R.left; |
774 |
H = R.bottom - R.top; |
775 |
tk->TextSize = 0; |
776 |
TEKResizeWindow(tk,ts,W,H); |
777 |
} |
778 |
|
779 |
void FAR PASCAL TEKResetWin(PTEKVar tk, PTTSet ts, WORD EmuOld) |
780 |
{ |
781 |
HDC TmpDC; |
782 |
RECT R; |
783 |
|
784 |
/* Change caret shape */ |
785 |
TEKChangeCaret(tk,ts); |
786 |
|
787 |
/* Change display color*/ |
788 |
TmpDC = GetDC(tk->HWin); |
789 |
|
790 |
if (ts->TEKColorEmu != EmuOld) |
791 |
{ |
792 |
SelectObject(tk->MemDC,tk->OldMemBmp); |
793 |
if (tk->HBits!=NULL) DeleteObject(tk->HBits); |
794 |
if (ts->TEKColorEmu > 0) |
795 |
tk->HBits = |
796 |
CreateCompatibleBitmap(TmpDC,tk->ScreenWidth,tk->ScreenHeight); |
797 |
else |
798 |
tk->HBits = |
799 |
CreateBitmap(tk->ScreenWidth, tk->ScreenHeight, 1, 1, NULL); |
800 |
tk->OldMemBmp = SelectObject(tk->MemDC, tk->HBits); |
801 |
GetClientRect(tk->HWin,&R); |
802 |
FillRect(tk->MemDC,&R,tk->MemBackGround); |
803 |
} |
804 |
|
805 |
ReleaseDC(tk->HWin,TmpDC); |
806 |
|
807 |
tk->TextColor = ts->TEKColor[0]; |
808 |
|
809 |
tk->ps = PS_SOLID; |
810 |
tk->PenColor = ts->TEKColor[0]; |
811 |
if (tk->Pen!=NULL) DeleteObject(tk->Pen); |
812 |
tk->Pen = CreatePen(tk->ps,1,tk->PenColor); |
813 |
|
814 |
if (tk->BackGround!=NULL) DeleteObject(tk->BackGround); |
815 |
tk->BackGround = CreateSolidBrush(ts->TEKColor[1]); |
816 |
|
817 |
if (ts->TEKColorEmu>0) |
818 |
{ |
819 |
tk->MemForeColor = ts->TEKColor[0]; |
820 |
tk->MemBackColor = ts->TEKColor[1]; |
821 |
} |
822 |
else { |
823 |
tk->MemForeColor = RGB(0,0,0); |
824 |
tk->MemBackColor = RGB(255,255,255); |
825 |
} |
826 |
tk->MemTextColor = tk->MemForeColor; |
827 |
tk->MemPenColor = tk->MemForeColor; |
828 |
|
829 |
SelectObject(tk->MemDC, tk->OldMemPen); |
830 |
if (tk->MemPen!=NULL) DeleteObject(tk->MemPen); |
831 |
tk->MemPen = CreatePen(tk->ps,1,tk->MemPenColor); |
832 |
tk->OldMemPen = SelectObject(tk->MemDC,tk->MemPen); |
833 |
|
834 |
if (tk->MemBackGround!=NULL) DeleteObject(tk->MemBackGround); |
835 |
tk->MemBackGround = CreateSolidBrush(tk->MemBackColor); |
836 |
|
837 |
SetTextColor(tk->MemDC, tk->MemTextColor); |
838 |
SetBkColor(tk->MemDC, tk->MemBackColor); |
839 |
|
840 |
if ((ts->TEKColorEmu>0) || |
841 |
(ts->TEKColorEmu!=EmuOld)) |
842 |
TEKClearScreen(tk,ts); |
843 |
|
844 |
InvalidateRect(tk->HWin,NULL,TRUE); |
845 |
} |
846 |
|
847 |
/* BOOL FAR PASCAL TEKSetupWinDlg(PTEKVar tk, PTTSet ts) |
848 |
{ |
849 |
BOOL Ok; |
850 |
WORD OldEmu; |
851 |
|
852 |
ts->VTFlag = 0; |
853 |
ts->SampleFont = tk->TEKFont[0]; |
854 |
|
855 |
if (! LoadTTDLG()) return FALSE; |
856 |
OldEmu = ts->TEKColorEmu; |
857 |
Ok = (*SetupWin)(tk->HWin, ts); |
858 |
FreeTTDLG(); |
859 |
|
860 |
if (Ok) TEKResetWin(tk,ts,OldEmu); |
861 |
return Ok; |
862 |
} */ |
863 |
|
864 |
void FAR PASCAL TEKRestoreSetup(PTEKVar tk, PTTSet ts) |
865 |
{ |
866 |
int W, H; |
867 |
RECT R; |
868 |
|
869 |
/* change window */ |
870 |
strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), ts->TEKFont, _TRUNCATE); |
871 |
tk->TEKlf.lfWidth = ts->TEKFontSize.x; |
872 |
tk->TEKlf.lfHeight = ts->TEKFontSize.y; |
873 |
tk->TEKlf.lfCharSet = ts->TEKFontCharSet; |
874 |
tk->TextSize = 0; |
875 |
|
876 |
GetWindowRect(tk->HWin, &R); |
877 |
W = R.right - R.left; |
878 |
H = R.bottom - R.top; |
879 |
TEKResizeWindow(tk,ts,W,H); |
880 |
} |
881 |
|
882 |
void FAR PASCAL TEKEnd(PTEKVar tk) |
883 |
{ |
884 |
int i; |
885 |
|
886 |
if (tk->MemDC != NULL) DeleteDC(tk->MemDC); |
887 |
for (i = 0; i <= 3; i++) |
888 |
if (tk->TEKFont[i]!=NULL) DeleteObject(tk->TEKFont[i]); |
889 |
if (tk->MarkerFont != NULL) DeleteObject(tk->MarkerFont); |
890 |
if (tk->HBits != NULL) DeleteObject(tk->HBits); |
891 |
if (tk->Pen != NULL) DeleteObject(tk->Pen); |
892 |
if (tk->MemPen != NULL) DeleteObject(tk->MemPen); |
893 |
if (tk->BackGround != NULL) DeleteObject(tk->BackGround); |
894 |
if (tk->MemBackGround != NULL) DeleteObject(tk->MemBackGround); |
895 |
} |
896 |
|
897 |
BOOL WINAPI DllMain(HANDLE hInstance, |
898 |
ULONG ul_reason_for_call, |
899 |
LPVOID lpReserved) |
900 |
{ |
901 |
hInst = hInstance; |
902 |
switch( ul_reason_for_call ) { |
903 |
case DLL_THREAD_ATTACH: |
904 |
/* do thread initialization */ |
905 |
break; |
906 |
case DLL_THREAD_DETACH: |
907 |
/* do thread cleanup */ |
908 |
break; |
909 |
case DLL_PROCESS_ATTACH: |
910 |
/* do process initialization */ |
911 |
DoCover_IsDebuggerPresent(); |
912 |
break; |
913 |
case DLL_PROCESS_DETACH: |
914 |
/* do process cleanup */ |
915 |
break; |
916 |
} |
917 |
return( 1 ); |
918 |
} |