static void another_font(int);
static void deinit_fonts(void);
static void set_input_locale(HKL);
+static void update_savedsess_menu(void);
static int is_full_screen(void);
static void make_full_screen(void);
static struct unicode_data ucsdata;
static int session_closed;
-static int reconfiguring;
+static int reconfiguring = FALSE;
static const struct telnet_special *specials;
static int n_specials;
int specials_submenu_pos;
} popup_menus[2];
enum { SYSMENU, CTXMENU };
+static HMENU savedsess_menu;
Config cfg; /* exported to windlg.c */
-extern struct sesslist sesslist; /* imported from windlg.c */
+static struct sesslist sesslist; /* for saved-session menu */
struct agent_callback {
void (*callback)(void *, void *, int);
{
}
+char *get_ttymode(void *frontend, const char *mode)
+{
+ return term_get_ttymode(term, mode);
+}
+
static void start_backend(void)
{
const char *error;
* Set up the session-control options on the system menu.
*/
{
- HMENU s, m;
- int i, j;
+ HMENU m;
+ int j;
char *str;
popup_menus[SYSMENU].menu = GetSystemMenu(hwnd, FALSE);
popup_menus[CTXMENU].menu = CreatePopupMenu();
AppendMenu(popup_menus[CTXMENU].menu, MF_ENABLED, IDM_PASTE, "&Paste");
- s = CreateMenu();
+ savedsess_menu = CreateMenu();
get_sesslist(&sesslist, TRUE);
- /* skip sesslist.sessions[0] == Default Settings */
- for (i = 1;
- i < ((sesslist.nsessions <= MENU_SAVED_MAX+1) ? sesslist.nsessions
- : MENU_SAVED_MAX+1);
- i++)
- AppendMenu(s, MF_ENABLED, IDM_SAVED_MIN + (i-1)*MENU_SAVED_STEP,
- sesslist.sessions[i]);
+ update_savedsess_menu();
for (j = 0; j < lenof(popup_menus); j++) {
m = popup_menus[j].menu;
AppendMenu(m, MF_SEPARATOR, 0, 0);
AppendMenu(m, MF_ENABLED, IDM_NEWSESS, "Ne&w Session...");
AppendMenu(m, MF_ENABLED, IDM_DUPSESS, "&Duplicate Session");
- AppendMenu(m, MF_POPUP | MF_ENABLED, (UINT) s, "Sa&ved Sessions");
+ AppendMenu(m, MF_POPUP | MF_ENABLED, (UINT) savedsess_menu,
+ "Sa&ved Sessions");
AppendMenu(m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings...");
AppendMenu(m, MF_SEPARATOR, 0, 0);
AppendMenu(m, MF_ENABLED, IDM_COPYALL, "C&opy All to Clipboard");
}
/*
+ * Refresh the saved-session submenu from `sesslist'.
+ */
+static void update_savedsess_menu(void)
+{
+ int i;
+ while (DeleteMenu(savedsess_menu, 0, MF_BYPOSITION)) ;
+ /* skip sesslist.sessions[0] == Default Settings */
+ for (i = 1;
+ i < ((sesslist.nsessions <= MENU_SAVED_MAX+1) ? sesslist.nsessions
+ : MENU_SAVED_MAX+1);
+ i++)
+ AppendMenu(savedsess_menu, MF_ENABLED,
+ IDM_SAVED_MIN + (i-1)*MENU_SAVED_STEP,
+ sesslist.sessions[i]);
+}
+
+/*
* Update the Special Commands submenu.
*/
void update_specials_menu(void *frontend)
unsigned short *lpString, UINT cbCount,
CONST INT *lpDx, int opaque)
{
-
+#ifdef __LCC__
+ /*
+ * The LCC include files apparently don't supply the
+ * GCP_RESULTSW type, but we can make do with GCP_RESULTS
+ * proper: the differences aren't important to us (the only
+ * variable-width string parameter is one we don't use anyway).
+ */
+ GCP_RESULTS gcpr;
+#else
GCP_RESULTSW gcpr;
+#endif
char *buffer = snewn(cbCount*2+2, char);
char *classbuffer = snewn(cbCount, char);
memset(&gcpr, 0, sizeof(gcpr));
f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
- lfont.lfHeight = font_height;
- lfont.lfWidth = font_width;
- lfont.lfEscapement = 0;
- lfont.lfOrientation = 0;
- lfont.lfWeight = fw_dontcare;
- lfont.lfItalic = FALSE;
- lfont.lfUnderline = FALSE;
- lfont.lfStrikeOut = FALSE;
- lfont.lfCharSet = cfg.font.charset;
- lfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
- lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
- lfont.lfQuality = DEFAULT_QUALITY;
- lfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
- strncpy(lfont.lfFaceName, cfg.font.name, LF_FACESIZE);
-
SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);
+ GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfont);
+
if (pick_width == 0 || pick_height == 0) {
font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;
show_mouseptr(1);
PostQuitMessage(0);
return 0;
+ case WM_INITMENUPOPUP:
+ if ((HMENU)wParam == savedsess_menu) {
+ /* About to pop up Saved Sessions sub-menu.
+ * Refresh the session list. */
+ get_sesslist(&sesslist, FALSE); /* free */
+ get_sesslist(&sesslist, TRUE);
+ update_savedsess_menu();
+ return 0;
+ }
+ break;
case WM_COMMAND:
case WM_SYSCOMMAND:
switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */
{
Config prev_cfg;
int init_lvl = 1;
+ int reconfig_result;
if (reconfiguring)
- break;
+ break;
else
- reconfiguring = TRUE;
+ reconfiguring = TRUE;
GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle));
prev_cfg = cfg;
- if (!do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0))
+ reconfig_result =
+ do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0);
+ reconfiguring = FALSE;
+ if (!reconfig_result)
break;
{
InvalidateRect(hwnd, NULL, TRUE);
reset_window(init_lvl);
net_pending_errors();
- reconfiguring = FALSE;
}
break;
case IDM_COPYALL:
unsigned char buf[20];
int len;
- if (wParam == VK_PROCESSKEY) {
- MSG m;
- m.hwnd = hwnd;
- m.message = WM_KEYDOWN;
- m.wParam = wParam;
- m.lParam = lParam & 0xdfff;
- TranslateMessage(&m);
+ if (wParam == VK_PROCESSKEY) { /* IME PROCESS key */
+ if (message == WM_KEYDOWN) {
+ MSG m;
+ m.hwnd = hwnd;
+ m.message = WM_KEYDOWN;
+ m.wParam = wParam;
+ m.lParam = lParam & 0xdfff;
+ TranslateMessage(&m);
+ } else break; /* pass to Windows for default processing */
} else {
len = TranslateKey(message, wParam, lParam, buf);
if (len == -1)
set_input_locale((HKL)lParam);
sys_cursor_update();
break;
- case WM_IME_NOTIFY:
- if(wParam == IMN_SETOPENSTATUS) {
+ case WM_IME_STARTCOMPOSITION:
+ {
HIMC hImc = ImmGetContext(hwnd);
ImmSetCompositionFont(hImc, &lfont);
ImmReleaseContext(hwnd, hImc);
- return 0;
}
break;
case WM_IME_COMPOSITION: