Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Annotation of /trunk/TTXSamples/TTXResizeMenu/TTXResizeMenu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 109 - (hide annotations) (download) (as text)
Tue Feb 17 13:53:56 2009 UTC (15 years, 3 months ago) by maya
Original Path: TTXSamples/trunk/TTXResizeMenu/TTXResizeMenu.c
File MIME type: text/x-csrc
File size: 7169 byte(s)
* Windows 95
- Winsock2 が必須
- ttermpro の起動に IE4 以上が必須
- ヘルプの表示に IE5 以上が必須
- LogMeTTc は動かない
- TTLEdit はボタンの色がうまく出ない

* NT 4.0
- ヘルプの表示に IE5 以上が必須
- LogMeTT, TTLEdit の起動に SP4(?)以上 が必須
- LogMeTTc の起動に SP6 以上が必須

1 maya 81 #include "teraterm.h"
2     #include "tttypes.h"
3     #include "ttplugin.h"
4     #include "tt_res.h"
5     #include <stdlib.h>
6     #include <stdio.h>
7     #include <string.h>
8    
9 maya 109 // VS2005でビルドされたバイナリが Windows95 でも起動できるようにするために、
10     // IsDebuggerPresent()のシンボル定義を追加する。
11     //
12     // cf.http://jet2.u-abel.net/program/tips/forceimp.htm
13     // 装飾された名前のアドレスを作るための仮定義
14     // (これだけでインポートを横取りしている)
15     EXTERN_C int WINAPI _imp__IsDebuggerPresent()
16     { return PtrToInt((void*) &_imp__IsDebuggerPresent); }
17     // 実際に横取り処理を行う関数
18     EXTERN_C BOOL WINAPI Cover_IsDebuggerPresent()
19     { return FALSE; }
20     // 関数が実際に呼び出されたときに備えて
21     // 横取り処理関数を呼び出させるための下準備
22     EXTERN_C void __stdcall DoCover_IsDebuggerPresent()
23     {
24     DWORD dw;
25     DWORD_PTR FAR* lpdw;
26     // 横取り関数を設定するアドレスを取得
27     lpdw = (DWORD_PTR FAR*) &_imp__IsDebuggerPresent;
28     // このアドレスを書き込めるように設定
29     // (同じプログラム内なので障害なく行える)
30     VirtualProtect(lpdw, sizeof(DWORD_PTR), PAGE_READWRITE, &dw);
31     // 横取り関数を設定
32     *lpdw = (DWORD_PTR)(FARPROC) Cover_IsDebuggerPresent;
33     // 読み書きの状態を元に戻す
34     VirtualProtect(lpdw, sizeof(DWORD_PTR), dw, NULL);
35     }
36     // アプリケーションが初期化される前に下準備を呼び出す
37     // ※ かなり早くに初期化したいときは、このコードを
38     // ファイルの末尾に書いて「#pragma init_seg(lib)」を、
39     // この変数宣言の手前に書きます。
40     // 初期化を急ぐ必要が無い場合は WinMain 内から
41     // DoCover_IsDebuggerPresent を呼び出して構いません。
42     EXTERN_C int s_DoCover_IsDebuggerPresent
43     = (int) (DoCover_IsDebuggerPresent(), 0);
44    
45 maya 81 #define ORDER 5900
46 doda 87 #define SECTION "Resize Menu"
47 maya 81
48 doda 89 int def_resize_list[][2] = {
49 maya 81 {80, 37},
50     {120, 52},
51     {80, 24},
52     {110, 37}
53     };
54    
55 doda 108 #define ID_MENUID_BASE 55101
56 doda 87 #define MAX_MENU_ITEMS 20
57 maya 81
58     static HANDLE hInst; /* Instance handle of TTX*.DLL */
59    
60     typedef struct {
61     PTTSet ts;
62     PComVar cv;
63     HMENU ResizeMenu;
64     BOOL ReplaceTermDlg;
65 doda 87 PReadIniFile origReadIniFile;
66 doda 89 int MenuItems;
67     int ResizeList[MAX_MENU_ITEMS][2];
68 maya 81 } TInstVar;
69    
70     static TInstVar FAR * pvar;
71    
72     /* WIN32 allows multiple instances of a DLL */
73     static TInstVar InstVar;
74    
75     void InitMenu() {
76 doda 89 int i, x, y;
77 maya 81 char tmp[20];
78    
79     if (pvar->ResizeMenu != NULL) {
80     DestroyMenu(pvar->ResizeMenu);
81     }
82    
83     pvar->ResizeMenu = CreateMenu();
84    
85 doda 87 for (i=0; i < pvar->MenuItems; i++) {
86     x = pvar->ResizeList[i][0];
87     y = pvar->ResizeList[i][1];
88     if (i < 15) {
89     if (x == 0)
90 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "height: %d(&%x)", y, i+1);
91 doda 87 else if (y == 0)
92 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "width: %d(&%x)", x, i+1);
93 doda 87 else
94 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%dx%d(&%x)", x, y, i+1);
95 doda 87 }
96     else if (i < 35) {
97     if (x == 0)
98 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "height: %d(&%c)", y, 'a' + i - 9);
99 doda 87 else if (y == 0)
100 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "width: %d(&%c)", x, 'a' + i - 9);
101 doda 87 else
102 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%dx%d(&%c)", x, y, 'a' + i - 9);
103 doda 87 }
104     else {
105     if (x == 0)
106 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "height: %d", y);
107 doda 87 else if (y == 0)
108 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "width: %d", x);
109 doda 87 else
110 doda 89 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%dx%d", x, y);
111 doda 87 }
112 maya 81 InsertMenu(pvar->ResizeMenu, -1, MF_BYPOSITION, ID_MENUID_BASE+i, tmp);
113     }
114     }
115    
116     static void PASCAL FAR TTXInit(PTTSet ts, PComVar cv) {
117 doda 87 int i;
118    
119 maya 81 pvar->ts = ts;
120     pvar->cv = cv;
121     pvar->ReplaceTermDlg = FALSE;
122     pvar->ResizeMenu = NULL;
123    
124 doda 87 pvar->MenuItems = sizeof(def_resize_list)/sizeof(def_resize_list[0]);
125    
126     for (i=0; i < pvar->MenuItems; i++) {
127     pvar->ResizeList[i][0] = def_resize_list[i][0];
128     pvar->ResizeList[i][1] = def_resize_list[i][1];
129     }
130    
131 maya 81 InitMenu();
132     }
133    
134     static BOOL FAR PASCAL TTXSetupTerminal(HWND parent, PTTSet ts) {
135     pvar->ReplaceTermDlg = FALSE;
136     return (TRUE);
137     }
138    
139     static void PASCAL FAR TTXGetUIHooks(TTXUIHooks FAR * hooks) {
140     if (pvar->ReplaceTermDlg) {
141     *hooks->SetupTerminal = TTXSetupTerminal;
142     }
143     return;
144     }
145    
146 doda 87 static void PASCAL FAR ResizeMenuReadIniFile(PCHAR fn, PTTSet ts) {
147 doda 89 int i, x, y;
148 doda 87 char Key[20], Buff[100];
149    
150     (pvar->origReadIniFile)(fn, ts);
151    
152     for (i=0; i<MAX_MENU_ITEMS; i++) {
153     _snprintf_s(Key, sizeof(Key), _TRUNCATE, "ResizeMenu%d", i+1);
154     GetPrivateProfileString(SECTION, Key, "\n", Buff, sizeof(Buff), fn);
155    
156 doda 89 if (sscanf_s(Buff, "%d , %d", &x, &y) == 2) {
157     if (x < 0 ) {
158     x = 0;
159 doda 87 }
160 doda 89
161     if (y < 0 ) {
162     y = 0;
163     }
164    
165 doda 87 if (x > TermWidthMax ) {
166     x = TermWidthMax;
167     }
168 doda 89
169 doda 87 if (y > TermHeightMax ) {
170     y = TermHeightMax;
171     }
172 doda 89
173     if (x == 0 && y == 0) {
174     break;
175     }
176    
177 doda 87 pvar->ResizeList[i][0] = x;
178     pvar->ResizeList[i][1] = y;
179     }
180     else {
181     break;
182     }
183     }
184    
185     if (i == 0) {
186     pvar->MenuItems = sizeof(def_resize_list)/sizeof(def_resize_list[0]);
187    
188     for (i=0; i < pvar->MenuItems; i++) {
189     pvar->ResizeList[i][0] = def_resize_list[i][0];
190     pvar->ResizeList[i][1] = def_resize_list[i][1];
191     }
192     }
193     else {
194     pvar->MenuItems = i;
195     }
196     }
197    
198     static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks) {
199     pvar->origReadIniFile = *hooks->ReadIniFile;
200     *hooks->ReadIniFile = ResizeMenuReadIniFile;
201     }
202    
203 maya 81 static void PASCAL FAR TTXModifyMenu(HMENU menu) {
204     MENUITEMINFO mi;
205    
206     InitMenu();
207    
208     memset(&mi, 0, sizeof(mi));
209     mi.cbSize = sizeof(mi);
210     mi.fMask = MIIM_TYPE | MIIM_SUBMENU;
211     mi.fType = MFT_STRING;
212     mi.hSubMenu = pvar->ResizeMenu;
213     mi.dwTypeData = "Resi&ze";
214     InsertMenuItem(menu, ID_HELPMENU, FALSE, &mi);
215     }
216    
217     static int PASCAL FAR TTXProcessCommand(HWND hWin, WORD cmd) {
218     int num;
219 doda 87 if (cmd >= ID_MENUID_BASE && cmd < ID_MENUID_BASE + pvar->MenuItems) {
220 maya 81 num = cmd - ID_MENUID_BASE;
221 doda 87 if (pvar->ResizeList[num][0] > 0)
222     pvar->ts->TerminalWidth = pvar->ResizeList[num][0];
223     if (pvar->ResizeList[num][1] > 0)
224     pvar->ts->TerminalHeight = pvar->ResizeList[num][1];
225 maya 81 pvar->ReplaceTermDlg = TRUE;
226    
227     // Call Setup-Terminal dialog
228     SendMessage(hWin, WM_COMMAND, MAKELONG(ID_SETUP_TERMINAL, 0), 0);
229     return 1;
230     }
231     return 0;
232     }
233    
234     static TTXExports Exports = {
235     sizeof(TTXExports),
236     ORDER,
237    
238     TTXInit,
239     TTXGetUIHooks,
240 doda 87 TTXGetSetupHooks,
241 maya 81 NULL, // TTXOpenTCP,
242     NULL, // TTXCloseTCP,
243     NULL, // TTXSetWinSize,
244     TTXModifyMenu,
245     NULL, // TTXModifyPopupMenu,
246     TTXProcessCommand,
247     NULL, // TTXEnd
248     };
249    
250     BOOL __declspec(dllexport) PASCAL FAR TTXBind(WORD Version, TTXExports FAR * exports) {
251     int size = sizeof(Exports) - sizeof(exports->size);
252    
253     if (size > exports->size) {
254     size = exports->size;
255     }
256     memcpy((char FAR *)exports + sizeof(exports->size),
257     (char FAR *)&Exports + sizeof(exports->size),
258     size);
259     return TRUE;
260     }
261    
262     BOOL WINAPI DllMain(HANDLE hInstance, ULONG ul_reason, LPVOID lpReserved)
263     {
264     switch (ul_reason) {
265     case DLL_THREAD_ATTACH:
266     /* do thread initialization */
267     break;
268     case DLL_THREAD_DETACH:
269     /* do thread cleanup */
270     break;
271     case DLL_PROCESS_ATTACH:
272     /* do process initialization */
273     hInst = hInstance;
274     pvar = &InstVar;
275     break;
276     case DLL_PROCESS_DETACH:
277     /* do process cleanup */
278     break;
279     }
280     return TRUE;
281     }

Properties

Name Value
svn:executable *

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