Console fix (#1) (resent)

eric pouech eric.pouech at wanadoo.fr
Sun Dec 2 09:40:10 CST 2001


seemed to get lost with another disk full at winehq. fixes also the
compatible DC as suggested by Ove (Alexandre, please use this version
instead)

Since Alexandre finished its request/reply for the server modification, 
it's time for more changes

those are mainly cosmetic and UI related :
- (some) console options are now saved into the registry
- two sets of options are proposed: the one from the registry (default) 
  and the one currently in use in the console. this lets someone define
  either global settings (preferred font for example) or local (to the
  session). (this may evolve some day as a per process name setting as
  NT does)
- added a submenu (mainly for those who run wine in managed mode) to
  access an ersatz of the modified system menu
- configuration dialog box now also let you choose the color for your
  font (mostly useless ;-)
- fixed a few bugs (some in dialog & prop sheet handling, other in font
  selection (now it should a bit more robust, but not yet 100% bullet
  proof), 
- lastly, separated the data for the USER backend in specific structure
  (and file) to ease the integration of new backends... (see Marcus
  xterm patch as an example)

A+
-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: wc_ui
ChangeLog: + allow to save/restore some properties into the registry (like font, cursor size...)
	+ implement the two sets of properties (default & current)
	+ fixed some bugs mainly in dialog
	+ enhanced font selection mechanisms, 
	+ added and protected sub-menu for all operations (sysmenu is not avail in managed mode)
	+ better data separation for the backend(s)
GenDate: 2001/12/02 15:37:03 UTC
ModifiedFiles: programs/wineconsole/Makefile.in programs/wineconsole/dialog.c programs/wineconsole/user.c programs/wineconsole/winecon_private.h programs/wineconsole/wineconsole.c programs/wineconsole/wineconsole.spec programs/wineconsole/wineconsole_En.rc programs/wineconsole/wineconsole_Fr.rc programs/wineconsole/wineconsole_res.h
AddedFiles: programs/wineconsole/registry.c programs/wineconsole/winecon_user.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/Makefile.in,v
retrieving revision 1.2
diff -u -u -r1.2 Makefile.in
--- programs/wineconsole/Makefile.in	2001/11/24 17:07:13	1.2
+++ programs/wineconsole/Makefile.in	2001/11/25 20:47:55
@@ -7,6 +7,7 @@
 
 C_SRCS = \
 	dialog.c \
+	registry.c \
 	user.c \
         wineconsole.c
 
Index: programs/wineconsole/dialog.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/dialog.c,v
retrieving revision 1.1
diff -u -u -r1.1 dialog.c
--- programs/wineconsole/dialog.c	2001/11/23 23:05:03	1.1
+++ programs/wineconsole/dialog.c	2001/12/01 16:29:43
@@ -1,28 +1,117 @@
 /* dialog management for wineconsole
+ * USER32 backend
  * (c) 2001 Eric Pouech
  */
 
 #include <stdio.h>
-#include "winecon_private.h"
 #include "commctrl.h"
 #include "prsht.h"
+#include "winecon_user.h"
 
 /* FIXME: so far, part of the code is made in ASCII because the Uncode property sheet functions
  * are not implemented yet
  */
+
+enum WCUSER_ApplyTo {
+    /* Prop sheet CFG */
+    WCUSER_ApplyToCursorSize, 
+    WCUSER_ApplyToHistorySize, WCUSER_ApplyToHistoryMode, WCUSER_ApplyToMenuMask,
+    /* Prop sheet FNT */
+    WCUSER_ApplyToFont, WCUSER_ApplyToAttribute,
+    /* Prop sheep CNF */
+    WCUSER_ApplyToBufferSize, WCUSER_ApplyToWindow
+};
+
 struct dialog_info 
 {
-    struct inner_data*	data;		/* pointer to current winecon info */
-    HWND		hDlg;		/* handle to window dialog */
+    struct config_data* config;         /* pointer to configuration used for dialog box */
+    struct inner_data*	data;	        /* pointer to current winecon info */
+    HWND		hDlg;		/* handle to active propsheet */
     int			nFont;		/* number of font size in size LB */
     struct font_info 
     {
 	TEXTMETRIC		tm;
 	LOGFONT			lf;
     } 			*font;		/* array of nFont. index sync'ed with SIZE LB */
+    void        (*apply)(struct dialog_info*, HWND, enum WCUSER_ApplyTo, DWORD);
 };
 
 /******************************************************************
+ *		WCUSER_ApplyDefault
+ *
+ *
+ */
+static void WCUSER_ApplyDefault(struct dialog_info* di, HWND hDlg, enum WCUSER_ApplyTo apply, DWORD val)
+{
+    switch (apply)
+    {
+    case WCUSER_ApplyToCursorSize:
+    case WCUSER_ApplyToHistorySize:
+    case WCUSER_ApplyToHistoryMode:
+    case WCUSER_ApplyToBufferSize:
+    case WCUSER_ApplyToWindow:
+        /* not saving those for now... */
+        break;
+    case WCUSER_ApplyToMenuMask:
+        di->config->menu_mask = val;
+        break;
+    case WCUSER_ApplyToFont:
+        WCUSER_CopyFont(di->config, &di->font[val].lf);
+        break;
+    case WCUSER_ApplyToAttribute:
+        di->config->def_attr = val;
+        break;
+    }
+    WINECON_RegSave(di->config);
+}
+
+/******************************************************************
+ *		WCUSER_ApplyCurrent
+ *
+ *
+ */
+static void WCUSER_ApplyCurrent(struct dialog_info* di, HWND hDlg, enum WCUSER_ApplyTo apply, DWORD val)
+{
+    switch (apply)
+    {
+    case WCUSER_ApplyToCursorSize:
+        {
+            CONSOLE_CURSOR_INFO cinfo;
+            cinfo.dwSize = val;
+            cinfo.bVisible = di->config->cursor_visible;
+            /* this shall update (through notif) curcfg */
+            SetConsoleCursorInfo(di->data->hConOut, &cinfo);
+        }
+        break;
+    case WCUSER_ApplyToHistorySize:
+        di->config->history_size = val;
+        WINECON_SetHistorySize(di->data->hConIn, val);
+        break;
+    case WCUSER_ApplyToHistoryMode:
+        WINECON_SetHistoryMode(di->data->hConIn, val);
+        break;
+    case WCUSER_ApplyToMenuMask:
+        di->config->menu_mask = val;
+        break;
+    case WCUSER_ApplyToFont:
+        WCUSER_SetFont(di->data, &di->font[val].lf);
+        break;
+    case WCUSER_ApplyToAttribute:
+        di->config->def_attr = val;
+        SetConsoleTextAttribute(di->data->hConOut, val);
+        break;
+    case WCUSER_ApplyToBufferSize:
+        /* this shall update (through notif) curcfg */
+        SetConsoleScreenBufferSize(di->data->hConOut, *(COORD*)val);
+        break;
+    case WCUSER_ApplyToWindow:
+        /* this shall update (through notif) curcfg */
+        SetConsoleWindowInfo(di->data->hConOut, FALSE, (SMALL_RECT*)val);
+        break;
+    }
+}
+
+/******************************************************************
  *		WCUSER_OptionDlgProc
  *
  * Dialog prop for the option property sheet
@@ -38,19 +127,25 @@
 	di = (struct dialog_info*)((PROPSHEETPAGEA*)lParam)->lParam;
 	di->hDlg = hDlg;
 	SetWindowLongA(hDlg, DWL_USER, (DWORD)di);
-	if (di->data->cursor_size < 33)		idc = IDC_OPT_CURSOR_SMALL;
-	else if (di->data->cursor_size < 66)	idc = IDC_OPT_CURSOR_MEDIUM;
-	else					idc = IDC_OPT_CURSOR_LARGE;
+	if (di->config->cursor_size <= 25)	idc = IDC_OPT_CURSOR_SMALL;
+	else if (di->config->cursor_size <= 50)	idc = IDC_OPT_CURSOR_MEDIUM;
+	else				        idc = IDC_OPT_CURSOR_LARGE;
 	SendDlgItemMessage(hDlg, idc, BM_SETCHECK, BST_CHECKED, 0L);
 	SetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, WINECON_GetHistorySize(di->data->hConIn),  FALSE);
 	if (WINECON_GetHistoryMode(di->data->hConIn))
 	    SendDlgItemMessage(hDlg, IDC_OPT_HIST_DOUBLE, BM_SETCHECK, BST_CHECKED, 0L);
+        SendDlgItemMessage(hDlg, IDC_OPT_CONF_CTRL, BM_SETCHECK, 
+                           (di->config->menu_mask & MK_CONTROL) ? BST_CHECKED : BST_UNCHECKED, 0L);
+        SendDlgItemMessage(hDlg, IDC_OPT_CONF_SHIFT, BM_SETCHECK, 
+                           (di->config->menu_mask & MK_SHIFT) ? BST_CHECKED : BST_UNCHECKED, 0L);
 	return FALSE; /* because we set the focus */
     case WM_COMMAND:
 	break;
     case WM_NOTIFY:
     {
 	NMHDR*	nmhdr = (NMHDR*)lParam;
+        DWORD   val;
+        BOOL	done;
 
 	di = (struct dialog_info*)GetWindowLongA(hDlg, DWL_USER);
 	switch (nmhdr->code) 
@@ -67,30 +162,26 @@
 	    else
 		idc = IDC_OPT_CURSOR_LARGE;
 	    PostMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, idc), TRUE);
+            di->hDlg = hDlg;
 	    break;
 	case PSN_APPLY:
-	{
-	    int		curs_size;
-	    int		hist_size;
-	    BOOL	done;
-
-	    if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_SMALL) == BST_CHECKED)	curs_size = 33;
-	    else if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_MEDIUM) == BST_CHECKED) curs_size = 66;
-	    else curs_size = 99;
-	    if (curs_size != di->data->cursor_size)
-	    {
-		CONSOLE_CURSOR_INFO cinfo;
-		cinfo.dwSize = curs_size;
-		cinfo.bVisible = di->data->cursor_visible;
-		SetConsoleCursorInfo(di->data->hConOut, &cinfo);
-	    }
-	    hist_size = GetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, &done, FALSE);
-	    if (done) WINECON_SetHistorySize(di->data->hConIn, hist_size);
-	    SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
-	    WINECON_SetHistoryMode(di->data->hConIn, 
-				   IsDlgButtonChecked(hDlg, IDC_OPT_HIST_DOUBLE) & BST_CHECKED);
+	    if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_SMALL) == BST_CHECKED) val = 25;
+	    else if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_MEDIUM) == BST_CHECKED) val = 50;
+	    else val = 99;
+            (di->apply)(di, hDlg, WCUSER_ApplyToCursorSize, val);
+
+ 	    val = GetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, &done, FALSE);
+	    if (done) (di->apply)(di, hDlg, WCUSER_ApplyToHistorySize, val);
+
+	    (di->apply)(di, hDlg, WCUSER_ApplyToHistoryMode, 
+                        IsDlgButtonChecked(hDlg, IDC_OPT_HIST_DOUBLE) & BST_CHECKED);
+
+            val = 0;
+            if (IsDlgButtonChecked(hDlg, IDC_OPT_CONF_CTRL) & BST_CHECKED)  val |= MK_CONTROL;
+            if (IsDlgButtonChecked(hDlg, IDC_OPT_CONF_SHIFT) & BST_CHECKED) val |= MK_SHIFT;
+            (di->apply)(di, hDlg, WCUSER_ApplyToMenuMask, val);
+            SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
-	}
 	default:
 	    return FALSE;
 	}
@@ -112,45 +203,121 @@
     switch (msg)
     {
     case WM_PAINT:
-    {
-	PAINTSTRUCT	ps;
-	int		font_idx;
-	int		size_idx;
-	struct dialog_info*	di;
-
-	di = (struct dialog_info*)GetWindowLong(GetParent(hWnd), DWL_USER);
-	BeginPaint(hWnd, &ps);
-	
-	font_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_GETCURSEL, 0L, 0L);
-	size_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
-
-	if (font_idx >= 0 && size_idx >= 0 && size_idx < di->nFont)
-	{
-	    HFONT	hFont, hOldFont;
-	    WCHAR	buf1[256];
-	    WCHAR	buf2[256];
-	    int		len1, len2;
-
-	    hFont = CreateFontIndirect(&di->font[size_idx].lf);
-	    len1 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_1, 
-			      buf1, sizeof(buf1) / sizeof(WCHAR));
-	    len2 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_2,
-			      buf2, sizeof(buf2) / sizeof(WCHAR));
-	    if (hFont && len1)
-	    {
-		hOldFont = SelectObject(ps.hdc, hFont);
-		SetBkColor(ps.hdc, RGB(0x00, 0x00, 0x00));
-		SetTextColor(ps.hdc, RGB(0xFF, 0xFF, 0xFF));
-		TextOut(ps.hdc, 0, 0, buf1, len1);
-		if (len2)
-		    TextOut(ps.hdc, 0, di->font[size_idx].tm.tmHeight, buf2, len2);
-		SelectObject(ps.hdc, hOldFont);
-		DeleteObject(hFont);
-	    }
-	}
-	EndPaint(hWnd, &ps);
-	break;
+        {
+            PAINTSTRUCT	        ps;
+            int		        font_idx;
+            int		        size_idx;
+            struct dialog_info*	di;
+            
+            di = (struct dialog_info*)GetWindowLong(GetParent(hWnd), DWL_USER);
+            BeginPaint(hWnd, &ps);
+
+            font_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_GETCURSEL, 0L, 0L);
+            size_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
+            
+            if (font_idx >= 0 && size_idx >= 0 && size_idx < di->nFont)
+            {
+                HFONT	hFont, hOldFont;
+                WCHAR	buf1[256];
+                WCHAR	buf2[256];
+                int	len1, len2;
+                
+                hFont = CreateFontIndirect(&di->font[size_idx].lf);
+                len1 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_1, 
+                                  buf1, sizeof(buf1) / sizeof(WCHAR));
+                len2 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_2,
+                                  buf2, sizeof(buf2) / sizeof(WCHAR));
+                buf1[len1] = buf2[len2] = 0;
+                if (hFont && len1)
+                {
+                    hOldFont = SelectObject(ps.hdc, hFont);
+                    SetBkColor(ps.hdc, WCUSER_ColorMap[GetWindowLong(GetDlgItem(di->hDlg, IDC_FNT_COLOR_BK), 0)]);
+                    SetTextColor(ps.hdc, WCUSER_ColorMap[GetWindowLong(GetDlgItem(di->hDlg, IDC_FNT_COLOR_FG), 0)]);
+                    TextOut(ps.hdc, 0, 0, buf1, len1);
+                    if (len2)
+                        TextOut(ps.hdc, 0, di->font[size_idx].tm.tmHeight, buf2, len2);
+                    SelectObject(ps.hdc, hOldFont);
+                    DeleteObject(hFont);
+                }
+            }
+            EndPaint(hWnd, &ps);
+        }
+        break;
+    default:
+	return DefWindowProc(hWnd, msg, wParam, lParam);
     }
+    return 0L;
+}
+
+/******************************************************************
+ *		WCUSER_ColorPreviewProc
+ *
+ * Window proc for color previewer in font property sheet
+ */
+static LRESULT WINAPI WCUSER_ColorPreviewProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    switch (msg)
+    {
+    case WM_PAINT:
+        {
+            PAINTSTRUCT     ps;
+            int             i, step;
+            RECT            client, r;
+            HBRUSH          hbr;
+            
+            BeginPaint(hWnd, &ps);
+            GetClientRect(hWnd, &client);
+            step = client.right / 8;
+            
+            for (i = 0; i < 16; i++)
+            {
+                r.top = (i / 8) * (client.bottom / 2);
+                r.bottom = r.top + client.bottom / 2;
+                r.left = (i & 7) * step;
+                r.right = r.left + step;
+                hbr = CreateSolidBrush(WCUSER_ColorMap[i]);
+                FillRect(ps.hdc, &r, hbr);
+                DeleteObject(hbr);
+                if (GetWindowLong(hWnd, 0) == i)
+                {
+                    HPEN        hOldPen;
+                    int         i = 2;
+
+                    hOldPen = SelectObject(ps.hdc, GetStockObject(WHITE_PEN));
+                    r.right--; r.bottom--;
+                    for (;;)
+                    {
+                        MoveToEx(ps.hdc, r.left, r.bottom, NULL);
+                        LineTo(ps.hdc, r.left, r.top);
+                        LineTo(ps.hdc, r.right, r.top);
+                        SelectObject(ps.hdc, GetStockObject(BLACK_PEN));
+                        LineTo(ps.hdc, r.right, r.bottom);
+                        LineTo(ps.hdc, r.left, r.bottom);
+
+                        if (--i == 0) break;
+                        r.left++; r.top++; r.right--; r.bottom--;
+                        SelectObject(ps.hdc, GetStockObject(WHITE_PEN));
+                    }
+                    SelectObject(ps.hdc, hOldPen);
+                }
+            }
+            EndPaint(hWnd, &ps);
+            break;
+        }
+    case WM_LBUTTONDOWN:
+        {
+            int             i, step;
+            RECT            client;
+            
+            GetClientRect(hWnd, &client);
+            step = client.right / 8;
+            i = (HIWORD(lParam) >= client.bottom / 2) ? 8 : 0;
+            i += LOWORD(lParam) / step;
+            SetWindowLong(hWnd, 0, i);
+            InvalidateRect(GetDlgItem(GetParent(hWnd), IDC_FNT_PREVIEW), NULL, FALSE);
+            InvalidateRect(hWnd, NULL, FALSE);
+        }
+        break;
     default:
 	return DefWindowProc(hWnd, msg, wParam, lParam);
     }
@@ -159,8 +326,8 @@
 
 /******************************************************************
  *		font_enum
- *
  *
+ * enumerates all the font names with at least one valid font
  */
 static int CALLBACK font_enum_size2(const LOGFONT* lf, const TEXTMETRIC* tm, 
 				    DWORD FontType, LPARAM lParam)
@@ -208,24 +375,44 @@
     if (WCUSER_ValidateFontMetric(di->data, tm))
     {
 	WCHAR	buf[32];
-	WCHAR	fmt[] = {'%','l','d',0};
+static	WCHAR	fmt[] = {'%','l','d',0};
 	int	idx;
 
 	/* we want the string to be sorted with a numeric order, not a lexicographic...
 	 * do the job by hand... get where to insert the new string
 	 */
 	for (idx = 0; idx < di->nFont && tm->tmHeight > di->font[idx].tm.tmHeight; idx++);
-	wsprintfW(buf, fmt, tm->tmHeight);
-	SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_INSERTSTRING, idx, (LPARAM)buf);
-
-	/* now grow our arrays and insert to values at the same index than in the list box */
-	di->font = HeapReAlloc(GetProcessHeap(), 0, di->font, sizeof(*di->font) * (di->nFont + 1));
-	if (idx != di->nFont)
-	    memmove(&di->font[idx + 1], &di->font[idx], (di->nFont - idx) * sizeof(*di->font));
-	di->font[idx].tm = *tm;
-	di->font[idx].lf = *lf;
-	di->nFont++;
-
+        if (idx < di->nFont &&
+            tm->tmHeight == di->font[idx].tm.tmHeight && 
+            tm->tmMaxCharWidth == di->font[idx].tm.tmMaxCharWidth)
+        {
+            /* we already have an entry with the same width & height...
+             * try to see which TEXTMETRIC (old or new) we should keep... 
+             */
+            if (di->font[idx].tm.tmWeight != tm->tmWeight)
+            {
+                /* get the weight closer to 400, the default value */
+                if (abs(tm->tmWeight - 400) < abs(di->font[idx].tm.tmWeight - 400))
+                {
+                    di->font[idx].tm = *tm;
+                }
+            }
+            /* else FIXME: skip the new tm for now */
+        }
+        else
+        {
+            /* here we need to add the new entry */
+            wsprintfW(buf, fmt, tm->tmHeight);
+            SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_INSERTSTRING, idx, (LPARAM)buf);
+
+            /* now grow our arrays and insert to values at the same index than in the list box */
+            di->font = HeapReAlloc(GetProcessHeap(), 0, di->font, sizeof(*di->font) * (di->nFont + 1));
+            if (idx != di->nFont)
+                memmove(&di->font[idx + 1], &di->font[idx], (di->nFont - idx) * sizeof(*di->font));
+            di->font[idx].tm = *tm;
+            di->font[idx].lf = *lf;
+            di->nFont++;
+        }
     }
     return 1;
 }
@@ -283,7 +470,7 @@
     {
 	for (idx = 0; idx < di->nFont; idx++)
 	{
-	    if (memcmp(&di->data->logFont, &di->font[idx].lf, sizeof(LOGFONT)) == 0)
+	    if (WCUSER_AreFontsEqual(di->config, &di->font[idx].lf))
 		break;
 	}
 	if (idx == di->nFont) idx = 0;
@@ -311,7 +498,7 @@
     EnumFontFamilies(hdc, NULL, font_enum, (LPARAM)di);
     ReleaseDC(di->hDlg, hdc);
     if (SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_SELECTSTRING, 
-			   (WPARAM)-1, (LPARAM)di->data->logFont.lfFaceName) == LB_ERR)
+			   (WPARAM)-1, (LPARAM)di->config->face_name) == LB_ERR)
 	SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_SETCURSEL, 0L, 0L);
     fill_list_size(di, TRUE);
     return TRUE;
@@ -333,6 +520,8 @@
 	di->hDlg = hDlg;
 	SetWindowLong(hDlg, DWL_USER, (DWORD)di);
 	fill_list_font(di);
+        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0, di->config->def_attr & 0x0F);
+        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0, (di->config->def_attr >> 4) & 0x0F);
 	break;
     case WM_COMMAND:
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
@@ -355,21 +544,25 @@
     case WM_NOTIFY:
     {
 	NMHDR*	nmhdr = (NMHDR*)lParam;
+        DWORD   val;
 
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
 	switch (nmhdr->code) 
 	{
+        case PSN_SETACTIVE:
+            di->hDlg = hDlg;
+            break;
 	case PSN_APPLY:
-	{
-	    int idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
+ 	    val = SendDlgItemMessage(hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
 
-	    if (idx >= 0 && idx < di->nFont)
-	    {
-		WCUSER_SetFont(di->data, &di->font[idx].lf, &di->font[idx].tm);
-	    }
-	    SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+	    if (val < di->nFont) (di->apply)(di, hDlg, WCUSER_ApplyToFont, val);
+
+            (di->apply)(di, hDlg, WCUSER_ApplyToAttribute, 
+                        GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0) | 
+                        (GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0) << 4));
+
+            SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
-	}
 	default:
 	    return FALSE;
 	}
@@ -396,10 +589,10 @@
 	di = (struct dialog_info*)((PROPSHEETPAGEA*)lParam)->lParam;
 	di->hDlg = hDlg;
 	SetWindowLong(hDlg, DWL_USER, (DWORD)di);
-	SetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,   di->data->sb_width,   FALSE);
-	SetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT,  di->data->sb_height,  FALSE);
-	SetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  di->data->win_width,  FALSE);
-	SetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, di->data->win_height, FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,   di->config->sb_width,   FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT,  di->config->sb_height,  FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  di->config->win_width,  FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, di->config->win_height, FALSE);
 	break;
     case WM_COMMAND:
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
@@ -409,37 +602,36 @@
 	break;
     case WM_NOTIFY:
     {
-	NMHDR*	nmhdr = (NMHDR*)lParam;
+	NMHDR*	        nmhdr = (NMHDR*)lParam;
+        COORD           sb;
+        SMALL_RECT	pos;
+        BOOL	        st_w, st_h;
 
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
 	switch (nmhdr->code) 
 	{
+        case PSN_SETACTIVE:
+            di->hDlg = hDlg;
+            break;
 	case PSN_APPLY:
-	{
-	    COORD	sb;
-	    SMALL_RECT	pos;
-	    BOOL	st_w, st_h;
-
-	    sb.X = GetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,  &st_w, FALSE);
-	    sb.Y = GetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT, &st_h, FALSE);
-	    if (st_w && st_h && (sb.X != di->data->sb_width || sb.Y != di->data->sb_height))
-	    {
-		SetConsoleScreenBufferSize(di->data->hConOut, sb);
-	    }
-
-	    pos.Right  = GetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  &st_w, FALSE);
-	    pos.Bottom = GetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, &st_h, FALSE);
-	    if (st_w && st_h && 
-		(pos.Right != di->data->win_width || pos.Bottom != di->data->win_height))
-	    {
-		pos.Left = pos.Top = 0;
-		pos.Right--; pos.Bottom--;
-		SetConsoleWindowInfo(di->data->hConOut, FALSE, &pos);
-	    }
-
-	    SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+            sb.X = GetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,  &st_w, FALSE);
+            sb.Y = GetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT, &st_h, FALSE);
+            if (st_w && st_h && (sb.X != di->config->sb_width || sb.Y != di->config->sb_height))
+            {
+                (di->apply)(di, hDlg, WCUSER_ApplyToBufferSize, (DWORD)&sb);
+            }
+            
+            pos.Right  = GetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  &st_w, FALSE);
+            pos.Bottom = GetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, &st_h, FALSE);
+            if (st_w && st_h && 
+                (pos.Right != di->config->win_width || pos.Bottom != di->config->win_height))
+            {
+                pos.Left = pos.Top = 0;
+                pos.Right--; pos.Bottom--;
+                (di->apply)(di, hDlg, WCUSER_ApplyToWindow, (DWORD)&pos);
+            }
+            SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
-	}
 	default:
 	    return FALSE;
 	}
@@ -456,18 +648,30 @@
  *
  * Runs the dialog box to set up the winconsole options
  */
-BOOL WCUSER_GetProperties(struct inner_data* data)
+BOOL WCUSER_GetProperties(struct inner_data* data, BOOL current)
 {
     HPROPSHEETPAGE	psPage[3];
     PROPSHEETPAGEA	psp;
     PROPSHEETHEADERA	psHead;
     WNDCLASS		wndclass;
     static WCHAR	szFntPreview[] = {'W','i','n','e','C','o','n','F','o','n','t','P','r','e','v','i','e','w',0};
+    static WCHAR	szColorPreview[] = {'W','i','n','e','C','o','n','C','o','l','o','r','P','r','e','v','i','e','w',0};
     struct dialog_info	di;
+    CHAR		buff[256];
 
     InitCommonControls();
 
     di.data = data;
+    if (current)
+    {
+        di.config = &data->curcfg;
+        di.apply = WCUSER_ApplyCurrent;
+    }
+    else
+    {
+        di.config = &data->defcfg;
+        di.apply = WCUSER_ApplyDefault;
+    }
     di.nFont = 0;
     di.font = NULL;
 
@@ -483,6 +687,18 @@
     wndclass.lpszClassName = szFntPreview;
     RegisterClass(&wndclass);
 
+    wndclass.style         = 0;
+    wndclass.lpfnWndProc   = WCUSER_ColorPreviewProc;
+    wndclass.cbClsExtra    = 0;
+    wndclass.cbWndExtra    = sizeof(DWORD);
+    wndclass.hInstance     = GetModuleHandle(NULL);
+    wndclass.hIcon         = 0;
+    wndclass.hCursor       = LoadCursor(0, IDC_ARROW);
+    wndclass.hbrBackground = GetStockObject(BLACK_BRUSH);
+    wndclass.lpszMenuName  = NULL;
+    wndclass.lpszClassName = szColorPreview;
+    RegisterClass(&wndclass);
+
     memset(&psp, 0, sizeof(psp));
     psp.dwSize = sizeof(psp);
     psp.dwFlags = 0;
@@ -503,13 +719,19 @@
 
     memset(&psHead, 0, sizeof(psHead));
     psHead.dwSize = sizeof(psHead);
-    psHead.pszCaption = "Setup";
+
+    if (!LoadStringA(GetModuleHandle(NULL), 
+                     (current) ? IDS_DLG_TIT_CURRENT : IDS_DLG_TIT_DEFAULT, 
+                     buff, sizeof(buff)))
+        strcpy(buff, "Setup");
+    psHead.pszCaption = buff;
     psHead.nPages = 3;
-    psHead.hwndParent = data->hWnd;
+    psHead.hwndParent = PRIVATE(data)->hWnd;
     psHead.u3.phpage = psPage;
  
     PropertySheetA(&psHead);
 
     return TRUE;
 }
+
 
Index: programs/wineconsole/user.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/user.c,v
retrieving revision 1.1
diff -u -u -r1.1 user.c
--- programs/wineconsole/user.c	2001/11/23 23:05:03	1.1
+++ programs/wineconsole/user.c	2001/12/02 15:34:24
@@ -5,14 +5,14 @@
  */
 
 #include <stdio.h>
-#include "winecon_private.h"
+#include "winecon_user.h"
 
 /* mapping console colors to RGB values */
-static	COLORREF	color_map[16] = 
+COLORREF	WCUSER_ColorMap[16] = 
 {
     RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x80), RGB(0x00, 0x80, 0x00), RGB(0x00, 0x80, 0x80),
     RGB(0x80, 0x00, 0x00), RGB(0x80, 0x00, 0x80), RGB(0x80, 0x80, 0x00), RGB(0x80, 0x80, 0x80),
-    RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xFF),
+    RGB(0xC0, 0xC0, 0xC0), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xFF),
     RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xFF),
 };
 
@@ -29,28 +29,28 @@
     WORD		attr;
     WCHAR*		line;
 
-    if (!(line = HeapAlloc(GetProcessHeap(), 0, data->sb_width * sizeof(WCHAR))))
+    if (!(line = HeapAlloc(GetProcessHeap(), 0, data->curcfg.sb_width * sizeof(WCHAR))))
     {Trace(0, "OOM\n"); return;}
 
-    hOldFont = SelectObject(data->hMemDC, data->hFont);
+    hOldFont = SelectObject(PRIVATE(data)->hMemDC, PRIVATE(data)->hFont);
     for (j = upd_tp; j <= upd_bm; j++)
     {
-	cell = &data->cells[j * data->sb_width];
-	for (i = 0; i < data->win_width; i++)
+	cell = &data->cells[j * data->curcfg.sb_width];
+	for (i = 0; i < data->curcfg.win_width; i++)
 	{
 	    attr = cell[i].Attributes;
-	    SetBkColor(data->hMemDC, color_map[attr & 0x0F]);
-	    SetTextColor(data->hMemDC, color_map[(attr >> 4) & 0x0F]);
-	    for (k = i; k < data->win_width && cell[k].Attributes == attr; k++)
+	    SetBkColor(PRIVATE(data)->hMemDC, WCUSER_ColorMap[attr & 0x0F]);
+	    SetTextColor(PRIVATE(data)->hMemDC, WCUSER_ColorMap[(attr >> 4) & 0x0F]);
+	    for (k = i; k < data->curcfg.win_width && cell[k].Attributes == attr; k++)
 	    {
 		line[k - i] = cell[k].Char.UnicodeChar;
 	    }
-	    TextOut(data->hMemDC, i * data->cell_width, j * data->cell_height, 
+	    TextOut(PRIVATE(data)->hMemDC, i * data->curcfg.cell_width, j * data->curcfg.cell_height, 
 		    line, k - i);
 	    i = k - 1;
 	}
     }
-    SelectObject(data->hMemDC, hOldFont);
+    SelectObject(PRIVATE(data)->hMemDC, hOldFont);
     HeapFree(GetProcessHeap(), 0, line);
 }
 
@@ -62,25 +62,27 @@
  */
 static void WCUSER_NewBitmap(struct inner_data* data, BOOL fill)
 {
+    HDC         hDC;
     HBITMAP	hnew, hold;
 
-    if (!data->sb_width || !data->sb_height)
-	return;
-    hnew = CreateCompatibleBitmap(data->hMemDC, 
-				  data->sb_width  * data->cell_width, 
-				  data->sb_height * data->cell_height);
-    hold = SelectObject(data->hMemDC, hnew);
+    if (!data->curcfg.sb_width || !data->curcfg.sb_height || !(hDC = GetDC(PRIVATE(data)->hWnd))) 
+        return;
+    hnew = CreateCompatibleBitmap(hDC, 
+				  data->curcfg.sb_width  * data->curcfg.cell_width, 
+				  data->curcfg.sb_height * data->curcfg.cell_height);
+    ReleaseDC(PRIVATE(data)->hWnd, hDC);
+    hold = SelectObject(PRIVATE(data)->hMemDC, hnew);
 
-    if (data->hBitmap)
+    if (PRIVATE(data)->hBitmap)
     {
-	if (hold == data->hBitmap)
-	    DeleteObject(data->hBitmap);
+	if (hold == PRIVATE(data)->hBitmap)
+	    DeleteObject(PRIVATE(data)->hBitmap);
 	else
 	    Trace(0, "leak\n");
     }
-    data->hBitmap = hnew;
+    PRIVATE(data)->hBitmap = hnew;
     if (fill)
-	WCUSER_FillMemDC(data, 0, data->sb_height - 1);
+	WCUSER_FillMemDC(data, 0, data->curcfg.sb_height - 1);
 }
 
 /******************************************************************
@@ -100,11 +102,11 @@
  */
 static void	WCUSER_PosCursor(const struct inner_data* data)
 {
-    if (data->hWnd != GetFocus() || !data->cursor_visible) return;
+    if (PRIVATE(data)->hWnd != GetFocus() || !data->curcfg.cursor_visible) return;
 
-    SetCaretPos((data->cursor.X - data->win_pos.X) * data->cell_width, 
-		(data->cursor.Y - data->win_pos.Y) * data->cell_height);
-    ShowCaret(data->hWnd); 
+    SetCaretPos((data->cursor.X - data->curcfg.win_pos.X) * data->curcfg.cell_width, 
+		(data->cursor.Y - data->curcfg.win_pos.Y) * data->curcfg.cell_height);
+    ShowCaret(PRIVATE(data)->hWnd); 
 }
 
 /******************************************************************
@@ -114,44 +116,46 @@
  */
 void	WCUSER_ShapeCursor(struct inner_data* data, int size, int vis, BOOL force)
 {
-    if (force || size != data->cursor_size)
+    if (force || size != data->curcfg.cursor_size)
     {
-	if (data->cursor_visible && data->hWnd == GetFocus()) DestroyCaret();
-	if (data->cursor_bitmap) DeleteObject(data->cursor_bitmap);
-	data->cursor_bitmap = (HBITMAP)0;
+	if (data->curcfg.cursor_visible && PRIVATE(data)->hWnd == GetFocus()) DestroyCaret();
+	if (PRIVATE(data)->cursor_bitmap) DeleteObject(PRIVATE(data)->cursor_bitmap);
+	PRIVATE(data)->cursor_bitmap = (HBITMAP)0;
 	if (size != 100)
 	{
 	    int		w16b; /* number of byets per row, aligned on word size */
 	    BYTE*	ptr;
 	    int		i, j, nbl;
 
-	    w16b = ((data->cell_width + 15) & ~15) / 8;
-	    ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, w16b * data->cell_height);
+	    w16b = ((data->curcfg.cell_width + 15) & ~15) / 8;
+	    ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, w16b * data->curcfg.cell_height);
 	    if (!ptr) {Trace(0, "OOM\n"); return;}
-	    nbl = max((data->cell_height * size) / 100, 1);
-	    for (j = data->cell_height - nbl; j < data->cell_height; j++)
+	    nbl = max((data->curcfg.cell_height * size) / 100, 1);
+	    for (j = data->curcfg.cell_height - nbl; j < data->curcfg.cell_height; j++)
 	    {
-		for (i = 0; i < data->cell_width; i++)
+		for (i = 0; i < data->curcfg.cell_width; i++)
 		{
 		    ptr[w16b * j + (i / 8)] |= 0x80 >> (i & 7);
 		}
 	    }
-	    data->cursor_bitmap = CreateBitmap(data->cell_width, data->cell_height, 1, 1, ptr);
+	    PRIVATE(data)->cursor_bitmap = CreateBitmap(data->curcfg.cell_width, 
+                                               data->curcfg.cell_height, 1, 1, ptr);
 	    HeapFree(GetProcessHeap(), 0, ptr);
 	}
-	data->cursor_size = size;
-	data->cursor_visible = -1;
+	data->curcfg.cursor_size = size;
+	data->curcfg.cursor_visible = -1;
     }
 
     vis = (vis) ? TRUE : FALSE;
-    if (force || vis != data->cursor_visible)
+    if (force || vis != data->curcfg.cursor_visible)
     {
-	data->cursor_visible = vis;
-	if (data->hWnd == GetFocus())
+	data->curcfg.cursor_visible = vis;
+	if (PRIVATE(data)->hWnd == GetFocus())
 	{
 	    if (vis)
 	    {
-		CreateCaret(data->hWnd, data->cursor_bitmap, data->cell_width, data->cell_height);
+		CreateCaret(PRIVATE(data)->hWnd, PRIVATE(data)->cursor_bitmap, 
+                            data->curcfg.cell_width, data->curcfg.cell_height);
 		WCUSER_PosCursor(data);
 	    }
 	    else
@@ -174,45 +178,47 @@
 
     /* compute window size from desired client size */
     r.left = r.top = 0;
-    r.right = data->win_width * data->cell_width;
-    r.bottom = data->win_height * data->cell_height;
+    r.right = data->curcfg.win_width * data->curcfg.cell_width;
+    r.bottom = data->curcfg.win_height * data->curcfg.cell_height;
 
     if (IsRectEmpty(&r))
     {
-	ShowWindow(data->hWnd, SW_HIDE);
+	ShowWindow(PRIVATE(data)->hWnd, SW_HIDE);
 	return;
     }
 
-    AdjustWindowRect(&r, GetWindowLong(data->hWnd, GWL_STYLE), FALSE);
+    AdjustWindowRect(&r, GetWindowLong(PRIVATE(data)->hWnd, GWL_STYLE), FALSE);
 
     dx = dy = 0;
-    if (data->sb_width > data->win_width)
+    if (data->curcfg.sb_width > data->curcfg.win_width)
     {
 	dy = GetSystemMetrics(SM_CYHSCROLL);
-	SetScrollRange(data->hWnd, SB_HORZ, 0, data->sb_width - data->win_width, FALSE);
-	SetScrollPos(data->hWnd, SB_HORZ, 0, FALSE); /* FIXME */
-	ShowScrollBar(data->hWnd, SB_HORZ, TRUE);
+	SetScrollRange(PRIVATE(data)->hWnd, SB_HORZ, 0, 
+                       data->curcfg.sb_width - data->curcfg.win_width, FALSE);
+	SetScrollPos(PRIVATE(data)->hWnd, SB_HORZ, 0, FALSE); /* FIXME */
+	ShowScrollBar(PRIVATE(data)->hWnd, SB_HORZ, TRUE);
     }
     else
     {
-	ShowScrollBar(data->hWnd, SB_HORZ, FALSE);
+	ShowScrollBar(PRIVATE(data)->hWnd, SB_HORZ, FALSE);
     }
 
-    if (data->sb_height > data->win_height)
+    if (data->curcfg.sb_height > data->curcfg.win_height)
     {
 	dx = GetSystemMetrics(SM_CXVSCROLL);
-	SetScrollRange(data->hWnd, SB_VERT, 0, data->sb_height - data->win_height, FALSE);
-	SetScrollPos(data->hWnd, SB_VERT, 0, FALSE); /* FIXME */
-	ShowScrollBar(data->hWnd, SB_VERT, TRUE);
+	SetScrollRange(PRIVATE(data)->hWnd, SB_VERT, 0, 
+                       data->curcfg.sb_height - data->curcfg.win_height, FALSE);
+	SetScrollPos(PRIVATE(data)->hWnd, SB_VERT, 0, FALSE); /* FIXME */
+	ShowScrollBar(PRIVATE(data)->hWnd, SB_VERT, TRUE);
     }	
     else
     {
-	ShowScrollBar(data->hWnd, SB_VERT, FALSE);
+	ShowScrollBar(PRIVATE(data)->hWnd, SB_VERT, FALSE);
     }
 
-    SetWindowPos(data->hWnd, 0, 0, 0, r.right - r.left + dx, r.bottom - r.top + dy,
+    SetWindowPos(PRIVATE(data)->hWnd, 0, 0, 0, r.right - r.left + dx, r.bottom - r.top + dy,
 		 SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW);
-    WCUSER_ShapeCursor(data, data->cursor_size, data->cursor_visible, TRUE);
+    WCUSER_ShapeCursor(data, data->curcfg.cursor_size, data->curcfg.cursor_visible, TRUE);
     WCUSER_PosCursor(data);
 }
 
@@ -226,27 +232,87 @@
     WCHAR	buffer[256];	
 
     if (WINECON_GetConsoleTitle(data->hConIn, buffer, sizeof(buffer)))
-	SetWindowText(data->hWnd, buffer);
+	SetWindowText(PRIVATE(data)->hWnd, buffer);
 }
 
 /******************************************************************
- *		WCUSER_SetFont
+ *		FontEqual
+ *
+ *
+ */
+BOOL WCUSER_AreFontsEqual(const struct config_data* config, const LOGFONT* lf)
+{
+    return lf->lfHeight == config->cell_height &&
+        lf->lfWidth  == config->cell_width &&
+        lf->lfWeight == config->font_weight &&
+        !lf->lfItalic && !lf->lfUnderline && !lf->lfStrikeOut &&
+        !lstrcmpW(lf->lfFaceName, config->face_name);
+}
+
+/******************************************************************
+ *		CopyFont
  *
  *
+ */
+void WCUSER_CopyFont(struct config_data* config, const LOGFONT* lf)
+{
+    config->cell_width  = lf->lfWidth;
+    config->cell_height = lf->lfHeight;
+    config->font_weight  = lf->lfWeight;
+    lstrcpyW(config->face_name, lf->lfFaceName);
+}
+
+/******************************************************************
+ *		WCUSER_InitFont
+ *
+ * create a hFont from the settings saved in registry...
+ * (called on init, assuming no font has been created before)
+ */
+BOOL	WCUSER_InitFont(struct inner_data* data)
+{
+    LOGFONT lf;
+        
+    lf.lfHeight        = -data->curcfg.cell_height;
+    lf.lfWidth         = data->curcfg.cell_width;
+    lf.lfEscapement    = 0;
+    lf.lfOrientation   = 0;
+    lf.lfWeight        = data->curcfg.font_weight;
+    lf.lfItalic        = FALSE;
+    lf.lfUnderline     = FALSE;
+    lf.lfStrikeOut     = FALSE;
+    lf.lfCharSet       = DEFAULT_CHARSET;
+    lf.lfOutPrecision  = OUT_DEFAULT_PRECIS;
+    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; 
+    lf.lfQuality       = DEFAULT_QUALITY;
+    lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
+    lstrcpy(lf.lfFaceName, data->curcfg.face_name);
+    PRIVATE(data)->hFont = CreateFontIndirect(&lf);
+    if (!PRIVATE(data)->hFont) return FALSE;
+
+    WCUSER_ComputePositions(data);
+    WCUSER_NewBitmap(data, TRUE);
+    InvalidateRect(PRIVATE(data)->hWnd, NULL, FALSE);
+    UpdateWindow(PRIVATE(data)->hWnd);
+    return TRUE;
+}
+
+/******************************************************************
+ *		WCUSER_SetFont
+ *
+ * sets logfont as the new font for the console
  */
-BOOL	WCUSER_SetFont(struct inner_data* data, const LOGFONT* logfont, const TEXTMETRIC* tm)
+BOOL	WCUSER_SetFont(struct inner_data* data, const LOGFONT* logfont)
 {
-    if (!memcmp(logfont, &data->logFont, sizeof(LOGFONT))) return TRUE;
-    if (data->hFont) DeleteObject(data->hFont);
-    data->hFont = CreateFontIndirect(logfont);
-    if (!data->hFont) {Trace(0, "wrong font\n");return FALSE;}
-    data->cell_width = tm->tmMaxCharWidth; /* font is fixed Avg == Max */
-    data->cell_height = tm->tmHeight;
-    data->logFont = *logfont;
+    if (WCUSER_AreFontsEqual(&data->curcfg, logfont)) return TRUE;
+    if (PRIVATE(data)->hFont) DeleteObject(PRIVATE(data)->hFont);
+    PRIVATE(data)->hFont = CreateFontIndirect(logfont);
+    if (!PRIVATE(data)->hFont) {Trace(0, "wrong font\n");return FALSE;}
+    WCUSER_CopyFont(&data->curcfg, logfont);
+
     WCUSER_ComputePositions(data);
     WCUSER_NewBitmap(data, TRUE);
-    InvalidateRect(data->hWnd, NULL, FALSE);
-    UpdateWindow(data->hWnd);
+    InvalidateRect(PRIVATE(data)->hWnd, NULL, FALSE);
+    UpdateWindow(PRIVATE(data)->hWnd);
     return TRUE;
 }
 
@@ -260,8 +326,8 @@
 {
     COORD	c;
 
-    c.X = data->win_pos.X + (short)LOWORD(lParam) / data->cell_width;
-    c.Y = data->win_pos.Y + (short)HIWORD(lParam) / data->cell_height;
+    c.X = data->curcfg.win_pos.X + (short)LOWORD(lParam) / data->curcfg.cell_width;
+    c.Y = data->curcfg.win_pos.Y + (short)HIWORD(lParam) / data->curcfg.cell_height;
 
     return c;
 }
@@ -273,10 +339,10 @@
  */
 static void	WCUSER_GetSelectionRect(const struct inner_data* data, LPRECT r)
 {
-    r->left   = (min(data->selectPt1.X, data->selectPt2.X)    ) * data->cell_width;
-    r->top    = (min(data->selectPt1.Y, data->selectPt2.Y)    ) * data->cell_height;
-    r->right  = (max(data->selectPt1.X, data->selectPt2.X) + 1) * data->cell_width;
-    r->bottom = (max(data->selectPt1.Y, data->selectPt2.Y) + 1) * data->cell_height;
+    r->left   = (min(PRIVATE(data)->selectPt1.X, PRIVATE(data)->selectPt2.X)    ) * data->curcfg.cell_width;
+    r->top    = (min(PRIVATE(data)->selectPt1.Y, PRIVATE(data)->selectPt2.Y)    ) * data->curcfg.cell_height;
+    r->right  = (max(PRIVATE(data)->selectPt1.X, PRIVATE(data)->selectPt2.X) + 1) * data->curcfg.cell_width;
+    r->bottom = (max(PRIVATE(data)->selectPt1.Y, PRIVATE(data)->selectPt2.Y) + 1) * data->curcfg.cell_height;
 }
 
 /******************************************************************
@@ -290,16 +356,16 @@
     RECT	r;
 
     WCUSER_GetSelectionRect(data, &r);
-    hDC = hRefDC ? hRefDC : GetDC(data->hWnd);
+    hDC = hRefDC ? hRefDC : GetDC(PRIVATE(data)->hWnd);
     if (hDC)
     {
-	if (data->hWnd == GetFocus() && data->cursor_visible)
-	    HideCaret(data->hWnd);
+	if (PRIVATE(data)->hWnd == GetFocus() && data->curcfg.cursor_visible)
+	    HideCaret(PRIVATE(data)->hWnd);
 	InvertRect(hDC, &r);
 	if (hDC != hRefDC)
-	    ReleaseDC(data->hWnd, hDC);
-	if (data->hWnd == GetFocus() && data->cursor_visible)
-	    ShowCaret(data->hWnd);
+	    ReleaseDC(PRIVATE(data)->hWnd, hDC);
+	if (PRIVATE(data)->hWnd == GetFocus() && data->curcfg.cursor_visible)
+	    ShowCaret(PRIVATE(data)->hWnd);
     }
 }
 
@@ -314,26 +380,26 @@
     HDC		hDC;
 
     WCUSER_GetSelectionRect(data, &r);
-    hDC = GetDC(data->hWnd);
+    hDC = GetDC(PRIVATE(data)->hWnd);
     if (hDC)
     {
-	if (data->hWnd == GetFocus() && data->cursor_visible)
-	    HideCaret(data->hWnd);
+	if (PRIVATE(data)->hWnd == GetFocus() && data->curcfg.cursor_visible)
+	    HideCaret(PRIVATE(data)->hWnd);
 	InvertRect(hDC, &r);
     }
-    data->selectPt2 = dst;
+    PRIVATE(data)->selectPt2 = dst;
     if (hDC)
     {
 	WCUSER_GetSelectionRect(data, &r);
 	InvertRect(hDC, &r);
-	ReleaseDC(data->hWnd, hDC);
-	if (data->hWnd == GetFocus() && data->cursor_visible)
-	    ShowCaret(data->hWnd);
+	ReleaseDC(PRIVATE(data)->hWnd, hDC);
+	if (PRIVATE(data)->hWnd == GetFocus() && data->curcfg.cursor_visible)
+	    ShowCaret(PRIVATE(data)->hWnd);
     }
     if (final)
     {
 	ReleaseCapture();
-	data->hasSelection = TRUE;
+	PRIVATE(data)->hasSelection = TRUE;
     }
 }
 
@@ -348,10 +414,10 @@
     LPWSTR	p;
     unsigned	w, h;
 
-    w = abs(data->selectPt1.X - data->selectPt2.X) + 2;
-    h = abs(data->selectPt1.Y - data->selectPt2.Y) + 1;
+    w = abs(PRIVATE(data)->selectPt1.X - PRIVATE(data)->selectPt2.X) + 2;
+    h = abs(PRIVATE(data)->selectPt1.Y - PRIVATE(data)->selectPt2.Y) + 1;
 
-    if (!OpenClipboard(data->hWnd)) return;
+    if (!OpenClipboard(PRIVATE(data)->hWnd)) return;
     EmptyClipboard();
 
     hMem = GlobalAlloc(GMEM_MOVEABLE, (w * h - 1) * sizeof(WCHAR));
@@ -360,8 +426,8 @@
 	COORD	c;
 	int	y;
 
-	c.X = data->win_pos.X + min(data->selectPt1.X, data->selectPt2.X);
-	c.Y = data->win_pos.Y + min(data->selectPt1.Y, data->selectPt2.Y);
+	c.X = data->curcfg.win_pos.X + min(PRIVATE(data)->selectPt1.X, PRIVATE(data)->selectPt2.X);
+	c.Y = data->curcfg.win_pos.Y + min(PRIVATE(data)->selectPt1.Y, PRIVATE(data)->selectPt2.Y);
 	
 	for (y = 0; y < h; y++, c.Y++)
 	{
@@ -384,7 +450,7 @@
     HANDLE	h;
     WCHAR*	ptr;
 
-    if (!OpenClipboard(data->hWnd)) return;
+    if (!OpenClipboard(PRIVATE(data)->hWnd)) return;
     h = GetClipboardData(CF_UNICODETEXT);
     if (h && (ptr = GlobalLock(h)))
     {
@@ -417,19 +483,24 @@
     CloseClipboard();
 }
 
+/******************************************************************
+ *		Refresh
+ *
+ *
+ */
 static void WCUSER_Refresh(const struct inner_data* data, int tp, int bm)
 {
-    if (data->win_pos.Y <= bm && data->win_pos.Y + data->win_height >= tp)
+    if (data->curcfg.win_pos.Y <= bm && data->curcfg.win_pos.Y + data->curcfg.win_height >= tp)
     {
 	RECT	r;
 
 	r.left   = 0;
-	r.right  = data->win_width * data->cell_width;
-	r.top    = (tp - data->win_pos.Y) * data->cell_height;
-	r.bottom = (bm - data->win_pos.Y + 1) * data->cell_height;
-	InvalidateRect(data->hWnd, &r, FALSE);
+	r.right  = data->curcfg.win_width * data->curcfg.cell_width;
+	r.top    = (tp - data->curcfg.win_pos.Y) * data->curcfg.cell_height;
+	r.bottom = (bm - data->curcfg.win_pos.Y + 1) * data->curcfg.cell_height;
+	InvalidateRect(PRIVATE(data)->hWnd, &r, FALSE);
 	WCUSER_FillMemDC(data, tp, bm);
-	UpdateWindow(data->hWnd);
+	UpdateWindow(PRIVATE(data)->hWnd);
     }
 }
 
@@ -442,13 +513,17 @@
 {
     PAINTSTRUCT		ps;
 
-    BeginPaint(data->hWnd, &ps);
-    BitBlt(ps.hdc, 0, 0, data->win_width * data->cell_width, data->win_height * data->cell_height,
-	   data->hMemDC, data->win_pos.X * data->cell_width, data->win_pos.Y * data->cell_height,
+    BeginPaint(PRIVATE(data)->hWnd, &ps);
+    BitBlt(ps.hdc, 0, 0, 
+           data->curcfg.win_width * data->curcfg.cell_width, 
+           data->curcfg.win_height * data->curcfg.cell_height,
+	   PRIVATE(data)->hMemDC, 
+           data->curcfg.win_pos.X * data->curcfg.cell_width, 
+           data->curcfg.win_pos.Y * data->curcfg.cell_height,
 	   SRCCOPY);
-    if (data->hasSelection)
+    if (PRIVATE(data)->hasSelection)
 	WCUSER_SetSelection(data, ps.hdc);
-    EndPaint(data->hWnd, &ps);
+    EndPaint(PRIVATE(data)->hWnd, &ps);
 }
 
 /******************************************************************
@@ -460,16 +535,16 @@
 {
     if (horz)
     {
-	SetScrollPos(data->hWnd, SB_HORZ, pos, TRUE);
-	data->win_pos.X = pos;
-	InvalidateRect(data->hWnd, NULL, FALSE);
+	SetScrollPos(PRIVATE(data)->hWnd, SB_HORZ, pos, TRUE);
+	data->curcfg.win_pos.X = pos;
+	InvalidateRect(PRIVATE(data)->hWnd, NULL, FALSE);
     }
     else
     {
-	SetScrollPos(data->hWnd, SB_VERT, pos, TRUE);
-	data->win_pos.Y = pos;
+	SetScrollPos(PRIVATE(data)->hWnd, SB_VERT, pos, TRUE);
+	data->curcfg.win_pos.Y = pos;
     }
-    InvalidateRect(data->hWnd, NULL, FALSE);
+    InvalidateRect(PRIVATE(data)->hWnd, NULL, FALSE);
 }
 
 struct font_chooser {
@@ -484,8 +559,8 @@
  */
 BOOL	WCUSER_ValidateFontMetric(const struct inner_data* data, const TEXTMETRIC* tm)
 {
-    return tm->tmMaxCharWidth * data->win_width < GetSystemMetrics(SM_CXSCREEN) &&
-	tm->tmHeight * data->win_height < GetSystemMetrics(SM_CYSCREEN) &&
+    return tm->tmMaxCharWidth * data->curcfg.win_width < GetSystemMetrics(SM_CXSCREEN) &&
+	tm->tmHeight * data->curcfg.win_height < GetSystemMetrics(SM_CYSCREEN) &&
 	!tm->tmItalic && !tm->tmUnderlined && !tm->tmStruckOut;
 }
 
@@ -496,7 +571,9 @@
  */
 BOOL	WCUSER_ValidateFont(const struct inner_data* data, const LOGFONT* lf)
 {
-    return (lf->lfPitchAndFamily & 3) == FIXED_PITCH && (lf->lfPitchAndFamily & 0xF0) == FF_MODERN;
+    return (lf->lfPitchAndFamily & 3) == FIXED_PITCH && 
+        (lf->lfPitchAndFamily & 0xF0) == FF_MODERN &&
+        lf->lfCharSet != SYMBOL_CHARSET;
 }
 
 /******************************************************************
@@ -512,7 +589,7 @@
 
     if (WCUSER_ValidateFontMetric(fc->data, tm))
     {
-	WCUSER_SetFont(fc->data, lf, tm);
+	WCUSER_SetFont(fc->data, lf);
 	fc->done = 1;
 	return 0;
     }
@@ -526,36 +603,28 @@
 
     if (WCUSER_ValidateFont(fc->data, lf))
     {
-	EnumFontFamilies(fc->data->hMemDC, lf->lfFaceName, get_first_font_enum_2, lParam);
+	EnumFontFamilies(PRIVATE(fc->data)->hMemDC, lf->lfFaceName, get_first_font_enum_2, lParam);
 	return !fc->done; /* we just need the first matching one... */
     }
     return 1;
 }
 
 /******************************************************************
- *		WCUSER_Create
+ *		WCUSER_FillMenu
  *
- * Creates the window for the rendering
+ *
  */
-static LRESULT WCUSER_Create(HWND hWnd, LPCREATESTRUCT lpcs)
+static BOOL WCUSER_FillMenu(HMENU hMenu, BOOL sep)
 {
-    struct inner_data*	data;
-    HMENU		hMenu;
     HMENU		hSubMenu;
-    WCHAR		buff[256];
     HINSTANCE		hInstance = GetModuleHandle(NULL);
+    WCHAR		buff[256];
 
-    data = lpcs->lpCreateParams;
-    SetWindowLong(hWnd, 0L, (DWORD)data);
-    data->hWnd = hWnd;
+    if (!hMenu) return FALSE;
 
-    data->cursor_size = 101; /* invalid value, will trigger a complete cleanup */
     /* FIXME: error handling & memory cleanup */
     hSubMenu = CreateMenu();
-    if (!hSubMenu) return 0;
-
-    hMenu = GetSystemMenu(hWnd, FALSE);
-    if (!hMenu) return 0;
+    if (!hSubMenu) return FALSE;
 
     LoadString(hInstance, IDS_MARK, buff, sizeof(buff) / sizeof(WCHAR));
     InsertMenu(hSubMenu, -1, MF_BYPOSITION|MF_STRING, IDS_MARK, buff);
@@ -570,7 +639,7 @@
     LoadString(hInstance, IDS_SEARCH, buff, sizeof(buff) / sizeof(WCHAR));
     InsertMenu(hSubMenu, -1, MF_BYPOSITION|MF_STRING, IDS_SEARCH, buff);
 
-    InsertMenu(hMenu, -1, MF_BYPOSITION|MF_SEPARATOR, 0, NULL);
+    if (sep) InsertMenu(hMenu, -1, MF_BYPOSITION|MF_SEPARATOR, 0, NULL);
     LoadString(hInstance, IDS_EDIT, buff, sizeof(buff) / sizeof(WCHAR));
     InsertMenu(hMenu, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT_PTR)hSubMenu, buff);
     LoadString(hInstance, IDS_DEFAULT, buff, sizeof(buff) / sizeof(WCHAR));
@@ -578,9 +647,36 @@
     LoadString(hInstance, IDS_PROPERTY, buff, sizeof(buff) / sizeof(WCHAR));
     InsertMenu(hMenu, -1, MF_BYPOSITION|MF_STRING, IDS_PROPERTY, buff);
 
-    data->hMemDC = CreateCompatibleDC(0);
-    if (!data->hMemDC) {Trace(0, "no mem dc\n");return 0;}
+    return TRUE;
+}
+
+/******************************************************************
+ *		WCUSER_Create
+ *
+ * Creates the window for the rendering
+ */
+static LRESULT WCUSER_Create(HWND hWnd, LPCREATESTRUCT lpcs)
+{
+    struct inner_data*	data;
+    HMENU		hSysMenu;
 
+    data = lpcs->lpCreateParams;
+    SetWindowLong(hWnd, 0L, (DWORD)data);
+    PRIVATE(data)->hWnd = hWnd;
+
+    data->curcfg.cursor_size = 101; /* invalid value, will trigger a complete cleanup */
+
+    hSysMenu = GetSystemMenu(hWnd, FALSE);
+    if (!hSysMenu) return 0;
+    PRIVATE(data)->hPopMenu = CreatePopupMenu();
+    if (!PRIVATE(data)->hPopMenu) return 0;
+
+    WCUSER_FillMenu(hSysMenu, TRUE);
+    WCUSER_FillMenu(PRIVATE(data)->hPopMenu, FALSE);
+
+    PRIVATE(data)->hMemDC = CreateCompatibleDC(0);
+    if (!PRIVATE(data)->hMemDC) {Trace(0, "no mem dc\n");return 0;}
+
     return 0;
 }
 
@@ -591,7 +687,7 @@
  */
 static void	WCUSER_SetMenuDetails(const struct inner_data* data)
 {
-    HMENU		hMenu = GetSystemMenu(data->hWnd, FALSE);
+    HMENU		hMenu = GetSystemMenu(PRIVATE(data)->hWnd, FALSE);
 
     if (!hMenu) {Trace(0, "Issue in getting menu bits\n");return;}
 
@@ -599,7 +695,7 @@
     EnableMenuItem(hMenu, IDS_DEFAULT, MF_BYCOMMAND|MF_GRAYED);
 
     EnableMenuItem(hMenu, IDS_MARK, MF_BYCOMMAND|MF_GRAYED);
-    EnableMenuItem(hMenu, IDS_COPY, MF_BYCOMMAND|(data->hasSelection ? MF_ENABLED : MF_GRAYED));
+    EnableMenuItem(hMenu, IDS_COPY, MF_BYCOMMAND|(PRIVATE(data)->hasSelection ? MF_ENABLED : MF_GRAYED));
     EnableMenuItem(hMenu, IDS_PASTE, 
 		   MF_BYCOMMAND|(IsClipboardFormatAvailable(CF_UNICODETEXT) 
 				 ? MF_ENABLED : MF_GRAYED));
@@ -609,12 +705,12 @@
 }
 
 /******************************************************************
- *		WCUSER_GenerateInputRecord
+ *		WCUSER_GenerateKeyInputRecord
  *
  * generates input_record from windows WM_KEYUP/WM_KEYDOWN messages
  */
-static void    WCUSER_GenerateInputRecord(struct inner_data* data, BOOL down, 
-					   WPARAM wParam, LPARAM lParam, BOOL sys)
+static void    WCUSER_GenerateKeyInputRecord(struct inner_data* data, BOOL down, 
+                                             WPARAM wParam, LPARAM lParam, BOOL sys)
 {
     INPUT_RECORD	ir;
     DWORD		n;
@@ -644,10 +740,10 @@
     if (keyState[VK_NUMLOCK]  & 0x01)	ir.Event.KeyEvent.dwControlKeyState |= NUMLOCK_ON;
     if (keyState[VK_SCROLL]   & 0x01)	ir.Event.KeyEvent.dwControlKeyState |= SCROLLLOCK_ON;
 
-    if (data->hasSelection && ir.Event.KeyEvent.dwControlKeyState == 0 && 
+    if (PRIVATE(data)->hasSelection && ir.Event.KeyEvent.dwControlKeyState == 0 && 
 	ir.Event.KeyEvent.wVirtualKeyCode == VK_RETURN)
     {
-	data->hasSelection = FALSE;
+	PRIVATE(data)->hasSelection = FALSE;
 	WCUSER_SetSelection(data, 0);
 	WCUSER_CopySelectionToClipboard(data);
 	return;
@@ -691,7 +787,7 @@
     case WM_CREATE:
         return WCUSER_Create(hWnd, (LPCREATESTRUCT)lParam);
     case WM_DESTROY:
-	data->hWnd = 0;
+	PRIVATE(data)->hWnd = 0;
 	PostQuitMessage(0);
 	break;
     case WM_PAINT:
@@ -699,53 +795,54 @@
 	break;
     case WM_KEYDOWN:
     case WM_KEYUP:
-	WCUSER_GenerateInputRecord(data, uMsg == WM_KEYDOWN, wParam, lParam, FALSE);
+	WCUSER_GenerateKeyInputRecord(data, uMsg == WM_KEYDOWN, wParam, lParam, FALSE);
 	break;
     case WM_SYSKEYDOWN:
     case WM_SYSKEYUP:
-	WCUSER_GenerateInputRecord(data, uMsg == WM_SYSKEYDOWN, wParam, lParam, TRUE);
+	WCUSER_GenerateKeyInputRecord(data, uMsg == WM_SYSKEYDOWN, wParam, lParam, TRUE);
 	break;
     case WM_LBUTTONDOWN:
 	/* EPP if (wParam != MK_LBUTTON) */
-	if (data->hasSelection)
+	if (PRIVATE(data)->hasSelection)
 	{
-	    data->hasSelection = FALSE;
+	    PRIVATE(data)->hasSelection = FALSE;
 	}
 	else
 	{
-	    data->selectPt1 = data->selectPt2 = WCUSER_GetCell(data, lParam);
-	    SetCapture(data->hWnd);
+	    PRIVATE(data)->selectPt1 = PRIVATE(data)->selectPt2 = WCUSER_GetCell(data, lParam);
+	    SetCapture(PRIVATE(data)->hWnd);
 	}
 	WCUSER_SetSelection(data, 0);
 	break;
     case WM_MOUSEMOVE:
 	/* EPP if (wParam != MK_LBUTTON) */
-        if (GetCapture() == data->hWnd)
+        if (GetCapture() == PRIVATE(data)->hWnd)
 	{
 	    WCUSER_MoveSelection(data, WCUSER_GetCell(data, lParam), FALSE);
 	}
 	break;
     case WM_LBUTTONUP:
 	/* EPP if (wParam != MK_LBUTTON) */
-        if (GetCapture() == data->hWnd)
+        if (GetCapture() == PRIVATE(data)->hWnd)
 	{
 	    WCUSER_MoveSelection(data, WCUSER_GetCell(data, lParam), TRUE);
 	}
 	break;
     case WM_SETFOCUS:
-	if (data->cursor_visible)
+	if (data->curcfg.cursor_visible)
 	{
-	    CreateCaret(data->hWnd, data->cursor_bitmap, data->cell_width, data->cell_height); 
+	    CreateCaret(PRIVATE(data)->hWnd, PRIVATE(data)->cursor_bitmap, 
+                        data->curcfg.cell_width, data->curcfg.cell_height); 
 	    WCUSER_PosCursor(data);
 	}
         break; 
     case WM_KILLFOCUS: 
-	if (data->cursor_visible)
+	if (data->curcfg.cursor_visible)
 	    DestroyCaret(); 
 	break;
     case WM_HSCROLL: 
         {
-	    int	pos = data->win_pos.X;
+	    int	pos = data->curcfg.win_pos.X;
 
 	    switch (LOWORD(wParam)) 
 	    { 
@@ -757,11 +854,13 @@
             default: 					break;
 	    } 
 	    if (pos < 0) pos = 0;
-	    if (pos > data->sb_width - data->win_width) pos = data->sb_width - data->win_width;
-	    if (pos != data->win_pos.X)
+	    if (pos > data->curcfg.sb_width - data->curcfg.win_width) 
+                pos = data->curcfg.sb_width - data->curcfg.win_width;
+	    if (pos != data->curcfg.win_pos.X)
 	    {
-		ScrollWindow(hWnd, (data->win_pos.X - pos) * data->cell_width, 0, NULL, NULL);
-		data->win_pos.X = pos;
+		ScrollWindow(hWnd, (data->curcfg.win_pos.X - pos) * data->curcfg.cell_width, 0, 
+                             NULL, NULL);
+		data->curcfg.win_pos.X = pos;
 		SetScrollPos(hWnd, SB_HORZ, pos, TRUE); 
 		UpdateWindow(hWnd); 
 		WCUSER_PosCursor(data);
@@ -771,7 +870,7 @@
 	break;
     case WM_VSCROLL: 
         {
-	    int	pos = data->win_pos.Y;
+	    int	pos = data->curcfg.win_pos.Y;
 
 	    switch (LOWORD(wParam)) 
 	    { 
@@ -783,11 +882,13 @@
             default: 					break;
 	    } 
 	    if (pos < 0) pos = 0;
-	    if (pos > data->sb_height - data->win_height) pos = data->sb_height - data->win_height;
-	    if (pos != data->win_pos.Y)
+	    if (pos > data->curcfg.sb_height - data->curcfg.win_height) 
+                pos = data->curcfg.sb_height - data->curcfg.win_height;
+	    if (pos != data->curcfg.win_pos.Y)
 	    {
-		ScrollWindow(hWnd, 0, (data->win_pos.Y - pos) * data->cell_height, NULL, NULL);
-		data->win_pos.Y = pos;
+		ScrollWindow(hWnd, 0, (data->curcfg.win_pos.Y - pos) * data->curcfg.cell_height, 
+                             NULL, NULL);
+		data->curcfg.win_pos.Y = pos;
 		SetScrollPos(hWnd, SB_VERT, pos, TRUE); 
 		UpdateWindow(hWnd); 
 		WCUSER_PosCursor(data);
@@ -799,25 +900,38 @@
 	switch (wParam)
 	{
 	case IDS_DEFAULT:
-	    Trace(0, "unhandled yet command: %x\n", wParam);
+	    WCUSER_GetProperties(data, FALSE);
 	    break;
 	case IDS_PROPERTY:
-	    WCUSER_GetProperties(data);
+	    WCUSER_GetProperties(data, TRUE);
 	    break;
 	default: 
 	    return DefWindowProc(hWnd, uMsg, wParam, lParam);
 	}
 	break;
     case WM_RBUTTONDOWN:
-	WCUSER_GetProperties(data);
+        if ((wParam & (MK_CONTROL|MK_SHIFT)) == data->curcfg.menu_mask)
+        {
+            RECT        r;
+
+            GetWindowRect(hWnd, &r);
+            TrackPopupMenu(PRIVATE(data)->hPopMenu, TPM_LEFTALIGN|TPM_TOPALIGN, 
+                           r.left + LOWORD(lParam), r.top + HIWORD(lParam), 0, hWnd, NULL);
+        }
 	break;    
     case WM_COMMAND:
 	switch (wParam)
 	{
+	case IDS_DEFAULT:
+	    WCUSER_GetProperties(data, FALSE);
+	    break;
+	case IDS_PROPERTY:
+	    WCUSER_GetProperties(data, TRUE);
+	    break;
 	case IDS_MARK:
 	    goto niy;
 	case IDS_COPY:
-	    data->hasSelection = FALSE;
+	    PRIVATE(data)->hasSelection = FALSE;
 	    WCUSER_SetSelection(data, 0);
 	    WCUSER_CopySelectionToClipboard(data);
 	    break;
@@ -825,11 +939,11 @@
 	    WCUSER_PasteFromClipboard(data);
 	    break;
 	case IDS_SELECTALL:
-	    data->selectPt1.X = data->selectPt1.Y = 0;
-	    data->selectPt2.X = (data->sb_width - 1) * data->cell_width;
-	    data->selectPt2.Y = (data->sb_height - 1) * data->cell_height;
+	    PRIVATE(data)->selectPt1.X = PRIVATE(data)->selectPt1.Y = 0;
+	    PRIVATE(data)->selectPt2.X = (data->curcfg.sb_width - 1) * data->curcfg.cell_width;
+	    PRIVATE(data)->selectPt2.Y = (data->curcfg.sb_height - 1) * data->curcfg.cell_height;
 	    WCUSER_SetSelection(data, 0);
-	    data->hasSelection = TRUE;
+	    PRIVATE(data)->hasSelection = TRUE;
 	    break;
 	case IDS_SCROLL:
 	case IDS_SEARCH:
@@ -857,11 +971,13 @@
  */
 void WCUSER_DeleteBackend(struct inner_data* data)
 {
-    if (data->hWnd)		DestroyWindow(data->hWnd);
-    if (data->hFont)		DeleteObject(data->hFont);
-    if (data->cursor_bitmap)	DeleteObject(data->cursor_bitmap);
-    if (data->hMemDC)		DeleteDC(data->hMemDC);
-    if (data->hBitmap)		DeleteObject(data->hBitmap);
+    if (!PRIVATE(data)) return;
+    if (PRIVATE(data)->hWnd)		DestroyWindow(PRIVATE(data)->hWnd);
+    if (PRIVATE(data)->hFont)		DeleteObject(PRIVATE(data)->hFont);
+    if (PRIVATE(data)->cursor_bitmap)	DeleteObject(PRIVATE(data)->cursor_bitmap);
+    if (PRIVATE(data)->hMemDC)		DeleteDC(PRIVATE(data)->hMemDC);
+    if (PRIVATE(data)->hBitmap)		DeleteObject(PRIVATE(data)->hBitmap);
+    HeapFree(GetProcessHeap(), 0, PRIVATE(data));
 }
 
 /******************************************************************
@@ -912,7 +1028,9 @@
     static WCHAR wClassName[] = {'W','i','n','e','C','o','n','s','o','l','e','C','l','a','s','s',0};
 
     WNDCLASS		wndclass;
-    struct font_chooser fc;
+
+    data->private = HeapAlloc(GetProcessHeap(), 0, sizeof(struct inner_data_user));
+    if (!data->private) return FALSE;
 
     data->fnMainLoop = WCUSER_MainLoop;
     data->fnPosCursor = WCUSER_PosCursor;
@@ -940,17 +1058,21 @@
     CreateWindow(wndclass.lpszClassName, NULL,
 		 WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_HSCROLL|WS_VSCROLL, 
 		 CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0, 0, wndclass.hInstance, data);   
-    if (!data->hWnd) return FALSE;
+    if (!PRIVATE(data)->hWnd) return FALSE;
 
     /* force update of current data */
     WINECON_GrabChanges(data);
 
-    /* try to find an acceptable font */
-    fc.data = data;
-    fc.done = 0;
-    EnumFontFamilies(data->hMemDC, NULL, get_first_font_enum, (LPARAM)&fc);
-
-    return fc.done;
+    if (!WCUSER_InitFont(data))
+    {
+        struct font_chooser fc;
+        /* try to find an acceptable font */
+        fc.data = data;
+        fc.done = 0;
+        EnumFontFamilies(PRIVATE(data)->hMemDC, NULL, get_first_font_enum, (LPARAM)&fc);
+        return fc.done;
+    }
+    return TRUE;
 }
 
 
Index: programs/wineconsole/winecon_private.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/winecon_private.h,v
retrieving revision 1.1
diff -u -u -r1.1 winecon_private.h
--- programs/wineconsole/winecon_private.h	2001/11/23 23:05:03	1.1
+++ programs/wineconsole/winecon_private.h	2001/12/01 13:03:14
@@ -1,21 +1,39 @@
+/*
+ * an application for displaying Win32 console
+ *
+ * Copyright 2001 Eric Pouech
+ */
+
 #include <winbase.h>
-#include <wingdi.h>
-#include <winuser.h>
 #include <wincon.h>
 
 #include "wineconsole_res.h"
 
+/* this is the configuration stored & loaded into the registry */
+struct config_data {
+    unsigned	cell_width;	/* width in pixels of a character */	
+    unsigned	cell_height;	/* height in pixels of a character */
+    int		cursor_size;	/* in % of cell height */
+    int		cursor_visible;
+    DWORD       def_attr;
+    WCHAR       face_name[32];  /* name of font (size is LF_FACESIZE) */
+    DWORD       font_weight;
+    DWORD       history_size;
+    DWORD       menu_mask;      /* MK_CONTROL MK_SHIFT mask to drive submenu opening */
+    unsigned	sb_width;	/* active screen buffer width */
+    unsigned	sb_height;	/* active screen buffer height */
+    unsigned	win_width;	/* size (in cells) of visible part of window (width & height) */
+    unsigned	win_height;
+    COORD	win_pos;	/* position (in cells) of visible part of screen buffer in window */
+};
+
 struct inner_data {
-    unsigned		sb_width;	/* active screen buffer width */
-    unsigned		sb_height;	/* active screen buffer height */
+    struct config_data  curcfg;
+    struct config_data  defcfg;
+
     CHAR_INFO*		cells;		/* local copy of cells (sb_width * sb_height) */
-    COORD		win_pos;	/* position (in cells) of visible part of screen buffer in window */
-    unsigned		win_width;	/* size (in cells) of visible part of window (width & height) */
-    unsigned		win_height;
 
     COORD		cursor;		/* position in cells of cursor */
-    int			cursor_visible;
-    int			cursor_size;	/* in % of cell height */
 
     HANDLE		hConIn;		/* console input handle */
     HANDLE		hConOut;	/* screen buffer handle: has to be changed when active sb changes */
@@ -31,19 +49,7 @@
     void		(*fnScroll)(struct inner_data* data, int pos, BOOL horz);
     void		(*fnDeleteBackend)(struct inner_data* data);
 
-    /* the following fields are only user by the USER backend (should be hidden in user) */
-    HWND		hWnd;		/* handle to windows for rendering */
-    HFONT		hFont;		/* font used for rendering, usually fixed */
-    LOGFONT		logFont;	/* logFont dscription for used hFont */
-    unsigned		cell_width;	/* width in pixels of a character */	
-    unsigned		cell_height;	/* height in pixels of a character */
-    HDC			hMemDC;		/* memory DC holding the bitmap below */
-    HBITMAP		hBitmap;	/* bitmap of display window content */
-
-    HBITMAP		cursor_bitmap;  /* bitmap used for the caret */
-    BOOL		hasSelection;	/* a rectangular mouse selection has taken place */
-    COORD		selectPt1;	/* start (and end) point of a mouse selection */
-    COORD		selectPt2;
+    void*               private;        /* data part belonging to the choosen backed */
 };
 
 #  ifdef __GNUC__
@@ -59,6 +65,7 @@
 #  define Trace (1) ? (void)0 : XTracer
 #endif
 
+/* from wineconsole.c */
 extern void WINECON_NotifyWindowChange(struct inner_data* data);
 extern int  WINECON_GetHistorySize(HANDLE hConIn);
 extern BOOL WINECON_SetHistorySize(HANDLE hConIn, int size);
@@ -67,9 +74,10 @@
 extern BOOL WINECON_GetConsoleTitle(HANDLE hConIn, WCHAR* buffer, size_t len);
 extern void WINECON_FetchCells(struct inner_data* data, int upd_tp, int upd_bm);
 extern int  WINECON_GrabChanges(struct inner_data* data);
+
+/* from registry.c */
+extern BOOL WINECON_RegLoad(struct config_data* cfg);
+extern BOOL WINECON_RegSave(const struct config_data* cfg);
 
-extern BOOL WCUSER_GetProperties(struct inner_data*);
-extern BOOL WCUSER_SetFont(struct inner_data* data, const LOGFONT* font, const TEXTMETRIC* tm);
-extern BOOL WCUSER_ValidateFont(const struct inner_data* data, const LOGFONT* lf);
-extern BOOL WCUSER_ValidateFontMetric(const struct inner_data* data, const TEXTMETRIC* tm);
+/* backends... */
 extern BOOL WCUSER_InitBackend(struct inner_data* data);
Index: programs/wineconsole/wineconsole.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole.c,v
retrieving revision 1.3
diff -u -u -r1.3 wineconsole.c
--- programs/wineconsole/wineconsole.c	2001/11/30 18:46:49	1.3
+++ programs/wineconsole/wineconsole.c	2001/12/01 16:32:08
@@ -19,7 +19,7 @@
     if (level > trace_level) return;
 
     va_start(valist, format);
-    len = wvsnprintfA(buf, sizeof(buf), format, valist);
+    len = vsnprintf(buf, sizeof(buf), format, valist);
     va_end(valist);
  
     if (len <= -1) 
@@ -45,8 +45,8 @@
         req->y      = upd_tp;
         req->mode   = CHAR_INFO_MODE_TEXTATTR;
         req->wrap   = TRUE;
-        wine_server_set_reply( req, &data->cells[upd_tp * data->sb_width],
-                               (upd_bm-upd_tp+1) * data->sb_width * sizeof(CHAR_INFO) );
+        wine_server_set_reply( req, &data->cells[upd_tp * data->curcfg.sb_width],
+                               (upd_bm-upd_tp+1) * data->curcfg.sb_width * sizeof(CHAR_INFO) );
         wine_server_call( req );
     }
     SERVER_END_REQ;
@@ -63,10 +63,10 @@
     SERVER_START_REQ( set_console_output_info )
     {
         req->handle       = (handle_t)data->hConOut;
-        req->win_left     = data->win_pos.X;
-        req->win_top      = data->win_pos.Y;
-        req->win_right    = data->win_pos.X + data->win_width - 1;
-        req->win_bottom   = data->win_pos.Y + data->win_height - 1;
+        req->win_left     = data->curcfg.win_pos.X;
+        req->win_top      = data->curcfg.win_pos.Y;
+        req->win_right    = data->curcfg.win_pos.X + data->curcfg.win_width - 1;
+        req->win_bottom   = data->curcfg.win_pos.Y + data->curcfg.win_height - 1;
         req->mask         = SET_CONSOLE_OUTPUT_INFO_DISPLAY_WINDOW;
         wine_server_call( req );
     }
@@ -223,15 +223,15 @@
 	    }
 	    break;
 	case CONSOLE_RENDERER_SB_RESIZE_EVENT:
-	    if (data->sb_width != evts[i].u.resize.width || 
-		data->sb_height != evts[i].u.resize.height)
+	    if (data->curcfg.sb_width != evts[i].u.resize.width || 
+		data->curcfg.sb_height != evts[i].u.resize.height)
 	    {
 		Trace(1, " resize(%d,%d)", evts[i].u.resize.width, evts[i].u.resize.height);
-		data->sb_width  = evts[i].u.resize.width;
-		data->sb_height = evts[i].u.resize.height;
+		data->curcfg.sb_width  = evts[i].u.resize.width;
+		data->curcfg.sb_height = evts[i].u.resize.height;
 		
 		data->cells = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, data->cells,
-					  data->sb_width * data->sb_height * sizeof(CHAR_INFO));
+					  data->curcfg.sb_width * data->curcfg.sb_height * sizeof(CHAR_INFO));
 		if (!data->cells) {Trace(0, "OOM\n"); exit(0);}
 		data->fnResizeScreenBuffer(data);
 		data->fnComputePositions(data);
@@ -251,8 +251,8 @@
 	    }
 	    break;
 	case CONSOLE_RENDERER_CURSOR_GEOM_EVENT:
-	    if (evts[i].u.cursor_geom.size != data->cursor_size || 
-		evts[i].u.cursor_geom.visible != data->cursor_visible)
+	    if (evts[i].u.cursor_geom.size != data->curcfg.cursor_size || 
+		evts[i].u.cursor_geom.visible != data->curcfg.cursor_visible)
 	    {
 		data->fnShapeCursor(data, evts[i].u.cursor_geom.size, 
 				    evts[i].u.cursor_geom.visible, FALSE);
@@ -261,24 +261,24 @@
 	    }
 	    break;
 	case CONSOLE_RENDERER_DISPLAY_EVENT:
-	    if (evts[i].u.display.left != data->win_pos.X)
+	    if (evts[i].u.display.left != data->curcfg.win_pos.X)
 	    {
 		data->fnScroll(data, evts[i].u.display.left, TRUE);
 		data->fnPosCursor(data);
 		Trace(1, " h-scroll(%d)", evts[i].u.display.left);
 	    }
-	    if (evts[i].u.display.top != data->win_pos.Y)
+	    if (evts[i].u.display.top != data->curcfg.win_pos.Y)
 	    {
 		data->fnScroll(data, evts[i].u.display.top, FALSE);
 		data->fnPosCursor(data);
 		Trace(1, " v-scroll(%d)", evts[i].u.display.top);
 	    }
-	    if (evts[i].u.display.width != data->win_width || 
-		evts[i].u.display.height != data->win_height)
+	    if (evts[i].u.display.width != data->curcfg.win_width || 
+		evts[i].u.display.height != data->curcfg.win_height)
 	    {
 		Trace(1, " win-size(%d,%d)", evts[i].u.display.width, evts[i].u.display.height);
-		data->win_width = evts[i].u.display.width;
-		data->win_height = evts[i].u.display.height;
+		data->curcfg.win_width = evts[i].u.display.width;
+		data->curcfg.win_height = evts[i].u.display.height;
 		data->fnComputePositions(data);
 	    }
 	    break;
@@ -326,6 +326,10 @@
     data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data));
     if (!data) return 0;
 
+    /* load default registry settings, and copy them into our current configuration */
+    WINECON_RegLoad(&data->defcfg);
+    data->curcfg = data->defcfg;
+
     /* the handles here are created without the whistles and bells required by console
      * (mainly because wineconsole doesn't need it)
      * - there are not inheritable
@@ -351,20 +355,18 @@
         ret = !wine_server_call_err( req );
     }
     SERVER_END_REQ;
+    if (!ret) goto error;
 
-    if (ret) 
-    {    
-	SERVER_START_REQ(create_console_output)
-	{
-	    req->handle_in = (handle_t)data->hConIn;
-	    req->access    = GENERIC_WRITE|GENERIC_READ;
-	    req->share     = FILE_SHARE_READ|FILE_SHARE_WRITE;
-	    req->inherit   = FALSE;
-	    data->hConOut  = (HANDLE)(wine_server_call_err( req ) ? 0 : reply->handle_out);
-	}
-	SERVER_END_REQ;
-	if (data->hConOut) return data;
+    SERVER_START_REQ(create_console_output)
+    {
+        req->handle_in = (handle_t)data->hConIn;
+        req->access    = GENERIC_WRITE|GENERIC_READ;
+        req->share     = FILE_SHARE_READ|FILE_SHARE_WRITE;
+        req->inherit   = FALSE;
+        data->hConOut  = (HANDLE)(wine_server_call_err( req ) ? 0 : reply->handle_out);
     }
+    SERVER_END_REQ;
+    if (data->hConOut) return data;
 
  error:
     WINECON_Delete(data);
@@ -386,8 +388,7 @@
     /* we're in the case wineconsole <exe> <options>... spawn the new process */
     memset(&startup, 0, sizeof(startup));
     startup.cb          = sizeof(startup);
-    startup.dwFlags     = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
-    startup.wShowWindow = SW_SHOWNORMAL;
+    startup.dwFlags     = STARTF_USESTDHANDLES;
 
     /* the attributes of wineconsole's handles are not adequate for inheritance, so
      * get them with the correct attributes before process creation
@@ -421,6 +422,11 @@
     return done;
 }
 
+/******************************************************************
+ *		 WINECON_HasEvent
+ *
+ *
+ */
 static BOOL WINECON_HasEvent(LPCSTR ptr, unsigned *evt)
 {
     while (*ptr == ' ' || *ptr == '\t') ptr++;
Index: programs/wineconsole/wineconsole.spec
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole.spec,v
retrieving revision 1.1
diff -u -u -r1.1 wineconsole.spec
--- programs/wineconsole/wineconsole.spec	2001/11/23 23:05:04	1.1
+++ programs/wineconsole/wineconsole.spec	2001/11/25 20:49:34
@@ -7,6 +7,6 @@
 import -delay comctl32
 import  gdi32.dll
 import  user32.dll
-#import	advapi32.dll
+import	advapi32.dll
 import	kernel32.dll
 import	ntdll.dll
Index: programs/wineconsole/wineconsole_En.rc
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_En.rc,v
retrieving revision 1.1
diff -u -u -r1.1 wineconsole_En.rc
--- programs/wineconsole/wineconsole_En.rc	2001/11/23 23:05:04	1.1
+++ programs/wineconsole/wineconsole_En.rc	2001/12/01 06:34:14
@@ -14,6 +14,8 @@
 IDS_FNT_DISPLAY,	"Each character is %ld pixels wide on %ld pixels high"
 IDS_FNT_PREVIEW_1,	"This is a test"
 IDS_FNT_PREVIEW_2,	""
+IDS_DLG_TIT_DEFAULT     "Setup - Default settings"
+IDS_DLG_TIT_CURRENT     "Setup - Current settings"
 END
 
 IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
@@ -26,7 +28,11 @@
 	AUTORADIOBUTTON "&Medium", IDC_OPT_CURSOR_MEDIUM, 14, 33, 84, 10, WS_TABSTOP
 	AUTORADIOBUTTON "&Large", IDC_OPT_CURSOR_LARGE, 14, 43, 84, 10, WS_TABSTOP
 
-	GROUPBOX "Command history", -1, 10, 57, 180, 35, BS_GROUPBOX
+	GROUPBOX "Conf. open", -1, 140, 11, 60, 44, BS_GROUPBOX
+	AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 144, 23, 50, 10, WS_TABSTOP
+	AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 144, 33, 50, 10, WS_TABSTOP
+
+	GROUPBOX "Command history", -1, 10, 57, 190, 35, BS_GROUPBOX
 	LTEXT "&Numbers of recalled commands :", -1, 14, 67, 78, 18
 	EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
@@ -39,10 +45,13 @@
 FONT 8, "Helv"
 {
 	LTEXT "&Font", -1, 5, 5, 24, 8
-	LISTBOX IDC_FNT_LIST_FONT, 5,18,109,42, LBS_SORT|WS_VSCROLL
-	LTEXT "&Size", -1, 128, 5, 60, 8
-	LISTBOX IDC_FNT_LIST_SIZE, 128, 18, 50, 60, WS_VSCROLL
-	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5,60,109,40
+	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
+	LTEXT "&Color", -1, 100, 5, 50, 8
+	CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
+	CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
+	LTEXT "&Size", -1, 158, 5, 40, 8
+	LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL
+	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
 	LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 18
 }
 
Index: programs/wineconsole/wineconsole_Fr.rc
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_Fr.rc,v
retrieving revision 1.1
diff -u -u -r1.1 wineconsole_Fr.rc
--- programs/wineconsole/wineconsole_Fr.rc	2001/11/23 23:05:04	1.1
+++ programs/wineconsole/wineconsole_Fr.rc	2001/12/01 06:36:58
@@ -14,6 +14,8 @@
 IDS_FNT_DISPLAY,	"Chaque caract?re a %ld points en largeur et %ld points en hauteur"
 IDS_FNT_PREVIEW_1,	"Ceci est un test"
 IDS_FNT_PREVIEW_2,	"?????"
+IDS_DLG_TIT_DEFAULT     "Configuration par d?fault"
+IDS_DLG_TIT_CURRENT     "Configuration courante"
 END
 
 IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
@@ -26,7 +28,11 @@
 	AUTORADIOBUTTON "&Moyen", IDC_OPT_CURSOR_MEDIUM, 14, 33, 84, 10, WS_TABSTOP
 	AUTORADIOBUTTON "&Grand", IDC_OPT_CURSOR_LARGE, 14, 43, 84, 10, WS_TABSTOP
 
-	GROUPBOX "Historique des commandes", -1, 10, 57, 180, 35, BS_GROUPBOX
+	GROUPBOX "Ouverture conf.", -1, 140, 11, 60, 44, BS_GROUPBOX
+	AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 144, 23, 50, 10, WS_TABSTOP
+	AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 144, 33, 50, 10, WS_TABSTOP
+
+	GROUPBOX "Historique des commandes", -1, 10, 57, 190, 35, BS_GROUPBOX
 	LTEXT "&Taille de la m?moire tampon :", -1, 14, 67, 78, 18
 	EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
@@ -39,9 +45,12 @@
 FONT 8, "Helv"
 {
 	LTEXT "&Police", -1, 5, 5, 24, 8
-	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 109, 42, LBS_SORT|WS_VSCROLL
-	LTEXT "&Taille", -1, 128, 5, 60, 8
-	LISTBOX IDC_FNT_LIST_SIZE, 128, 18, 50, 60, WS_VSCROLL
+	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
+	LTEXT "&Couleur", -1, 100, 5, 50, 8
+	CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
+	CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
+	LTEXT "&Taille", -1, 158, 5, 40, 8
+	LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL
 	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
 	LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 18
 }
@@ -67,6 +76,4 @@
 	EDITTEXT IDC_CNF_WIN_HEIGHT, 78, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 }
-
-
 
Index: programs/wineconsole/wineconsole_res.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_res.h,v
retrieving revision 1.1
diff -u -u -r1.1 wineconsole_res.h
--- programs/wineconsole/wineconsole_res.h	2001/11/23 23:05:04	1.1
+++ programs/wineconsole/wineconsole_res.h	2001/11/28 20:37:01
@@ -12,6 +12,9 @@
 #define IDS_SCROLL		0x114
 #define IDS_SEARCH		0x115
 
+#define IDS_DLG_TIT_DEFAULT     0x120
+#define IDS_DLG_TIT_CURRENT     0x121
+
 #define IDS_FNT_DISPLAY		0x200
 #define IDS_FNT_PREVIEW_1	0x201
 #define IDS_FNT_PREVIEW_2	0x202
@@ -27,11 +30,15 @@
 #define IDC_OPT_HIST_SIZE	0x0104
 #define IDC_OPT_HIST_SIZE_UD	0x0105
 #define IDC_OPT_HIST_DOUBLE	0x0106
+#define IDC_OPT_CONF_CTRL       0x0107
+#define IDC_OPT_CONF_SHIFT      0x0108
 
 #define IDC_FNT_LIST_FONT	0x0201
 #define IDC_FNT_LIST_SIZE	0x0202
-#define IDC_FNT_FONT_INFO	0x0203
-#define IDC_FNT_PREVIEW		0x0204
+#define IDC_FNT_COLOR_BK 	0x0203
+#define IDC_FNT_COLOR_FG 	0x0204
+#define IDC_FNT_FONT_INFO	0x0205
+#define IDC_FNT_PREVIEW		0x0206
 
 #define IDC_CNF_SB_WIDTH	0x0301
 #define IDC_CNF_SB_WIDTH_UD	0x0302
--- /dev/null	Wed Sep 27 12:31:54 2000
+++ programs/wineconsole/registry.c	Sat Dec  1 13:48:59 2001
@@ -0,0 +1,143 @@
+/*
+ * an application for displaying Win32 console
+ *      registry and init functions
+ *
+ * Copyright 2001 Eric Pouech
+ */
+
+#include "winbase.h"
+#include "winreg.h"
+#include "winecon_private.h"
+
+static WCHAR wszConsole[]           = {'C','o','n','s','o','l','e',0};
+static WCHAR wszCursorSize[]        = {'C','u','r','s','o','r','S','i','z','e',0};
+static WCHAR wszCursorVisible[]     = {'C','u','r','s','o','r','V','i','s','i','b','l','e',0};
+static WCHAR wszFaceName[]          = {'F','a','c','e','N','a','m','e',0};
+static WCHAR wszFontSize[]          = {'F','o','n','t','S','i','z','e',0};
+static WCHAR wszFontWeight[]        = {'F','o','n','t','W','e','i','g','h','t',0};
+static WCHAR wszHistoryBufferSize[] = {'H','i','s','t','o','r','y','B','u','f','f','e','r','S','i','z','e',0};
+static WCHAR wszMenuMask[]          = {'M','e','n','u','M','a','s','k',0};
+static WCHAR wszScreenBufferSize[]  = {'S','c','r','e','e','n','B','u','f','f','e','r','S','i','z','e',0};
+static WCHAR wszScreenColors[]      = {'S','c','r','e','e','n','C','o','l','o','r','s',0};
+static WCHAR wszWindowSize[]        = {'W','i','n','d','o','w','S','i','z','e',0};
+
+/******************************************************************
+ *		WINECON_RegLoad
+ *
+ *
+ */
+extern BOOL WINECON_RegLoad(struct config_data* cfg)
+{
+    HKEY        hConKey;
+    DWORD 	type;
+    DWORD 	count;
+    DWORD       val;
+
+    if (RegOpenKey(HKEY_CURRENT_USER, wszConsole, &hConKey)) hConKey = 0;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszCursorSize, 0, &type, (char*)&val, &count)) 
+        val = 25;
+    cfg->cursor_size = val;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszCursorVisible, 0, &type, (char*)&val, &count)) 
+        val = 1;
+    cfg->cursor_visible = val;
+
+    count = sizeof(cfg->face_name); 
+    if (!hConKey || RegQueryValueEx(hConKey, wszFaceName, 0, &type, (char*)&cfg->face_name, &count))
+        cfg->face_name[0] = 0;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszFontSize, 0, &type, (char*)&val, &count)) 
+        val = 0x000C0008;
+    cfg->cell_height = HIWORD(val);
+    cfg->cell_width  = LOWORD(val);
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszFontWeight, 0, &type, (char*)&val, &count)) 
+        val = 0;
+    cfg->font_weight = val;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszHistoryBufferSize, 0, &type, (char*)&val, &count)) 
+        val = 0;
+    cfg->history_size = val;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszMenuMask, 0, &type, (char*)&val, &count)) 
+        val = 0;
+    cfg->menu_mask = val;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszScreenBufferSize, 0, &type, (char*)&val, &count)) 
+        val = 0x000C0008;
+    cfg->sb_height = HIWORD(val);
+    cfg->sb_width  = LOWORD(val);
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszScreenColors, 0, &type, (char*)&val, &count)) 
+        val = 0x0007;
+    cfg->def_attr = val;
+
+    count = sizeof(val);
+    if (!hConKey || RegQueryValueEx(hConKey, wszWindowSize, 0, &type, (char*)&val, &count)) 
+        val = 0x000C0008;
+    cfg->win_height = HIWORD(val);
+    cfg->win_width  = LOWORD(val);
+
+    /* win_pos isn't read from registry */
+
+    if (hConKey) RegCloseKey(hConKey);
+    return TRUE;
+}
+
+/******************************************************************
+ *		WINECON_RegSave
+ *
+ *
+ */
+extern BOOL WINECON_RegSave(const struct config_data* cfg)
+{
+    HKEY        hConKey;
+    DWORD       val;
+
+    if (RegCreateKey(HKEY_CURRENT_USER, wszConsole, &hConKey)) 
+    {
+        Trace(0, "Can't open registry for saving\n");
+        return FALSE;
+    }
+   
+    val = cfg->cursor_size;
+    RegSetValueEx(hConKey, wszCursorSize, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = cfg->cursor_visible;
+    RegSetValueEx(hConKey, wszCursorVisible, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    RegSetValueEx(hConKey, wszFaceName, 0, REG_SZ, (char*)&cfg->face_name, sizeof(cfg->face_name));
+
+    val = MAKELONG(cfg->cell_width, cfg->cell_height);
+    RegSetValueEx(hConKey, wszFontSize, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = cfg->font_weight;
+    RegSetValueEx(hConKey, wszFontWeight, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = cfg->history_size;
+    RegSetValueEx(hConKey, wszHistoryBufferSize, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = cfg->menu_mask;
+    RegSetValueEx(hConKey, wszMenuMask, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = MAKELONG(cfg->sb_width, cfg->sb_height);
+    RegSetValueEx(hConKey, wszScreenBufferSize, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = cfg->def_attr;
+    RegSetValueEx(hConKey, wszScreenColors, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    val = MAKELONG(cfg->win_width, cfg->win_height);
+    RegSetValueEx(hConKey, wszWindowSize, 0, REG_DWORD, (char*)&val, sizeof(val));
+
+    RegCloseKey(hConKey);
+    return TRUE;
+}
--- /dev/null	Wed Sep 27 12:31:54 2000
+++ programs/wineconsole/winecon_user.h	Sat Dec  1 14:03:00 2001
@@ -0,0 +1,37 @@
+/*
+ * an application for displaying Win32 console
+ * USER32 backend
+ *
+ * Copyright 2001 Eric Pouech
+ */
+
+#include <winbase.h>
+#include <wingdi.h>
+#include <winuser.h>
+#include "winecon_private.h"
+
+struct inner_data_user {
+    /* the following fields are only user by the USER backend (should be hidden in user) */
+    HWND		hWnd;		/* handle to windows for rendering */
+    HFONT		hFont;		/* font used for rendering, usually fixed */
+    HDC			hMemDC;		/* memory DC holding the bitmap below */
+    HBITMAP		hBitmap;	/* bitmap of display window content */
+    HMENU               hPopMenu;       /* popup menu triggered by right mouse click */
+
+    HBITMAP		cursor_bitmap;  /* bitmap used for the caret */
+    BOOL		hasSelection;	/* a rectangular mouse selection has taken place */
+    COORD		selectPt1;	/* start (and end) point of a mouse selection */
+    COORD		selectPt2;
+};
+
+#define PRIVATE(data)   ((struct inner_data_user*)((data)->private))
+
+/* from user.c */
+extern COLORREF	WCUSER_ColorMap[16];
+extern BOOL WCUSER_GetProperties(struct inner_data*, BOOL);
+extern BOOL WCUSER_SetFont(struct inner_data* data, const LOGFONT* font);
+extern BOOL WCUSER_ValidateFont(const struct inner_data* data, const LOGFONT* lf);
+extern BOOL WCUSER_ValidateFontMetric(const struct inner_data* data, const TEXTMETRIC* tm);
+extern BOOL WCUSER_AreFontsEqual(const struct config_data* config, const LOGFONT* lf);
+extern void WCUSER_CopyFont(struct config_data* config, const LOGFONT* lf);
+


More information about the wine-patches mailing list