windlg.c

来自「大名鼎鼎的远程登录软件putty的Symbian版源码」· C语言 代码 · 共 876 行 · 第 1/2 页

C
876
字号
#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <assert.h>#include <ctype.h>#include <time.h>#include "putty.h"#include "ssh.h"#include "win_res.h"#include "storage.h"#include "dialog.h"#include <commctrl.h>#include <commdlg.h>#include <shellapi.h>#ifdef MSVC4#define TVINSERTSTRUCT  TV_INSERTSTRUCT#define TVITEM          TV_ITEM#define ICON_BIG        1#endif/* * These are the various bits of data required to handle the * portable-dialog stuff in the config box. Having them at file * scope in here isn't too bad a place to put them; if we were ever * to need more than one config box per process we could always * shift them to a per-config-box structure stored in GWL_USERDATA. */static struct controlbox *ctrlbox;/* * ctrls_base holds the OK and Cancel buttons: the controls which * are present in all dialog panels. ctrls_panel holds the ones * which change from panel to panel. */static struct winctrls ctrls_base, ctrls_panel;static struct dlgparam dp;static char **events = NULL;static int nevents = 0, negsize = 0;static int requested_help;extern Config cfg;		       /* defined in window.c */struct sesslist sesslist;	       /* exported to window.c */#define PRINTER_DISABLED_STRING "None (printing disabled)"void force_normal(HWND hwnd){    static int recurse = 0;    WINDOWPLACEMENT wp;    if (recurse)	return;    recurse = 1;    wp.length = sizeof(wp);    if (GetWindowPlacement(hwnd, &wp) && wp.showCmd == SW_SHOWMAXIMIZED) {	wp.showCmd = SW_SHOWNORMAL;	SetWindowPlacement(hwnd, &wp);    }    recurse = 0;}static int CALLBACK LogProc(HWND hwnd, UINT msg,			    WPARAM wParam, LPARAM lParam){    int i;    switch (msg) {      case WM_INITDIALOG:	{	    char *str = dupprintf("%s Event Log", appname);	    SetWindowText(hwnd, str);	    sfree(str);	}	{	    static int tabs[4] = { 78, 108 };	    SendDlgItemMessage(hwnd, IDN_LIST, LB_SETTABSTOPS, 2,			       (LPARAM) tabs);	}	for (i = 0; i < nevents; i++)	    SendDlgItemMessage(hwnd, IDN_LIST, LB_ADDSTRING,			       0, (LPARAM) events[i]);	return 1;      case WM_COMMAND:	switch (LOWORD(wParam)) {	  case IDOK:	  case IDCANCEL:	    logbox = NULL;	    SetActiveWindow(GetParent(hwnd));	    DestroyWindow(hwnd);	    return 0;	  case IDN_COPY:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		int selcount;		int *selitems;		selcount = SendDlgItemMessage(hwnd, IDN_LIST,					      LB_GETSELCOUNT, 0, 0);		if (selcount == 0) {   /* don't even try to copy zero items */		    MessageBeep(0);		    break;		}		selitems = snewn(selcount, int);		if (selitems) {		    int count = SendDlgItemMessage(hwnd, IDN_LIST,						   LB_GETSELITEMS,						   selcount,						   (LPARAM) selitems);		    int i;		    int size;		    char *clipdata;		    static unsigned char sel_nl[] = SEL_NL;		    if (count == 0) {  /* can't copy zero stuff */			MessageBeep(0);			break;		    }		    size = 0;		    for (i = 0; i < count; i++)			size +=			    strlen(events[selitems[i]]) + sizeof(sel_nl);		    clipdata = snewn(size, char);		    if (clipdata) {			char *p = clipdata;			for (i = 0; i < count; i++) {			    char *q = events[selitems[i]];			    int qlen = strlen(q);			    memcpy(p, q, qlen);			    p += qlen;			    memcpy(p, sel_nl, sizeof(sel_nl));			    p += sizeof(sel_nl);			}			write_aclip(NULL, clipdata, size, TRUE);			sfree(clipdata);		    }		    sfree(selitems);		    for (i = 0; i < nevents; i++)			SendDlgItemMessage(hwnd, IDN_LIST, LB_SETSEL,					   FALSE, i);		}	    }	    return 0;	}	return 0;      case WM_CLOSE:	logbox = NULL;	SetActiveWindow(GetParent(hwnd));	DestroyWindow(hwnd);	return 0;    }    return 0;}static int CALLBACK LicenceProc(HWND hwnd, UINT msg,				WPARAM wParam, LPARAM lParam){    switch (msg) {      case WM_INITDIALOG:	{	    char *str = dupprintf("%s Licence", appname);	    SetWindowText(hwnd, str);	    sfree(str);	}	return 1;      case WM_COMMAND:	switch (LOWORD(wParam)) {	  case IDOK:	  case IDCANCEL:	    EndDialog(hwnd, 1);	    return 0;	}	return 0;      case WM_CLOSE:	EndDialog(hwnd, 1);	return 0;    }    return 0;}static int CALLBACK AboutProc(HWND hwnd, UINT msg,			      WPARAM wParam, LPARAM lParam){    char *str;    switch (msg) {      case WM_INITDIALOG:	str = dupprintf("About %s", appname);	SetWindowText(hwnd, str);	sfree(str);	SetDlgItemText(hwnd, IDA_TEXT1, appname);	SetDlgItemText(hwnd, IDA_VERSION, ver);	return 1;      case WM_COMMAND:	switch (LOWORD(wParam)) {	  case IDOK:	  case IDCANCEL:	    EndDialog(hwnd, TRUE);	    return 0;	  case IDA_LICENCE:	    EnableWindow(hwnd, 0);	    DialogBox(hinst, MAKEINTRESOURCE(IDD_LICENCEBOX),		      hwnd, LicenceProc);	    EnableWindow(hwnd, 1);	    SetActiveWindow(hwnd);	    return 0;	  case IDA_WEB:	    /* Load web browser */	    ShellExecute(hwnd, "open",			 "http://www.chiark.greenend.org.uk/~sgtatham/putty/",			 0, 0, SW_SHOWDEFAULT);	    return 0;	}	return 0;      case WM_CLOSE:	EndDialog(hwnd, TRUE);	return 0;    }    return 0;}/* * Null dialog procedure. */static int CALLBACK NullDlgProc(HWND hwnd, UINT msg,				WPARAM wParam, LPARAM lParam){    return 0;}enum {    IDCX_ABOUT = IDC_ABOUT,    IDCX_TVSTATIC,    IDCX_TREEVIEW,    IDCX_STDBASE,    IDCX_PANELBASE = IDCX_STDBASE + 32};struct treeview_faff {    HWND treeview;    HTREEITEM lastat[4];};static HTREEITEM treeview_insert(struct treeview_faff *faff,				 int level, char *text, char *path){    TVINSERTSTRUCT ins;    int i;    HTREEITEM newitem;    ins.hParent = (level > 0 ? faff->lastat[level - 1] : TVI_ROOT);    ins.hInsertAfter = faff->lastat[level];#if _WIN32_IE >= 0x0400 && defined NONAMELESSUNION#define INSITEM DUMMYUNIONNAME.item#else#define INSITEM item#endif    ins.INSITEM.mask = TVIF_TEXT | TVIF_PARAM;    ins.INSITEM.pszText = text;    ins.INSITEM.cchTextMax = strlen(text)+1;    ins.INSITEM.lParam = (LPARAM)path;    newitem = TreeView_InsertItem(faff->treeview, &ins);    if (level > 0)	TreeView_Expand(faff->treeview, faff->lastat[level - 1],			TVE_EXPAND);    faff->lastat[level] = newitem;    for (i = level + 1; i < 4; i++)	faff->lastat[i] = NULL;    return newitem;}/* * Create the panelfuls of controls in the configuration box. */static void create_controls(HWND hwnd, char *path){    struct ctlpos cp;    int index;    int base_id;    struct winctrls *wc;    if (!path[0]) {	/*	 * Here we must create the basic standard controls.	 */	ctlposinit(&cp, hwnd, 3, 3, 235);	wc = &ctrls_base;	base_id = IDCX_STDBASE;    } else {	/*	 * Otherwise, we're creating the controls for a particular	 * panel.	 */	ctlposinit(&cp, hwnd, 80, 3, 13);	wc = &ctrls_panel;	base_id = IDCX_PANELBASE;    }    for (index=-1; (index = ctrl_find_path(ctrlbox, path, index)) >= 0 ;) {	struct controlset *s = ctrlbox->ctrlsets[index];	winctrl_layout(&dp, wc, &cp, s, &base_id);    }}/* * This function is the configuration box. */static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,				       WPARAM wParam, LPARAM lParam){    HWND hw, treeview;    struct treeview_faff tvfaff;    int ret;    switch (msg) {      case WM_INITDIALOG:	dp.hwnd = hwnd;	create_controls(hwnd, "");     /* Open and Cancel buttons etc */	SetWindowText(hwnd, dp.wintitle);	SetWindowLong(hwnd, GWL_USERDATA, 0);        if (help_path)            SetWindowLong(hwnd, GWL_EXSTYLE,                          GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);        else {            HWND item = GetDlgItem(hwnd, IDC_HELPBTN);            if (item)                DestroyWindow(item);        }        requested_help = FALSE;	SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG,		    (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON)));	/*	 * Centre the window.	 */	{			       /* centre the window */	    RECT rs, rd;	    hw = GetDesktopWindow();	    if (GetWindowRect(hw, &rs) && GetWindowRect(hwnd, &rd))		MoveWindow(hwnd,			   (rs.right + rs.left + rd.left - rd.right) / 2,			   (rs.bottom + rs.top + rd.top - rd.bottom) / 2,			   rd.right - rd.left, rd.bottom - rd.top, TRUE);	}	/*	 * Create the tree view.	 */	{	    RECT r;	    WPARAM font;	    HWND tvstatic;	    r.left = 3;	    r.right = r.left + 75;	    r.top = 3;	    r.bottom = r.top + 10;	    MapDialogRect(hwnd, &r);	    tvstatic = CreateWindowEx(0, "STATIC", "Cate&gory:",				      WS_CHILD | WS_VISIBLE,				      r.left, r.top,				      r.right - r.left, r.bottom - r.top,				      hwnd, (HMENU) IDCX_TVSTATIC, hinst,				      NULL);	    font = SendMessage(hwnd, WM_GETFONT, 0, 0);	    SendMessage(tvstatic, WM_SETFONT, font, MAKELPARAM(TRUE, 0));	    r.left = 3;	    r.right = r.left + 75;	    r.top = 13;	    r.bottom = r.top + 219;	    MapDialogRect(hwnd, &r);	    treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "",				      WS_CHILD | WS_VISIBLE |				      WS_TABSTOP | TVS_HASLINES |				      TVS_DISABLEDRAGDROP | TVS_HASBUTTONS				      | TVS_LINESATROOT |				      TVS_SHOWSELALWAYS, r.left, r.top,				      r.right - r.left, r.bottom - r.top,				      hwnd, (HMENU) IDCX_TREEVIEW, hinst,				      NULL);	    font = SendMessage(hwnd, WM_GETFONT, 0, 0);	    SendMessage(treeview, WM_SETFONT, font, MAKELPARAM(TRUE, 0));	    tvfaff.treeview = treeview;	    memset(tvfaff.lastat, 0, sizeof(tvfaff.lastat));	}	/*	 * Set up the tree view contents.	 */	{	    HTREEITEM hfirst = NULL;	    int i;	    char *path = NULL;	    for (i = 0; i < ctrlbox->nctrlsets; i++) {		struct controlset *s = ctrlbox->ctrlsets[i];		HTREEITEM item;		int j;		char *c;		if (!s->pathname[0])		    continue;		j = path ? ctrl_path_compare(s->pathname, path) : 0;		if (j == INT_MAX)		    continue;	       /* same path, nothing to add to tree */		/*		 * We expect never to find an implicit path		 * component. For example, we expect never to see		 * A/B/C followed by A/D/E, because that would		 * _implicitly_ create A/D. All our path prefixes		 * are expected to contain actual controls and be		 * selectable in the treeview; so we would expect		 * to see A/D _explicitly_ before encountering		 * A/D/E.		 */		assert(j == ctrl_path_elements(s->pathname) - 1);		c = strrchr(s->pathname, '/');		if (!c)			c = s->pathname;		else			c++;		item = treeview_insert(&tvfaff, j, c, s->pathname);		if (!hfirst)		    hfirst = item;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?