mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 01:02:24 +00:00
Dominique Faure's patch (slightly modified) to implement the PuTTY
saved-sessions menu in Pageant. Disabled if it can't find the PuTTY binary on startup (just like the help features are disabled if it can't find the help file). [originally from svn r1606]
This commit is contained in:
parent
689fcb5106
commit
edd1ab5701
152
pageant.c
152
pageant.c
@ -44,11 +44,45 @@ static HINSTANCE instance;
|
|||||||
static HWND main_hwnd;
|
static HWND main_hwnd;
|
||||||
static HWND keylist;
|
static HWND keylist;
|
||||||
static HWND aboutbox;
|
static HWND aboutbox;
|
||||||
static HMENU systray_menu;
|
static HMENU systray_menu, session_menu;
|
||||||
static int already_running;
|
static int already_running;
|
||||||
static int requested_help;
|
static int requested_help;
|
||||||
|
|
||||||
static char *help_path;
|
static char *help_path;
|
||||||
|
static char *putty_path;
|
||||||
|
|
||||||
|
#define IDM_PUTTY 0x0060
|
||||||
|
#define IDM_SESSIONS_BASE 0x1000
|
||||||
|
#define IDM_SESSIONS_MAX 0x2000
|
||||||
|
#define PUTTY_REGKEY "Software\\SimonTatham\\PuTTY\\Sessions"
|
||||||
|
#define PUTTY_DEFAULT "Default%20Settings"
|
||||||
|
static int initial_menuitems_count;
|
||||||
|
|
||||||
|
/* Un-munge session names out of the registry. */
|
||||||
|
static void unmungestr(char *in, char *out, int outlen)
|
||||||
|
{
|
||||||
|
while (*in) {
|
||||||
|
if (*in == '%' && in[1] && in[2]) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
i = in[1] - '0';
|
||||||
|
i -= (i > 9 ? 7 : 0);
|
||||||
|
j = in[2] - '0';
|
||||||
|
j -= (j > 9 ? 7 : 0);
|
||||||
|
|
||||||
|
*out++ = (i << 4) + j;
|
||||||
|
if (!--outlen)
|
||||||
|
return;
|
||||||
|
in += 3;
|
||||||
|
} else {
|
||||||
|
*out++ = *in++;
|
||||||
|
if (!--outlen)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*out = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static tree234 *rsakeys, *ssh2keys;
|
static tree234 *rsakeys, *ssh2keys;
|
||||||
|
|
||||||
@ -1444,6 +1478,59 @@ static BOOL AddTrayIcon(HWND hwnd)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update the saved-sessions menu. */
|
||||||
|
static void update_sessions(void)
|
||||||
|
{
|
||||||
|
int num_entries;
|
||||||
|
HKEY hkey;
|
||||||
|
TCHAR buf[MAX_PATH + 1];
|
||||||
|
MENUITEMINFO mii;
|
||||||
|
|
||||||
|
int index_key, index_menu;
|
||||||
|
|
||||||
|
if (!putty_path)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(ERROR_SUCCESS != RegOpenKey(HKEY_CURRENT_USER, PUTTY_REGKEY, &hkey))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(num_entries = GetMenuItemCount(session_menu);
|
||||||
|
num_entries > initial_menuitems_count;
|
||||||
|
num_entries--)
|
||||||
|
RemoveMenu(session_menu, 0, MF_BYPOSITION);
|
||||||
|
|
||||||
|
index_key = 0;
|
||||||
|
index_menu = 0;
|
||||||
|
|
||||||
|
while(ERROR_SUCCESS == RegEnumKey(hkey, index_key, buf, MAX_PATH)) {
|
||||||
|
TCHAR session_name[MAX_PATH + 1];
|
||||||
|
unmungestr(buf, session_name, MAX_PATH);
|
||||||
|
if(strcmp(buf, PUTTY_DEFAULT) != 0) {
|
||||||
|
memset(&mii, 0, sizeof(mii));
|
||||||
|
mii.cbSize = sizeof(mii);
|
||||||
|
mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
|
||||||
|
mii.fType = MFT_STRING;
|
||||||
|
mii.fState = MFS_ENABLED;
|
||||||
|
mii.wID = (index_menu * 16) + IDM_SESSIONS_BASE;
|
||||||
|
mii.dwTypeData = session_name;
|
||||||
|
InsertMenuItem(session_menu, index_menu, TRUE, &mii);
|
||||||
|
index_menu++;
|
||||||
|
}
|
||||||
|
index_key++;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
|
||||||
|
if(index_menu == 0) {
|
||||||
|
mii.cbSize = sizeof(mii);
|
||||||
|
mii.fMask = MIIM_TYPE | MIIM_STATE;
|
||||||
|
mii.fType = MFT_STRING;
|
||||||
|
mii.fState = MFS_GRAYED;
|
||||||
|
mii.dwTypeData = _T("(No sessions)");
|
||||||
|
InsertMenuItem(session_menu, index_menu, TRUE, &mii);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||||
WPARAM wParam, LPARAM lParam)
|
WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
@ -1478,6 +1565,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
|||||||
case WM_SYSTRAY2:
|
case WM_SYSTRAY2:
|
||||||
if (!menuinprogress) {
|
if (!menuinprogress) {
|
||||||
menuinprogress = 1;
|
menuinprogress = 1;
|
||||||
|
update_sessions();
|
||||||
SetForegroundWindow(hwnd);
|
SetForegroundWindow(hwnd);
|
||||||
ret = TrackPopupMenu(systray_menu,
|
ret = TrackPopupMenu(systray_menu,
|
||||||
TPM_RIGHTALIGN | TPM_BOTTOMALIGN |
|
TPM_RIGHTALIGN | TPM_BOTTOMALIGN |
|
||||||
@ -1489,6 +1577,13 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
|||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
case WM_SYSCOMMAND:
|
case WM_SYSCOMMAND:
|
||||||
switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */
|
switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */
|
||||||
|
case IDM_PUTTY:
|
||||||
|
if((int)ShellExecute(hwnd, NULL, putty_path, _T(""), _T(""),
|
||||||
|
SW_SHOW) <= 32) {
|
||||||
|
MessageBox(NULL, "Unable to execute PuTTY!",
|
||||||
|
"Error", MB_OK | MB_ICONERROR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case IDM_CLOSE:
|
case IDM_CLOSE:
|
||||||
if (passphrase_box)
|
if (passphrase_box)
|
||||||
SendMessage(passphrase_box, WM_CLOSE, 0, 0);
|
SendMessage(passphrase_box, WM_CLOSE, 0, 0);
|
||||||
@ -1537,6 +1632,28 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
|||||||
requested_help = TRUE;
|
requested_help = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if(wParam >= IDM_SESSIONS_BASE && wParam <= IDM_SESSIONS_MAX) {
|
||||||
|
MENUITEMINFO mii;
|
||||||
|
TCHAR buf[MAX_PATH + 1];
|
||||||
|
TCHAR param[MAX_PATH + 1];
|
||||||
|
memset(&mii, 0, sizeof(mii));
|
||||||
|
mii.cbSize = sizeof(mii);
|
||||||
|
mii.fMask = MIIM_TYPE;
|
||||||
|
mii.cch = MAX_PATH;
|
||||||
|
mii.dwTypeData = buf;
|
||||||
|
GetMenuItemInfo(session_menu, wParam, FALSE, &mii);
|
||||||
|
strcpy(param, "@");
|
||||||
|
strcat(param, mii.dwTypeData);
|
||||||
|
if((int)ShellExecute(hwnd, NULL, putty_path, param,
|
||||||
|
_T(""), SW_SHOW) <= 32) {
|
||||||
|
MessageBox(NULL, "Unable to execute PuTTY!", "Error",
|
||||||
|
MB_OK | MB_ICONERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
@ -1727,6 +1844,27 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
|||||||
help_path = NULL;
|
help_path = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Look for the PuTTY binary (we will enable the saved session
|
||||||
|
* submenu if we find it).
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char b[2048], *p, *q, *r;
|
||||||
|
FILE *fp;
|
||||||
|
GetModuleFileName(NULL, b, sizeof(b) - 1);
|
||||||
|
r = b;
|
||||||
|
p = strrchr(b, '\\');
|
||||||
|
if (p && p >= r) r = p+1;
|
||||||
|
q = strrchr(b, ':');
|
||||||
|
if (q && q >= r) r = q+1;
|
||||||
|
strcpy(r, "putty.exe");
|
||||||
|
if ( (fp = fopen(b, "r")) != NULL) {
|
||||||
|
putty_path = dupstr(b);
|
||||||
|
fclose(fp);
|
||||||
|
} else
|
||||||
|
putty_path = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find out if Pageant is already running.
|
* Find out if Pageant is already running.
|
||||||
*/
|
*/
|
||||||
@ -1760,8 +1898,15 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
|||||||
/* Set up a system tray icon */
|
/* Set up a system tray icon */
|
||||||
AddTrayIcon(main_hwnd);
|
AddTrayIcon(main_hwnd);
|
||||||
|
|
||||||
|
/* Accelerators used: nsvkxa */
|
||||||
systray_menu = CreatePopupMenu();
|
systray_menu = CreatePopupMenu();
|
||||||
/* accelerators used: vkxa */
|
if (putty_path) {
|
||||||
|
session_menu = CreateMenu();
|
||||||
|
AppendMenu(systray_menu, MF_ENABLED, IDM_PUTTY, "&New Session");
|
||||||
|
AppendMenu(systray_menu, MF_POPUP | MF_ENABLED,
|
||||||
|
(UINT) session_menu, "&Saved Sessions");
|
||||||
|
AppendMenu(systray_menu, MF_SEPARATOR, 0, 0);
|
||||||
|
}
|
||||||
AppendMenu(systray_menu, MF_ENABLED, IDM_VIEWKEYS,
|
AppendMenu(systray_menu, MF_ENABLED, IDM_VIEWKEYS,
|
||||||
"&View Keys");
|
"&View Keys");
|
||||||
AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key");
|
AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key");
|
||||||
@ -1771,6 +1916,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
|||||||
AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About");
|
AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About");
|
||||||
AppendMenu(systray_menu, MF_SEPARATOR, 0, 0);
|
AppendMenu(systray_menu, MF_SEPARATOR, 0, 0);
|
||||||
AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit");
|
AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit");
|
||||||
|
initial_menuitems_count = GetMenuItemCount(session_menu);
|
||||||
|
|
||||||
ShowWindow(main_hwnd, SW_HIDE);
|
ShowWindow(main_hwnd, SW_HIDE);
|
||||||
|
|
||||||
@ -1889,5 +2035,5 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
|||||||
|
|
||||||
if (advapi)
|
if (advapi)
|
||||||
FreeLibrary(advapi);
|
FreeLibrary(advapi);
|
||||||
exit(msg.wParam);
|
return msg.wParam;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user