Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/ttpcmn/ttcmn.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9546 - (hide annotations) (download) (as text)
Sat Nov 27 13:48:57 2021 UTC (2 years, 4 months ago) by zmatsuo
File MIME type: text/x-csrc
File size: 36114 byte(s)
Visual Studio 2005 でビルドできるよう修正

- 2005で警告が出ないよう修正
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 nmaya 9048 * (C) 2004- TeraTerm Project
4 doda 6806 * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17 doda 6806 *
18 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 doda 6806 */
29 maya 3227
30     /* TTCMN.DLL, main */
31     #include <direct.h>
32     #include <string.h>
33     #include <stdio.h>
34     #include <windows.h>
35     #include <setupapi.h>
36 maya 5308 #include <htmlhelp.h>
37 doda 8445 #include <assert.h>
38     #include <crtdbg.h>
39 maya 3227
40 zmatsuo 7536 #define DllExport __declspec(dllexport)
41     #include "language.h"
42     #undef DllExport
43    
44     #include "teraterm.h"
45     #include "tttypes.h"
46     #include "ttlib.h"
47 yutakapon 4915 #include "tt_res.h"
48 zmatsuo 7412 #include "codeconv.h"
49 doda 8445 #include "compat_win.h"
50 zmatsuo 9337 #include "asprintf.h"
51 maya 3227
52 zmatsuo 7536 #define DllExport __declspec(dllexport)
53     #include "ttcommon.h"
54    
55 zmatsuo 8828 /* shared memory */
56     typedef struct {
57     size_t size_tmap; /* sizeof TMap */
58     size_t size_tttset; /* sizeof TTTSet */
59     /* Setup information from "teraterm.ini" */
60     TTTSet ts;
61     // Window list
62     int NWin;
63     HWND WinList[MAXNWIN];
64     /* COM port use flag
65     * bit 8 7 6 5 4 3 2 1
66     * char[0] : COM 8 7 6 5 4 3 2 1
67     * char[1] : COM16 15 14 13 12 11 10 9 ...
68     */
69     unsigned char ComFlag[(MAXCOMPORT-1)/CHAR_BIT+1];
70     /* Previous window rect (Tera Term 4.78 or later) */
71     WINDOWPLACEMENT WinPrevRect[MAXNWIN];
72     BOOL WinUndoFlag;
73     int WinUndoStyle;
74     } TMap;
75     typedef TMap *PMap;
76 zmatsuo 7536
77 zmatsuo 7304 // TMap ���i�[�����t�@�C���}�b�s���O�I�u�W�F�N�g(���L������)�����O
78     // TMap(�����������o)���X�V�������o�[�W�������������N���������������K�v��������
79     // �A�������o�[�W�����������g�����������X�������A���������������X�����K�v������
80     #define TT_FILEMAPNAME "ttset_memfilemap_" TT_VERSION_STR("_")
81    
82 maya 3227 /* first instance flag */
83     static BOOL FirstInstance = TRUE;
84    
85     static HINSTANCE hInst;
86    
87     static PMap pm;
88    
89     static HANDLE HMap = NULL;
90 zmatsuo 9292 #define VTCLASSNAME "VTWin32"
91     #define TEKCLASSNAME "TEKWin32"
92 maya 3227
93 yutakapon 5299 enum window_style {
94     WIN_CASCADE,
95     WIN_STACKED,
96     WIN_SIDEBYSIDE,
97     };
98    
99    
100 zmatsuo 7305 void WINAPI CopyShmemToTTSet(PTTSet ts)
101 maya 3227 {
102     // ���������������L�����������R�s�[����
103     memcpy(ts, &pm->ts, sizeof(TTTSet));
104     }
105    
106 zmatsuo 7305 void WINAPI CopyTTSetToShmem(PTTSet ts)
107 maya 3227 {
108     // ���������������L���������R�s�[����
109     memcpy(&pm->ts, ts, sizeof(TTTSet));
110     }
111    
112 zmatsuo 9532 static void CopyFiles(const wchar_t *file_list[], const wchar_t *src_dir, const wchar_t *dest_dir)
113     {
114     for (;;) {
115 zmatsuo 9546 wchar_t *dest;
116     size_t len;
117 zmatsuo 9532 const wchar_t *filename = *file_list;
118     file_list++;
119     if (filename == NULL) {
120     break;
121     }
122    
123 zmatsuo 9546 dest = NULL;
124 zmatsuo 9532 awcscats(&dest, dest_dir, L"\\", filename, NULL);
125    
126 zmatsuo 9546 len = wcslen(dest);
127 zmatsuo 9532 if (dest[len - 1] == '\\') {
128     // �t�H���_����
129     CreateDirectoryW(dest, NULL);
130     }
131     else {
132     wchar_t *src = NULL;
133     awcscats(&src, src_dir, L"\\", filename, NULL);
134     CopyFileW(src, dest, TRUE); // TRUE = do not copy if exists
135     free(src);
136     }
137     free(dest);
138     }
139     }
140    
141 zmatsuo 7305 BOOL WINAPI StartTeraTerm(PTTSet ts)
142 maya 3227 {
143     if (FirstInstance) {
144     // init window list
145     pm->NWin = 0;
146     }
147     else {
148     /* only the first instance uses saved position */
149     pm->ts.VTPos.x = CW_USEDEFAULT;
150     pm->ts.VTPos.y = CW_USEDEFAULT;
151     pm->ts.TEKPos.x = CW_USEDEFAULT;
152     pm->ts.TEKPos.y = CW_USEDEFAULT;
153     }
154    
155     memcpy(ts,&(pm->ts),sizeof(TTTSet));
156    
157     // if (FirstInstance) { �������������� (2008.3.13 maya)
158     // �N���������A���L�������� HomeDir �� SetupFName ����������
159 zmatsuo 9306 /* Get home directory (ttermpro.exe���t�H���_) */
160 zmatsuo 9501 ts->ExeDirW = GetExeDirW(hInst);
161    
162     // LogDir
163 zmatsuo 9466 ts->LogDirW = GetLogDirW();
164 zmatsuo 9501 CreateDirectoryW(ts->LogDirW, NULL);
165    
166     // HomeDir
167 zmatsuo 9306 ts->HomeDirW = GetHomeDirW(hInst);
168     WideCharToACP_t(ts->HomeDirW, ts->HomeDir, _countof(ts->HomeDir));
169 zmatsuo 9501 CreateDirectoryW(ts->HomeDirW, NULL);
170     SetCurrentDirectoryW(ts->HomeDirW); // TODO �K�v??
171 maya 3227
172 zmatsuo 9532 // TERATERM.INI ���t���p�X
173     ts->SetupFNameW = NULL;
174     awcscats(&ts->SetupFNameW, ts->HomeDirW, L"\\TERATERM.INI", NULL);
175     WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName));
176 zmatsuo 9501
177 zmatsuo 9532 // KEYBOARD.CNF ���t���p�X
178     ts->KeyCnfFNW = NULL;
179     awcscats(&ts->KeyCnfFNW, ts->HomeDirW, L"\\KEYBOARD.CNF", NULL);
180     WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN));
181 zmatsuo 9501
182 zmatsuo 9532 // TERATERM.INI ����������?
183     if (GetFileAttributesW(ts->SetupFNameW) == INVALID_FILE_ATTRIBUTES) {
184     // ���������������A�����t�@�C�������l�t�H���_���R�s�[����
185     // TODO �����t�@�C���� unicode, ansi����
186     static const wchar_t *filelist[] = {
187     L"TERATERM.INI",
188     L"KEYBOARD.CNF",
189     L"cygterm.cfg",
190     #if 0
191     L"theme\\",
192     L"theme\\Advanced.sample",
193     L"theme\\ImageFile.INI",
194     L"theme\\scale\\",
195     L"theme\\scale\\23.jpg",
196     L"theme\\scale\\43.jpg",
197     L"theme\\Scale.INI",
198     L"theme\\tile\\",
199     L"theme\\tile\\03.jpg",
200     L"theme\\tile\\44.jpg",
201     L"theme\\Tile.INI",
202 zmatsuo 9501 #endif
203 zmatsuo 9532 NULL,
204     };
205     CopyFiles(filelist, ts->ExeDirW, ts->HomeDirW);
206 zmatsuo 9501 }
207 zmatsuo 9306
208 maya 3227 if (FirstInstance) {
209     FirstInstance = FALSE;
210     return TRUE;
211     }
212 maya 3392 else {
213 maya 3227 return FALSE;
214 maya 3392 }
215 maya 3227 }
216    
217 yutakapon 4915 // �����t�@�C�����f�B�X�N���������ATera Term�{�������N�������B
218     // (2012.4.30 yutaka)
219 zmatsuo 7305 void WINAPI RestartTeraTerm(HWND hwnd, PTTSet ts)
220 yutakapon 4915 {
221     char path[1024];
222     STARTUPINFO si;
223     PROCESS_INFORMATION pi;
224 yutakapon 4916 int ret;
225 yutakapon 4915
226 zmatsuo 8616 static const TTMessageBoxInfoW info = {
227     "Tera Term",
228     NULL, L"Tera Term: Configuration Warning",
229     "MSG_TT_TAKE_EFFECT",
230     L"This option takes effect the next time a session is started.\n"
231 zmatsuo 9342 L"Are you sure that you want to relaunch Tera Term?",
232     MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2
233 zmatsuo 8616 };
234 zmatsuo 9342 ret = TTMessageBoxA(hwnd, &info, ts->UILanguageFile);
235 doda 6435 if (ret != IDYES)
236 yutakapon 4916 return;
237    
238 yutakapon 4915 SendMessage(hwnd, WM_COMMAND, ID_SETUP_SAVE, 0);
239 yutakapon 4919 // ID_FILE_EXIT ���b�Z�[�W�����A�v�������������������������AWM_QUIT ���|�X�g�����B
240     //PostMessage(hwnd, WM_COMMAND, ID_FILE_EXIT, 0);
241     PostQuitMessage(0);
242 yutakapon 4915
243 yutakapon 4919 // ���v���Z�X�����N���B
244 yutakapon 4915 if (GetModuleFileName(NULL, path, sizeof(path)) == 0) {
245     return;
246     }
247     memset(&si, 0, sizeof(si));
248     GetStartupInfo(&si);
249     memset(&pi, 0, sizeof(pi));
250     if (CreateProcess(NULL, path, NULL, NULL, FALSE, 0,
251     NULL, NULL, &si, &pi) == 0) {
252     }
253     }
254    
255 zmatsuo 7305 void WINAPI SetCOMFlag(int Com)
256 maya 3227 {
257     pm->ComFlag[(Com-1)/CHAR_BIT] |= 1 << ((Com-1)%CHAR_BIT);
258     }
259    
260 zmatsuo 7305 void WINAPI ClearCOMFlag(int Com)
261 maya 3227 {
262     pm->ComFlag[(Com-1)/CHAR_BIT] &= ~(1 << ((Com-1)%CHAR_BIT));
263     }
264    
265 zmatsuo 7305 int WINAPI CheckCOMFlag(int Com)
266 maya 3227 {
267     return ((pm->ComFlag[(Com-1)/CHAR_BIT] & 1 << (Com-1)%CHAR_BIT) > 0);
268     }
269    
270 zmatsuo 7305 int WINAPI RegWin(HWND HWinVT, HWND HWinTEK)
271 maya 3227 {
272     int i, j;
273    
274     if (pm->NWin>=MAXNWIN)
275     return 0;
276     if (HWinVT==NULL)
277     return 0;
278     if (HWinTEK!=NULL) {
279     i = 0;
280     while ((i<pm->NWin) && (pm->WinList[i]!=HWinVT))
281     i++;
282     if (i>=pm->NWin)
283     return 0;
284     for (j=pm->NWin-1 ; j>i ; j--)
285     pm->WinList[j+1] = pm->WinList[j];
286     pm->WinList[i+1] = HWinTEK;
287     pm->NWin++;
288     return 0;
289     }
290     pm->WinList[pm->NWin++] = HWinVT;
291 yutakapon 5223 memset(&pm->WinPrevRect[pm->NWin - 1], 0, sizeof(pm->WinPrevRect[pm->NWin - 1])); // RECT clear
292 maya 3392 if (pm->NWin==1) {
293 maya 3227 return 1;
294 maya 3392 }
295     else {
296 maya 3227 return (int)(SendMessage(pm->WinList[pm->NWin-2],
297 maya 3392 WM_USER_GETSERIALNO,0,0)+1);
298     }
299 maya 3227 }
300    
301 zmatsuo 7305 void WINAPI UnregWin(HWND HWin)
302 maya 3227 {
303     int i, j;
304    
305     i = 0;
306 maya 3392 while ((i<pm->NWin) && (pm->WinList[i]!=HWin)) {
307 maya 3227 i++;
308 maya 3392 }
309     if (pm->WinList[i]!=HWin) {
310 maya 3227 return;
311 maya 3392 }
312     for (j=i ; j<pm->NWin-1 ; j++) {
313 maya 3227 pm->WinList[j] = pm->WinList[j+1];
314 yutakapon 5223 pm->WinPrevRect[j] = pm->WinPrevRect[j+1]; // RECT shift
315 maya 3392 }
316     if (pm->NWin>0) {
317 maya 3227 pm->NWin--;
318 maya 3392 }
319 maya 3227 }
320    
321 doda 6435 char GetWindowTypeChar(HWND Hw, HWND HWin)
322 doda 4073 {
323 doda 4076 #if 0
324 doda 4073 if (HWin == Hw)
325     return '*';
326     else if (!IsWindowVisible(Hw))
327 doda 4076 #else
328     if (!IsWindowVisible(Hw))
329     #endif
330 doda 4073 return '#';
331     else if (IsIconic(Hw))
332     return '-';
333     else if (IsZoomed(Hw))
334     return '@';
335     else
336     return '+';
337     }
338    
339 zmatsuo 7305 void WINAPI SetWinMenu(HMENU menu, PCHAR buf, int buflen, PCHAR langFile, int VTFlag)
340 maya 3227 {
341     int i;
342     char Temp[MAXPATHLEN];
343     HWND Hw;
344 zmatsuo 8496 wchar_t uimsg[MAX_UIMSG];
345 maya 3227
346     // delete all items in Window menu
347     i = GetMenuItemCount(menu);
348     if (i>0)
349     do {
350     i--;
351     RemoveMenu(menu,i,MF_BYPOSITION);
352     } while (i>0);
353    
354     i = 0;
355     while (i<pm->NWin) {
356     Hw = pm->WinList[i]; // get window handle
357     if ((GetClassName(Hw,Temp,sizeof(Temp))>0) &&
358     ((strcmp(Temp,VTCLASSNAME)==0) ||
359     (strcmp(Temp,TEKCLASSNAME)==0))) {
360     Temp[0] = '&';
361     Temp[1] = (char)(0x31 + i);
362     Temp[2] = ' ';
363 doda 4073 Temp[3] = GetWindowTypeChar(Hw, NULL);
364     Temp[4] = ' ';
365     GetWindowText(Hw,&Temp[5],sizeof(Temp)-6);
366 maya 3227 AppendMenu(menu,MF_ENABLED | MF_STRING,ID_WINDOW_1+i,Temp);
367     i++;
368 maya 3392 if (i>8) {
369 maya 3227 i = pm->NWin;
370 maya 3392 }
371 maya 3227 }
372 maya 3392 else {
373 maya 3227 UnregWin(Hw);
374 maya 3392 }
375 maya 3227 }
376     if (VTFlag == 1) {
377 zmatsuo 8496 static const DlgTextInfo MenuTextInfo[] = {
378     { ID_WINDOW_WINDOW, "MENU_WINDOW_WINDOW" },
379     { ID_WINDOW_MINIMIZEALL, "MENU_WINDOW_MINIMIZEALL" },
380     { ID_WINDOW_RESTOREALL, "MENU_WINDOW_RESTOREALL" },
381     { ID_WINDOW_CASCADEALL, "MENU_WINDOW_CASCADE" },
382     { ID_WINDOW_STACKED, "MENU_WINDOW_STACKED" },
383     { ID_WINDOW_SIDEBYSIDE, "MENU_WINDOW_SIDEBYSIDE" },
384     };
385    
386 maya 4655 AppendMenu(menu, MF_SEPARATOR, 0, NULL);
387 zmatsuo 8496 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_WINDOW, "&Window");
388     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_MINIMIZEALL, "&Minimize All");
389     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_RESTOREALL, "&Restore All");
390     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_CASCADEALL, "&Cascade");
391     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_STACKED, "&Stacked");
392     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_SIDEBYSIDE, "Side &by Side");
393 doda 4647
394 zmatsuo 8496 SetI18nMenuStrs("Tera Term", menu, MenuTextInfo, _countof(MenuTextInfo), langFile);
395 doda 4647
396 yutakapon 5299 if (pm->WinUndoFlag) {
397     if (pm->WinUndoStyle == WIN_CASCADE)
398 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_CASCADE_UNDO", uimsg, _countof(uimsg), L"&Undo - Cascade", langFile);
399 yutakapon 5299 else if (pm->WinUndoStyle == WIN_STACKED)
400 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_STACKED_UNDO", uimsg, _countof(uimsg), L"&Undo - Stacked", langFile);
401 yutakapon 5299 else
402 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_SIDEBYSIDE_UNDO", uimsg, _countof(uimsg), L"&Undo - Side by Side", langFile);
403 zmatsuo 9324 AppendMenuW(menu, MF_ENABLED | MF_STRING, ID_WINDOW_UNDO, uimsg); // TODO UNICODE
404 yutakapon 5299 }
405    
406 maya 3227 }
407     else {
408 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_WINDOW", uimsg, _countof(uimsg), L"&Window", langFile);
409 zmatsuo 9324 AppendMenuW(menu,MF_ENABLED | MF_STRING,ID_TEKWINDOW_WINDOW, uimsg);
410 maya 3227 }
411     }
412    
413 zmatsuo 7305 void WINAPI SetWinList(HWND HWin, HWND HDlg, int IList)
414 maya 3227 {
415     int i;
416     char Temp[MAXPATHLEN];
417     HWND Hw;
418    
419     for (i=0; i<pm->NWin; i++) {
420     Hw = pm->WinList[i]; // get window handle
421     if ((GetClassName(Hw,Temp,sizeof(Temp))>0) &&
422     ((strcmp(Temp,VTCLASSNAME)==0) ||
423     (strcmp(Temp,TEKCLASSNAME)==0))) {
424 doda 4073 Temp[0] = GetWindowTypeChar(Hw, HWin);
425     Temp[1] = ' ';
426     GetWindowText(Hw,&Temp[2],sizeof(Temp)-3);
427 maya 3227 SendDlgItemMessage(HDlg, IList, LB_ADDSTRING,
428 zmatsuo 7896 0, (LPARAM)Temp);
429 maya 3392 if (Hw==HWin) {
430     SendDlgItemMessage(HDlg, IList, LB_SETCURSEL, i,0);
431     }
432 maya 3227 }
433 maya 3392 else {
434 maya 3227 UnregWin(Hw);
435 maya 3392 }
436 maya 3227 }
437     }
438    
439 zmatsuo 7305 void WINAPI SelectWin(int WinId)
440 maya 3227 {
441     if ((WinId>=0) && (WinId<pm->NWin)) {
442 yutakapon 3673 /* �E�B���h�E�����������������������������������A���������������������������A
443     * SW_SHOWNORMAL ���� SW_SHOW �����X�����B
444     * (2009.11.8 yutaka)
445 maya 3675 * �E�B���h�E�����������������������������T�C�Y������(SW_RESTORE)�����������B
446     * (2009.11.9 maya)
447 yutakapon 3673 */
448 maya 3675 if (IsIconic(pm->WinList[WinId])) {
449     ShowWindow(pm->WinList[WinId],SW_RESTORE);
450     }
451     else {
452     ShowWindow(pm->WinList[WinId],SW_SHOW);
453     }
454 maya 3227 SetForegroundWindow(pm->WinList[WinId]);
455     }
456     }
457    
458 zmatsuo 7305 void WINAPI SelectNextWin(HWND HWin, int Next, BOOL SkipIconic)
459 maya 3227 {
460     int i;
461    
462     i = 0;
463 doda 3950 while ((i < pm->NWin) && (pm->WinList[i]!=HWin)) {
464     i++;
465     }
466     if (pm->WinList[i]!=HWin) {
467     return;
468     }
469    
470     do {
471     i += Next;
472     if (i >= pm->NWin) {
473     i = 0;
474     }
475     else if (i < 0) {
476     i = pm->NWin-1;
477     }
478    
479     if (pm->WinList[i] == HWin) {
480 doda 4030 break;
481 doda 3950 }
482 doda 4030 } while ((SkipIconic && IsIconic(pm->WinList[i])) || !IsWindowVisible(pm->WinList[i]));
483 doda 3950
484     SelectWin(i);
485     }
486    
487 zmatsuo 7305 void WINAPI ShowAllWin(int stat) {
488 doda 4647 int i;
489 doda 5280
490     for (i=0; i < pm->NWin; i++) {
491     ShowWindow(pm->WinList[i], stat);
492     }
493     }
494    
495 zmatsuo 7305 void WINAPI UndoAllWin(void) {
496 doda 5280 int i;
497 yutakapon 5223 WINDOWPLACEMENT rc0;
498     RECT rc;
499 yutakapon 5299 int stat = SW_RESTORE;
500 yutakapon 5407 int multi_mon = 0;
501 doda 4647
502 yutakapon 6286 if (HasMultiMonitorSupport()) {
503 yutakapon 5407 multi_mon = 1;
504     }
505    
506 yutakapon 5299 // ���x�A�����������t���O���������B
507     pm->WinUndoFlag = FALSE;
508    
509 yutakapon 5223 memset(&rc0, 0, sizeof(rc0));
510    
511 doda 4647 for (i=0; i < pm->NWin; i++) {
512 yutakapon 5223 // �����w�����A�O�����������c���������������A�E�B���h�E�����������������B
513     if (stat == SW_RESTORE && memcmp(&pm->WinPrevRect[i], &rc0, sizeof(rc0)) != 0) {
514     rc = pm->WinPrevRect[i].rcNormalPosition;
515    
516 yutakapon 5407 // NT4.0, 95 ���}���`���j�^API��������
517     if (multi_mon) {
518     // �������j�^������������
519 zmatsuo 8517 HMONITOR hMonitor;
520     MONITORINFO mi;
521     hMonitor = pMonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
522 yutakapon 5407 mi.cbSize = sizeof(MONITORINFO);
523 zmatsuo 8517 pGetMonitorInfoA(hMonitor, &mi);
524 yutakapon 5223
525 yutakapon 5407 // ���u�����i�����O���������x���������������������������j
526     if (rc.right > mi.rcMonitor.right) {
527     rc.left -= rc.right - mi.rcMonitor.right;
528     rc.right = mi.rcMonitor.right;
529     }
530     if (rc.left < mi.rcMonitor.left) {
531     rc.right += mi.rcMonitor.left - rc.left;
532     rc.left = mi.rcMonitor.left;
533     }
534     if (rc.bottom > mi.rcMonitor.bottom) {
535     rc.top -= rc.bottom - mi.rcMonitor.bottom;
536     rc.bottom = mi.rcMonitor.bottom;
537     }
538     if (rc.top < mi.rcMonitor.top) {
539     rc.bottom += mi.rcMonitor.top - rc.top;
540     rc.top = mi.rcMonitor.top;
541     }
542 yutakapon 5223 }
543    
544     // �E�B���h�E���u����
545     SetWindowPos(
546 doda 6435 pm->WinList[i], NULL,
547     rc.left,
548 yutakapon 5223 rc.top,
549 doda 6435 rc.right - rc.left,
550 yutakapon 5223 rc.bottom - rc.top,
551     SWP_NOZORDER);
552    
553 yutakapon 5230 // �E�B���h�E����������
554     ShowWindow(pm->WinList[i], pm->WinPrevRect[i].showCmd);
555 yutakapon 5223
556     } else {
557     ShowWindow(pm->WinList[i], stat);
558     }
559 doda 4647 }
560     }
561    
562 zmatsuo 7305 void WINAPI OpenHelp(UINT Command, DWORD Data, char *UILanguageFile)
563 maya 5308 {
564 zmatsuo 9337 wchar_t Temp[MAX_PATH];
565 maya 5308 HWND HWin;
566 zmatsuo 9337 wchar_t *HelpFN;
567 zmatsuo 8496 wchar_t uimsg[MAX_UIMSG];
568 zmatsuo 8516 wchar_t *HomeDirW;
569 maya 5308
570 zmatsuo 9337 /* Get home directory TODO ts.HomeDirW ���������� */
571     if (GetModuleFileNameW(NULL,Temp,_countof(Temp)) == 0) {
572 maya 5308 return;
573     }
574 zmatsuo 9337 HomeDirW = ExtractDirNameW(Temp);
575 zmatsuo 8496 get_lang_msgW("HELPFILE", uimsg, _countof(uimsg), L"teraterm.chm", UILanguageFile);
576 zmatsuo 9337 aswprintf(&HelpFN, L"%s\\%s", HomeDirW, uimsg);
577 zmatsuo 8516 free(HomeDirW);
578 maya 5308
579     // �w���v���I�[�i�[�������f�X�N�g�b�v������ (2007.5.12 maya)
580     HWin = GetDesktopWindow();
581 zmatsuo 8576 if (_HtmlHelpW(HWin, HelpFN, Command, Data) == NULL) {
582 zmatsuo 8516 // �w���v���J����������
583 zmatsuo 8616 static const TTMessageBoxInfoW info = {
584     "Tera Term",
585     NULL, L"Tera Term: HTML help",
586 zmatsuo 9342 "MSG_OPENHELP_ERROR", L"Can't open HTML help file(%s).",
587     MB_OK | MB_ICONERROR };
588     TTMessageBoxA(HWin, &info, UILanguageFile, HelpFN);
589 zmatsuo 8496 }
590 zmatsuo 9337 free(HelpFN);
591 maya 5308 }
592    
593 zmatsuo 7305 HWND WINAPI GetNthWin(int n)
594 maya 3227 {
595 maya 3392 if (n<pm->NWin) {
596 maya 3227 return pm->WinList[n];
597 maya 3392 }
598     else {
599 maya 3227 return NULL;
600 maya 3392 }
601 maya 3227 }
602    
603 zmatsuo 7725 int WINAPI GetRegisteredWindowCount(void)
604 doda 6888 {
605     return (pm->NWin);
606     }
607 yutakapon 5222
608 yutakapon 5223 // �L�����E�B���h�E���T���A�������u���L�������������B
609 yutakapon 5299 static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style)
610 yutakapon 5222 {
611 yutakapon 5223 int i, n;
612     WINDOWPLACEMENT wndPlace;
613 yutakapon 5222
614 yutakapon 5299 // ��������(Undo)���j���[�����x�����\���������B
615     if (pm->WinUndoFlag == FALSE) {
616     pm->WinUndoFlag = TRUE;
617     } else {
618     // ���������j���[���\�������������A�������O�������X�^�C�����I�����������A
619     // ���j���[�������B
620     // Windows8�����A�������A�����������X�^�C�����I�����������j���[�����������������A
621     // Tera Term�������j���[���\�������������A�������������B
622     if (pm->WinUndoStyle == style)
623     pm->WinUndoFlag = FALSE;
624     }
625     pm->WinUndoStyle = style;
626    
627 yutakapon 5222 n = 0;
628     for (i = 0 ; i < pm->NWin ; i++) {
629 yutakapon 5223 // �������u���o���������B
630     wndPlace.length = sizeof(WINDOWPLACEMENT);
631     GetWindowPlacement(pm->WinList[i], &wndPlace);
632     pm->WinPrevRect[i] = wndPlace;
633    
634     // �������g�������������B
635 yutakapon 5222 if (pm->WinList[i] == myhwnd) {
636     hwnd[n] = hwnd[0];
637     hwnd[0] = myhwnd;
638     } else {
639     hwnd[n] = pm->WinList[i];
640     }
641     n++;
642     }
643 yutakapon 5223 *num = n;
644     }
645 yutakapon 5222
646 yutakapon 5223 // �E�B���h�E�����E���������\������(Show Windows Side by Side)
647 zmatsuo 7305 void WINAPI ShowAllWinSidebySide(HWND myhwnd)
648 yutakapon 5223 {
649     int n;
650     HWND hwnd[MAXNWIN];
651    
652 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE);
653 yutakapon 5251 TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd);
654 yutakapon 5222 }
655    
656     // �E�B���h�E���������������\������(Show Windows Stacked)
657 zmatsuo 7305 void WINAPI ShowAllWinStacked(HWND myhwnd)
658 yutakapon 5222 {
659 yutakapon 5223 int n;
660 yutakapon 5222 HWND hwnd[MAXNWIN];
661    
662 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED);
663 yutakapon 5251 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd);
664 yutakapon 5222 }
665    
666     // �E�B���h�E���d�����\������(Cascade)
667 zmatsuo 7305 void WINAPI ShowAllWinCascade(HWND myhwnd)
668 yutakapon 5222 {
669 yutakapon 5223 int n;
670     HWND hwnd[MAXNWIN];
671    
672 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_CASCADE);
673 yutakapon 5251 CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, n, hwnd);
674 yutakapon 5222 }
675    
676 yutakapon 5232 // �STera Term���I���w�����o���B
677 zmatsuo 7305 void WINAPI BroadcastClosingMessage(HWND myhwnd)
678 yutakapon 5232 {
679     int i, max;
680     HWND hwnd[MAXNWIN];
681    
682     // Tera Term���I�����������A���L���������������������A
683     // ���������o�b�t�@���R�s�[���������B
684     max = pm->NWin;
685     for (i = 0 ; i < pm->NWin ; i++) {
686     hwnd[i] = pm->WinList[i];
687     }
688    
689     for (i = 0 ; i < max ; i++) {
690     // �������g�������������B
691 doda 6435 if (hwnd[i] == myhwnd)
692 yutakapon 5232 continue;
693    
694     PostMessage(hwnd[i], WM_USER_NONCONFIRM_CLOSE, 0, 0);
695     }
696     PostMessage(myhwnd, WM_USER_NONCONFIRM_CLOSE, 0, 0);
697     }
698    
699    
700 zmatsuo 7305 int WINAPI CommReadRawByte(PComVar cv, LPBYTE b)
701 maya 3227 {
702 maya 3392 if ( ! cv->Ready ) {
703 maya 3227 return 0;
704 maya 3392 }
705 maya 3227
706     if ( cv->InBuffCount>0 ) {
707     *b = cv->InBuff[cv->InPtr];
708     cv->InPtr++;
709     cv->InBuffCount--;
710 maya 3392 if ( cv->InBuffCount==0 ) {
711 maya 3227 cv->InPtr = 0;
712 maya 3392 }
713 maya 3227 return 1;
714     }
715     else {
716     cv->InPtr = 0;
717     return 0;
718     }
719     }
720    
721 zmatsuo 8897 static void LogBinSkip(PComVar cv, int add)
722     {
723     if (cv->LogBinSkip != NULL) {
724     cv->LogBinSkip(add);
725     }
726     }
727    
728 zmatsuo 7305 void WINAPI CommInsert1Byte(PComVar cv, BYTE b)
729 maya 3227 {
730 maya 3392 if ( ! cv->Ready ) {
731 maya 3227 return;
732 maya 3392 }
733 maya 3227
734 maya 3392 if (cv->InPtr == 0) {
735 maya 3227 memmove(&(cv->InBuff[1]),&(cv->InBuff[0]),cv->InBuffCount);
736 maya 3392 }
737     else {
738 maya 3227 cv->InPtr--;
739 maya 3392 }
740 maya 3227 cv->InBuff[cv->InPtr] = b;
741     cv->InBuffCount++;
742    
743 zmatsuo 8897 LogBinSkip(cv, 1);
744 maya 3227 }
745    
746 zmatsuo 8897 static void Log1Bin(PComVar cv, BYTE b)
747 maya 3227 {
748 zmatsuo 8897 if (cv->Log1Bin != NULL) {
749     cv->Log1Bin(b);
750 maya 3392 }
751 maya 3227 }
752    
753 zmatsuo 7305 int WINAPI CommRead1Byte(PComVar cv, LPBYTE b)
754 maya 3227 {
755     int c;
756    
757 maya 3392 if ( ! cv->Ready ) {
758 maya 3227 return 0;
759 maya 3392 }
760 maya 3227
761 maya 3392 if ( cv->TelMode ) {
762 maya 3227 c = 0;
763 maya 3392 }
764     else {
765 maya 3227 c = CommReadRawByte(cv,b);
766 maya 3392 }
767 maya 3227
768     if ((c==1) && cv->TelCRFlag) {
769     cv->TelCRFlag = FALSE;
770 maya 3392 if (*b==0) {
771     c = 0;
772     }
773 maya 3227 }
774    
775     if ( c==1 ) {
776     if ( cv->IACFlag ) {
777     cv->IACFlag = FALSE;
778     if ( *b != 0xFF ) {
779     cv->TelMode = TRUE;
780     CommInsert1Byte(cv,*b);
781 zmatsuo 8897 LogBinSkip(cv, -1);
782 maya 3227 c = 0;
783     }
784     }
785     else if ((cv->PortType==IdTCPIP) && (*b==0xFF)) {
786 maya 3392 if (!cv->TelFlag && cv->TelAutoDetect) { /* TTPLUG */
787 maya 3227 cv->TelFlag = TRUE;
788 maya 3392 }
789 maya 3227 if (cv->TelFlag) {
790     cv->IACFlag = TRUE;
791     c = 0;
792     }
793     }
794 maya 3392 else if (cv->TelFlag && ! cv->TelBinRecv && (*b==0x0D)) {
795 maya 3227 cv->TelCRFlag = TRUE;
796 maya 3392 }
797 maya 3227 }
798    
799 zmatsuo 8897 if (c == 1) {
800 maya 3227 Log1Bin(cv, *b);
801 maya 3392 }
802 maya 3227
803     return c;
804     }
805    
806 doda 8445 int WINAPI CommRawOut(PComVar cv, /*const*/ PCHAR B, int C)
807 maya 3227 {
808     int a;
809    
810 maya 3392 if ( ! cv->Ready ) {
811 maya 3227 return C;
812 maya 3392 }
813 maya 3227
814 maya 3392 if (C > OutBuffSize - cv->OutBuffCount) {
815 maya 3227 a = OutBuffSize - cv->OutBuffCount;
816 maya 3392 }
817     else {
818 maya 3227 a = C;
819 maya 3392 }
820 maya 3227 if ( cv->OutPtr > 0 ) {
821     memmove(&(cv->OutBuff[0]),&(cv->OutBuff[cv->OutPtr]),cv->OutBuffCount);
822     cv->OutPtr = 0;
823     }
824     memcpy(&(cv->OutBuff[cv->OutBuffCount]),B,a);
825     cv->OutBuffCount = cv->OutBuffCount + a;
826     return a;
827     }
828    
829 zmatsuo 7305 int WINAPI CommBinaryOut(PComVar cv, PCHAR B, int C)
830 maya 3227 {
831     int a, i, Len;
832     char d[3];
833    
834 maya 3392 if ( ! cv->Ready ) {
835 maya 3227 return C;
836 maya 3392 }
837 maya 3227
838     i = 0;
839     a = 1;
840     while ((a>0) && (i<C)) {
841     Len = 0;
842    
843     d[Len] = B[i];
844     Len++;
845    
846 doda 3505 if ( cv->TelFlag && (B[i]=='\x0d') && ! cv->TelBinSend ) {
847     d[Len++] = '\x00';
848 maya 3227 }
849 doda 3505 else if ( cv->TelFlag && (B[i]=='\xff') ) {
850     d[Len++] = '\xff';
851     }
852 maya 3227
853 doda 3505 if ( OutBuffSize - cv->OutBuffCount - Len >= 0 ) {
854     CommRawOut(cv, d, Len);
855 maya 3227 a = 1;
856     }
857 maya 3392 else {
858 maya 3227 a = 0;
859 maya 3392 }
860 maya 3227
861 doda 3505 i += a;
862 maya 3227 }
863     return i;
864     }
865    
866 doda 8445 /**
867     * �f�[�^(������)���o���o�b�t�@����������
868     *
869     * �w���f�[�^��������������������������������������
870     * CommRawOut() ��������������������������
871     *
872     * @retval TRUE �o��������
873     * @retval FALSE �o��������������(buffer full)
874     */
875     static BOOL WriteOutBuff(PComVar cv, const char *TempStr, int TempLen)
876     {
877     BOOL output;
878    
879     if (TempLen == 0) {
880     // ����0������������������������
881     return TRUE;
882     }
883    
884     output = FALSE;
885     if (cv->TelLineMode) {
886     const BOOL Full = OutBuffSize - cv->LineModeBuffCount - TempLen < 0;
887     if (!Full) {
888     output = TRUE;
889     memcpy(&(cv->LineModeBuff[cv->LineModeBuffCount]), TempStr, TempLen);
890     cv->LineModeBuffCount += TempLen;
891     if (cv->Flush) {
892     cv->FlushLen = cv->LineModeBuffCount;
893     }
894     }
895     if (cv->FlushLen > 0) {
896     const int OutLen = CommRawOut(cv, cv->LineModeBuff, cv->FlushLen);
897     cv->FlushLen -= OutLen;
898     cv->LineModeBuffCount -= OutLen;
899     memmove(cv->LineModeBuff, &(cv->LineModeBuff[OutLen]), cv->LineModeBuffCount);
900     }
901     cv->Flush = FALSE;
902     }
903     else {
904     const BOOL Full = OutBuffSize-cv->OutBuffCount-TempLen < 0;
905     if (! Full) {
906     output = TRUE;
907     CommRawOut(cv, (char *)TempStr, TempLen);
908     }
909     }
910     return output;
911     }
912    
913     /**
914     * �f�[�^(������)�������o�b�t�@����������
915     * �����o�b�t�@�������� -> �G�R�[������
916     *
917     * @retval TRUE �o��������
918     * @retval FALSE �o��������������(buffer full)
919     */
920     static BOOL WriteInBuff(PComVar cv, const char *TempStr, int TempLen)
921     {
922     BOOL Full;
923    
924     if (TempLen == 0) {
925     return TRUE;
926     }
927    
928     Full = InBuffSize-cv->InBuffCount-TempLen < 0;
929     if (! Full) {
930     memcpy(&(cv->InBuff[cv->InBuffCount]),TempStr,TempLen);
931     cv->InBuffCount = cv->InBuffCount + TempLen;
932     return TRUE;
933     }
934     return FALSE;
935     }
936    
937     /**
938     * �����o�b�t�@�����������������������l����
939     */
940     static void PackInBuff(PComVar cv)
941     {
942     if ( (cv->InPtr>0) && (cv->InBuffCount>0) ) {
943     memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
944     cv->InPtr = 0;
945     }
946     }
947    
948 zmatsuo 7305 int WINAPI CommBinaryBuffOut(PComVar cv, PCHAR B, int C)
949 doda 3505 {
950 doda 8445 int a, i, Len;
951 doda 3505 char d[3];
952    
953     if ( ! cv->Ready ) {
954     return C;
955     }
956    
957     i = 0;
958     a = 1;
959     while ((a>0) && (i<C)) {
960     Len = 0;
961    
962     d[Len] = B[i];
963     Len++;
964    
965     if (B[i] == CR) {
966     if ( cv->TelFlag && ! cv->TelBinSend ) {
967     d[Len++] = '\x00';
968     }
969     if (cv->TelLineMode) {
970     cv->Flush = TRUE;
971     }
972     }
973     else if ( cv->TelFlag && (B[i]=='\xff') ) {
974     d[Len++] = '\xff';
975     }
976    
977 doda 8445 if (WriteOutBuff(cv, d, Len)) {
978     a = 1;
979     i++;
980     } else {
981     a = 0;
982 doda 3505 }
983     }
984     return i;
985     }
986    
987 doda 8445 /**
988     * @retval true ���{�������p�J�^�J�i
989     * @retval false ������
990     */
991     static BOOL IsHalfWidthKatakana(unsigned int u32)
992     {
993     // Halfwidth CJK punctuation (U+FF61�`FF64)
994     // Halfwidth Katakana variants (U+FF65�`FF9F)
995     return (0xff61 <= u32 && u32 <= 0xff9f);
996     }
997    
998     /**
999     * �o���p�A TODO echo�p������
1000     * @param cv
1001     * @param u32 ��������
1002     * @param check_only TRUE���������s�����A
1003     * @param TempStr �o��������
1004     * @param StrLen TempStr�����o��������
1005     * @retval �������s����
1006     */
1007     static BOOL OutControl(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1008     {
1009     const wchar_t d = u32;
1010     size_t TempLen = 0;
1011     BOOL retval = FALSE;
1012     if (check_only == TRUE) {
1013     /* �`�F�b�N���� */
1014     if (d == CR || d == BS || d == 0x15/*ctrl-u*/) {
1015     return TRUE;
1016     } else {
1017     return FALSE;
1018     }
1019     }
1020     if (d==CR) {
1021     TempStr[TempLen++] = 0x0d;
1022     if (cv->CRSend==IdCRLF) {
1023     TempStr[TempLen++] = 0x0a;
1024     }
1025     else if ((cv->CRSend ==IdCR) &&
1026     cv->TelFlag && ! cv->TelBinSend) {
1027     TempStr[TempLen++] = 0;
1028     }
1029     else if (cv->CRSend == IdLF) {
1030     TempStr[TempLen-1] = 0x0a;
1031     }
1032 doda 3494 if (cv->TelLineMode) {
1033 doda 8445 cv->Flush = TRUE;
1034     }
1035     retval = TRUE;
1036     }
1037     else if (d== BS) {
1038     if (cv->TelLineMode) {
1039     if (cv->FlushLen < cv->LineModeBuffCount) {
1040     cv->LineModeBuffCount--;
1041     }
1042     }
1043     else {
1044     TempStr[TempLen++] = BS;
1045     }
1046     retval = TRUE;
1047     }
1048     else if (d==0x15) { // ctrl-u
1049     if (cv->TelLineMode) {
1050     cv->LineModeBuffCount = cv->FlushLen;
1051     }
1052     else {
1053     TempStr[TempLen++] = 0x15;
1054     }
1055     retval = TRUE;
1056     }
1057     *StrLen = TempLen;
1058     return retval;
1059     }
1060     static BOOL ControlEcho(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1061     {
1062     const wchar_t d = u32;
1063     size_t TempLen = 0;
1064     BOOL retval = FALSE;
1065     if (check_only == TRUE) {
1066     /* �`�F�b�N���� */
1067     if (d == CR || (d == 0x15/*ctrl-u*/ && cv->TelLineMode)) {
1068     return TRUE;
1069     } else {
1070     return FALSE;
1071     }
1072     }
1073     if (d==CR) {
1074     TempStr[TempLen++] = 0x0d;
1075     if (cv->CRSend==IdCRLF) {
1076     TempStr[TempLen++] = 0x0a;
1077     }
1078     else if ((cv->CRSend ==IdCR) && cv->TelFlag && ! cv->TelBinSend) {
1079     TempStr[TempLen++] = 0;
1080     }
1081     else if (cv->CRSend == IdLF) {
1082     TempStr[TempLen-1] = 0x0a;
1083     }
1084     retval = TRUE;
1085     }
1086     else if (d==0x15/*ctrl-u*/ && cv->TelLineMode) {
1087     // Move to top of line (CHA "\033[G") and erase line (EL "\033[K")
1088     memcpy(TempStr, "\033[G\033[K", 6);
1089     TempLen += 6;
1090     retval = TRUE;
1091     }
1092     *StrLen = TempLen;
1093     return retval;
1094     }
1095    
1096     /**
1097     * �o���p����������������
1098     *
1099     * @retval ��������������
1100     */
1101     typedef struct {
1102     int KanjiCode; // [in]�o�������R�[�h(sjis,jis����)
1103     BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen);
1104     // state�����������K�v�����������R�[�h���g�p
1105     BOOL JIS7Katakana; // [in](Kanji JIS)kana
1106     int SendCode; // [in,out](Kanji JIS)���O�����M�R�[�h Ascii/Kana/Kanji
1107     BOOL KanjiFlag; // [in,out](MBCS)���O��1byte��������������?(2byte������������?)
1108     BYTE KanjiFirst; // [in,out](MBCS)���O��1byte
1109     } OutputCharState;
1110    
1111     /**
1112     * unicode(UTF-16)����unicode(UTF-32)��1���������o����
1113     * �o���f�[�^(TempStr)����������
1114     */
1115     static size_t MakeOutputString(PComVar cv, OutputCharState *states,
1116     const wchar_t *B, int C,
1117     char *TempStr, int *TempLen_)
1118     {
1119     BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1120     = states->ControlOut;
1121     //
1122     int TempLen = 0;
1123     size_t TempLen2;
1124     size_t output_char_count; // ��������������
1125    
1126     // UTF-32 ��1���������o��
1127     unsigned int u32;
1128     size_t u16_len = UTF16ToUTF32(B, C, &u32);
1129     if (u16_len == 0) {
1130     // �f�R�[�h��������? ����������������?
1131     assert(FALSE);
1132     u32 = '?';
1133     u16_len = 1;
1134     }
1135     output_char_count = u16_len;
1136    
1137     // �e���V�t�g����������������
1138     if (u32 < 0x100 || ControlOut(cv, u32, TRUE, NULL, NULL)) {
1139     if (cv->Language == IdJapanese && states->KanjiCode == IdJIS) {
1140     // �����������A���{��,JIS��������
1141     if (cv->SendCode == IdKanji) {
1142     // �����������������A����OUT
1143     TempStr[TempLen++] = 0x1B;
1144     TempStr[TempLen++] = '(';
1145     switch (cv->KanjiOut) {
1146     case IdKanjiOutJ:
1147     TempStr[TempLen++] = 'J';
1148     break;
1149     case IdKanjiOutH:
1150     TempStr[TempLen++] = 'H';
1151     break;
1152     default:
1153     TempStr[TempLen++] = 'B';
1154 doda 3494 }
1155     }
1156 doda 8445
1157     if (states->JIS7Katakana == 1) {
1158     if (cv->SendCode == IdKatakana) {
1159     TempStr[TempLen++] = SO;
1160     }
1161 doda 3494 }
1162 doda 8445
1163     states->SendCode = IdASCII;
1164 maya 3227 }
1165 doda 8445 }
1166    
1167     // 1������������
1168     if (ControlOut(cv, u32, FALSE, TempStr, &TempLen2)) {
1169     // ��������������������
1170     TempLen += TempLen2;
1171     output_char_count = 1;
1172     } else if (cv->Language == IdUtf8 ||
1173     (cv->Language == IdJapanese && states->KanjiCode == IdUTF8) ||
1174 zmatsuo 9499 (cv->Language == IdKorean && states->KanjiCode == IdUTF8) ||
1175     (cv->Language == IdChinese && states->KanjiCode == IdUTF8))
1176 doda 8445 {
1177     // UTF-8 ���o��
1178     size_t utf8_len = sizeof(TempStr);
1179     utf8_len = UTF32ToUTF8(u32, TempStr, utf8_len);
1180     TempLen += utf8_len;
1181 zmatsuo 9314 } else if (cv->Language == IdJapanese) {
1182 doda 8445 // ���{��
1183     // ���� CP932(SJIS) ���������������o��
1184     char mb_char[2];
1185     size_t mb_len = sizeof(mb_char);
1186     mb_len = UTF32ToMBCP(u32, 932, mb_char, mb_len);
1187     if (mb_len == 0) {
1188     // SJIS��������������
1189     TempStr[TempLen++] = '?';
1190     } else {
1191     switch (states->KanjiCode) {
1192     case IdEUC:
1193     // TODO ���p�J�i
1194     if (mb_len == 1) {
1195     TempStr[TempLen++] = mb_char[0];
1196     } else {
1197     WORD K;
1198     K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1199     (WORD)(unsigned char)mb_char[1];
1200     K = SJIS2EUC(K);
1201     TempStr[TempLen++] = HIBYTE(K);
1202     TempStr[TempLen++] = LOBYTE(K);
1203     }
1204     break;
1205     case IdJIS:
1206     if (u32 < 0x100) {
1207     // ASCII
1208     TempStr[TempLen++] = mb_char[0];
1209     states->SendCode = IdASCII;
1210     } else if (IsHalfWidthKatakana(u32)) {
1211     // ���p�J�^�J�i
1212     if (states->JIS7Katakana==1) {
1213     if (cv->SendCode != IdKatakana) {
1214     TempStr[TempLen++] = SI;
1215     }
1216     TempStr[TempLen++] = mb_char[0] & 0x7f;
1217     } else {
1218     TempStr[TempLen++] = mb_char[0];
1219     }
1220     states->SendCode = IdKatakana;
1221     } else {
1222     // ����
1223     WORD K;
1224     K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1225     (WORD)(unsigned char)mb_char[1];
1226     K = SJIS2JIS(K);
1227     if (states->SendCode != IdKanji) {
1228     // ����IN
1229     TempStr[TempLen++] = 0x1B;
1230     TempStr[TempLen++] = '$';
1231     if (cv->KanjiIn == IdKanjiInB) {
1232     TempStr[TempLen++] = 'B';
1233     }
1234     else {
1235     TempStr[TempLen++] = '@';
1236     }
1237     states->SendCode = IdKanji;
1238     }
1239     TempStr[TempLen++] = HIBYTE(K);
1240     TempStr[TempLen++] = LOBYTE(K);
1241     }
1242     break;
1243     case IdSJIS:
1244     if (mb_len == 1) {
1245     TempStr[TempLen++] = mb_char[0];
1246     } else {
1247     TempStr[TempLen++] = mb_char[0];
1248     TempStr[TempLen++] = mb_char[1];
1249     }
1250     break;
1251     default:
1252     assert(FALSE);
1253     break;
1254 doda 3494 }
1255     }
1256 doda 8445 } else if (cv->Language == IdRussian) {
1257     /* ����CP1251�����������o�� */
1258     char mb_char[2];
1259     size_t mb_len = sizeof(mb_char);
1260     BYTE b;
1261     mb_len = UTF32ToMBCP(u32, 1251, mb_char, mb_len);
1262     if (mb_len != 1) {
1263     b = '?';
1264     } else {
1265 zmatsuo 9497 b = RussConv(IdWindows, states->KanjiCode, mb_char[0]);
1266 doda 8445 }
1267     TempStr[TempLen++] = b;
1268 zmatsuo 9314 } else if (cv->Language == IdKorean || cv->Language == IdChinese) {
1269     int code_page;
1270 doda 8445 char mb_char[2];
1271 zmatsuo 9314 size_t mb_len;
1272     if (cv->Language == IdKorean) {
1273     code_page = 51949;
1274     } else if (cv->Language == IdChinese) {
1275     switch (states->KanjiCode) {
1276     case IdCnGB2312:
1277     code_page = 936;
1278     break;
1279     case IdCnBig5:
1280     code_page = 950;
1281     break;
1282     default:
1283     assert(FALSE);
1284 zmatsuo 9463 code_page = 936;
1285 zmatsuo 9314 break;
1286     }
1287     }
1288     /* code_page �����������o�� */
1289     mb_len = sizeof(mb_char);
1290     mb_len = UTF32ToMBCP(u32, code_page, mb_char, mb_len);
1291 doda 8445 if (mb_len == 0) {
1292     TempStr[TempLen++] = '?';
1293     }
1294     else if (mb_len == 1) {
1295     TempStr[TempLen++] = mb_char[0];
1296     } else {
1297     TempStr[TempLen++] = mb_char[0];
1298     TempStr[TempLen++] = mb_char[1];
1299     }
1300     } else if (cv->Language == IdEnglish) {
1301     TempStr[TempLen++] = u32;
1302     } else {
1303 zmatsuo 9314 assert(FALSE);
1304 doda 8445 }
1305 maya 3227
1306 doda 8445 *TempLen_ = TempLen;
1307     return output_char_count;
1308 maya 3227 }
1309    
1310 doda 8445
1311     /**
1312     * CommTextOut() �� wchar_t ��
1313     *
1314     * @retval �o��������(wchar_t�P��)
1315     */
1316 zmatsuo 7484 int WINAPI CommTextOutW(PComVar cv, const wchar_t *B, int C)
1317     {
1318 doda 8445 char TempStr[12];
1319     BOOL Full = FALSE;
1320     int i = 0;
1321     while (! Full && (i < C)) {
1322     // �o���p�f�[�^������
1323     int TempLen = 0;
1324     size_t output_char_count; // ��������������
1325     OutputCharState state;
1326     state.KanjiCode = cv->KanjiCodeSend;
1327     state.ControlOut = OutControl;
1328     state.SendCode = cv->SendCode;
1329     state.JIS7Katakana = cv->JIS7KatakanaSend;
1330     output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1331    
1332     // �f�[�^���o���o�b�t�@��
1333     if (WriteOutBuff(cv, TempStr, TempLen)) {
1334     i += output_char_count; // output_char_count ������ ��������
1335     // ��������������������
1336     cv->SendCode = state.SendCode;
1337     } else {
1338     Full = TRUE;
1339     }
1340     } // end of "while {}"
1341     _CrtCheckMemory();
1342     return i;
1343 zmatsuo 7484 }
1344    
1345 doda 8445 /**
1346     * CommTextEcho() �� wchar_t ��
1347     *
1348     * @retval �o��������(wchar_t�P��)
1349     */
1350 zmatsuo 7484 int WINAPI CommTextEchoW(PComVar cv, const wchar_t *B, int C)
1351     {
1352 doda 8445 char TempStr[12];
1353     BOOL Full = FALSE;
1354     int i = 0;
1355     while (! Full && (i < C)) {
1356     // �o���p�f�[�^������
1357     int TempLen = 0;
1358     size_t output_char_count; // ��������������
1359     OutputCharState state;
1360     state.KanjiCode = cv->KanjiCodeEcho;
1361     state.ControlOut = ControlEcho;
1362     state.SendCode = cv->EchoCode;
1363     state.JIS7Katakana = cv->JIS7KatakanaEcho;
1364     output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1365    
1366     // �f�[�^���o���o�b�t�@��
1367     if (WriteInBuff(cv, TempStr, TempLen)) {
1368     i += output_char_count; // output_char_count ������ ��������
1369     // ��������������������
1370     cv->EchoCode = state.SendCode;
1371     } else {
1372     Full = TRUE;
1373     }
1374     } // end of "while {}"
1375     _CrtCheckMemory();
1376     return i;
1377 zmatsuo 7484 }
1378    
1379 zmatsuo 7305 int WINAPI CommBinaryEcho(PComVar cv, PCHAR B, int C)
1380 maya 3227 {
1381     int a, i, Len;
1382     char d[3];
1383    
1384     if ( ! cv->Ready )
1385     return C;
1386    
1387 doda 8445 PackInBuff(cv);
1388 maya 3227
1389     i = 0;
1390     a = 1;
1391     while ((a>0) && (i<C)) {
1392     Len = 0;
1393    
1394     d[Len] = B[i];
1395     Len++;
1396    
1397     if ( cv->TelFlag && (B[i]=='\x0d') &&
1398     ! cv->TelBinSend ) {
1399     d[Len] = 0x00;
1400     Len++;
1401     }
1402    
1403     if ( cv->TelFlag && (B[i]=='\xff') ) {
1404     d[Len] = '\xff';
1405     Len++;
1406     }
1407    
1408 doda 8445 if (WriteInBuff(cv, d, Len)) {
1409 maya 3227 a = 1;
1410 doda 8445 i++;
1411     } else {
1412     a = 0;
1413 maya 3227 }
1414     }
1415     return i;
1416     }
1417    
1418 yutakapon 8188 /*
1419 zmatsuo 7304 * @return �G���[���L������ FALSE
1420     * @param[in] BOOL first_instance
1421     */
1422     static BOOL OpenSharedMemory(BOOL *first_instance_)
1423     {
1424     int i;
1425     HMap = NULL;
1426     pm = NULL;
1427     for (i = 0; i < 100; i++) {
1428     char tmp[32];
1429     HANDLE hMap;
1430     BOOL first_instance;
1431 zmatsuo 7306 TMap *map;
1432 zmatsuo 7304 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, i == 0 ? "%s" : "%s_%d", TT_FILEMAPNAME, i);
1433     hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
1434     0, sizeof(TMap), tmp);
1435     if (hMap == NULL) {
1436     return FALSE;
1437     }
1438    
1439     first_instance = (GetLastError() != ERROR_ALREADY_EXISTS);
1440    
1441 zmatsuo 7306 map = (TMap *)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
1442 zmatsuo 7304 if (map == NULL) {
1443     return FALSE;
1444     }
1445    
1446     if (first_instance ||
1447     (map->size_tmap == sizeof(TMap) &&
1448     map->size_tttset == sizeof(TTTSet)))
1449     {
1450     map->size_tmap = sizeof(TMap);
1451     map->size_tttset = sizeof(TTTSet);
1452     HMap = hMap;
1453     pm = map;
1454     *first_instance_ = first_instance;
1455     return TRUE;
1456     }
1457    
1458     // next try
1459     UnmapViewOfFile(map);
1460     CloseHandle(hMap);
1461     }
1462     return FALSE;
1463     }
1464    
1465 maya 3227 BOOL WINAPI DllMain(HANDLE hInstance,
1466     ULONG ul_reason_for_call,
1467     LPVOID lpReserved)
1468     {
1469     switch( ul_reason_for_call ) {
1470     case DLL_THREAD_ATTACH:
1471     /* do thread initialization */
1472     break;
1473     case DLL_THREAD_DETACH:
1474     /* do thread cleanup */
1475     break;
1476     case DLL_PROCESS_ATTACH:
1477     /* do process initialization */
1478 zmatsuo 9314 #ifdef _DEBUG
1479     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
1480     #endif
1481 maya 3227 hInst = hInstance;
1482 zmatsuo 7304 if (OpenSharedMemory(&FirstInstance) == FALSE) {
1483     // dll���[�h���s�Ateraterm���N��������
1484 maya 3227 return FALSE;
1485 maya 3392 }
1486 doda 8445 WinCompatInit();
1487 maya 3227 break;
1488     case DLL_PROCESS_DETACH:
1489     /* do process cleanup */
1490     UnmapViewOfFile(pm);
1491     CloseHandle(HMap);
1492     break;
1493     }
1494     return TRUE;
1495     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26