Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Contents of /trunk/TTXSamples/TTXResizeMenu/TTXResizeMenu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 109 - (show 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 #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 // 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 #define ORDER 5900
46 #define SECTION "Resize Menu"
47
48 int def_resize_list[][2] = {
49 {80, 37},
50 {120, 52},
51 {80, 24},
52 {110, 37}
53 };
54
55 #define ID_MENUID_BASE 55101
56 #define MAX_MENU_ITEMS 20
57
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 PReadIniFile origReadIniFile;
66 int MenuItems;
67 int ResizeList[MAX_MENU_ITEMS][2];
68 } 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 int i, x, y;
77 char tmp[20];
78
79 if (pvar->ResizeMenu != NULL) {
80 DestroyMenu(pvar->ResizeMenu);
81 }
82
83 pvar->ResizeMenu = CreateMenu();
84
85 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 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "height: %d(&%x)", y, i+1);
91 else if (y == 0)
92 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "width: %d(&%x)", x, i+1);
93 else
94 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%dx%d(&%x)", x, y, i+1);
95 }
96 else if (i < 35) {
97 if (x == 0)
98 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "height: %d(&%c)", y, 'a' + i - 9);
99 else if (y == 0)
100 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "width: %d(&%c)", x, 'a' + i - 9);
101 else
102 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%dx%d(&%c)", x, y, 'a' + i - 9);
103 }
104 else {
105 if (x == 0)
106 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "height: %d", y);
107 else if (y == 0)
108 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "width: %d", x);
109 else
110 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%dx%d", x, y);
111 }
112 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 int i;
118
119 pvar->ts = ts;
120 pvar->cv = cv;
121 pvar->ReplaceTermDlg = FALSE;
122 pvar->ResizeMenu = NULL;
123
124 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 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 static void PASCAL FAR ResizeMenuReadIniFile(PCHAR fn, PTTSet ts) {
147 int i, x, y;
148 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 if (sscanf_s(Buff, "%d , %d", &x, &y) == 2) {
157 if (x < 0 ) {
158 x = 0;
159 }
160
161 if (y < 0 ) {
162 y = 0;
163 }
164
165 if (x > TermWidthMax ) {
166 x = TermWidthMax;
167 }
168
169 if (y > TermHeightMax ) {
170 y = TermHeightMax;
171 }
172
173 if (x == 0 && y == 0) {
174 break;
175 }
176
177 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 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 if (cmd >= ID_MENUID_BASE && cmd < ID_MENUID_BASE + pvar->MenuItems) {
220 num = cmd - ID_MENUID_BASE;
221 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 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 TTXGetSetupHooks,
241 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