console 2/2

Eric Pouech eric.pouech at wanadoo.fr
Sun Sep 1 15:03:43 CDT 2002


see first message for the details

A+
-------------- next part --------------
Name:          wc
ChangeLog:     added configuration on per application basis
	added ability to override part of the configuration from console creator
	revisited a bit wineconsole startup
	 added dialog part for window closing at process termination
License:       X11
GenDate:       2002/09/01 19:48:56 UTC
ModifiedFiles: programs/wineconsole/dialog.c programs/wineconsole/registry.c programs/wineconsole/user.c programs/wineconsole/winecon_private.h programs/wineconsole/winecon_user.h programs/wineconsole/wineconsole.c programs/wineconsole/wineconsole_De.rc programs/wineconsole/wineconsole_En.rc programs/wineconsole/wineconsole_Fr.rc programs/wineconsole/wineconsole_res.h
AddedFiles:    
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/dialog.c,v
retrieving revision 1.11
diff -u -u -r1.11 dialog.c
--- programs/wineconsole/dialog.c	23 Jul 2002 02:02:46 -0000	1.11
+++ programs/wineconsole/dialog.c	31 Aug 2002 20:29:08 -0000
@@ -1,6 +1,6 @@
 /* dialog management for wineconsole
  * USER32 backend
- * Copyright (c) 2001 Eric Pouech
+ * Copyright (c) 2001, 2002 Eric Pouech
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -27,20 +27,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(wineconsole);
 
-enum WCUSER_ApplyTo {
-    /* Prop sheet CFG */
-    WCUSER_ApplyToCursorSize,
-    WCUSER_ApplyToHistorySize, WCUSER_ApplyToHistoryMode, WCUSER_ApplyToMenuMask,
-    WCUSER_ApplyToEditMode,
-    /* Prop sheet FNT */
-    WCUSER_ApplyToFont, WCUSER_ApplyToAttribute,
-    /* Prop sheep CNF */
-    WCUSER_ApplyToBufferSize, WCUSER_ApplyToWindow
-};
-
 struct dialog_info
 {
-    struct config_data* config;         /* pointer to configuration used for dialog box */
+    struct config_data  config;         /* 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 */
@@ -50,104 +39,9 @@
         UINT                    weight;
         WCHAR                   faceName[LF_FACESIZE];
     } 			*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_ApplyToEditMode:
-        di->config->quick_edit = val;
-        break;
-    case WCUSER_ApplyToFont:
-        {
-            LOGFONT     lf;
-            HFONT       hFont;
-
-            WCUSER_FillLogFont(&lf, di->font[val].faceName,
-                               di->font[val].height, di->font[val].weight);
-            hFont = WCUSER_CopyFont(di->config, PRIVATE(di->data)->hWnd, &lf);
-            DeleteObject(hFont);
-        }
-        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_ApplyToEditMode:
-        di->config->quick_edit = val;
-        break;
-    case WCUSER_ApplyToFont:
-        {
-            LOGFONT lf;
-            WCUSER_FillLogFont(&lf, di->font[val].faceName,
-                               di->font[val].height, di->font[val].weight);
-            WCUSER_SetFont(di->data, &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
@@ -164,19 +58,19 @@
 	di->hDlg = hDlg;
 	SetWindowLong(hDlg, DWL_USER, (DWORD)di);
 
-	if (di->config->cursor_size <= 25)	idc = IDC_OPT_CURSOR_SMALL;
-	else if (di->config->cursor_size <= 50)	idc = IDC_OPT_CURSOR_MEDIUM;
+	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_HIST_NODOUBLE, BM_SETCHECK, 
+                           (di->config.history_nodup) ? BST_CHECKED : BST_UNCHECKED, 0L);
         SendDlgItemMessage(hDlg, IDC_OPT_CONF_CTRL, BM_SETCHECK,
-                           (di->config->menu_mask & MK_CONTROL) ? BST_CHECKED : BST_UNCHECKED, 0L);
+                           (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);
+                           (di->config.menu_mask & MK_SHIFT) ? BST_CHECKED : BST_UNCHECKED, 0L);
         SendDlgItemMessage(hDlg, IDC_OPT_QUICK_EDIT, BM_SETCHECK,
-                           (di->config->quick_edit) ? BST_CHECKED : BST_UNCHECKED, 0L);
+                           (di->config.quick_edit) ? BST_CHECKED : BST_UNCHECKED, 0L);
 	return FALSE; /* because we set the focus */
     case WM_COMMAND:
 	break;
@@ -207,22 +101,22 @@
 	case PSN_APPLY:
 	    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);
+	    else val = 100;
+            di->config.cursor_size = val;
 
  	    val = GetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, &done, FALSE);
-	    if (done) (di->apply)(di, hDlg, WCUSER_ApplyToHistorySize, val);
+	    if (done) di->config.history_size = val;
 
-	    (di->apply)(di, hDlg, WCUSER_ApplyToHistoryMode,
-                        IsDlgButtonChecked(hDlg, IDC_OPT_HIST_DOUBLE) & BST_CHECKED);
+            val = (IsDlgButtonChecked(hDlg, IDC_OPT_HIST_NODOUBLE) & BST_CHECKED) ? TRUE : FALSE;
+            di->config.history_nodup = val;
 
             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);
+            di->config.menu_mask = val;
 
             val = (IsDlgButtonChecked(hDlg, IDC_OPT_QUICK_EDIT) & BST_CHECKED) ? TRUE : FALSE;
-            (di->apply)(di, hDlg, WCUSER_ApplyToEditMode, val);
+            di->config.quick_edit = val;
 
             SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
@@ -570,9 +464,9 @@
 
 	for (idx = 0; idx < di->nFont; idx++)
 	{
-            if (!lstrcmp(di->font[idx].faceName, di->config->face_name) &&
-                di->font[idx].height == di->config->cell_height &&
-                di->font[idx].weight == di->config->font_weight)
+            if (!lstrcmp(di->font[idx].faceName, di->config.face_name) &&
+                di->font[idx].height == di->config.cell_height &&
+                di->font[idx].weight == di->config.font_weight)
             {
                 if (ref == -1) ref = idx;
                 else WINE_TRACE("Several matches found: ref=%d idx=%d\n", ref, idx);
@@ -597,7 +491,7 @@
     SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_RESETCONTENT, 0L, 0L);
     EnumFontFamilies(PRIVATE(di->data)->hMemDC, NULL, font_enum, (LPARAM)di);
     if (SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_SELECTSTRING,
-			   (WPARAM)-1, (LPARAM)di->config->face_name) == 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;
@@ -621,8 +515,8 @@
         /* remove dialog from this control, font will be reset when listboxes are filled */
         SendDlgItemMessage(hDlg, IDC_FNT_PREVIEW, WM_SETFONT, 0L, 0L);
 	fill_list_font(di);
-        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0, (di->config->def_attr >> 4) & 0x0F);
-        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0, di->config->def_attr & 0x0F);
+        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0, (di->config.def_attr >> 4) & 0x0F);
+        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0, di->config.def_attr & 0x0F);
 	break;
     case WM_COMMAND:
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
@@ -656,11 +550,19 @@
 	case PSN_APPLY:
  	    val = SendDlgItemMessage(hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
 
-	    if (val < di->nFont) (di->apply)(di, hDlg, WCUSER_ApplyToFont, val);
+	    if (val < di->nFont)
+            {
+                LOGFONT lf;
+                
+                WCUSER_FillLogFont(&lf, di->font[val].faceName,
+                                   di->font[val].height, di->font[val].weight);
+                DeleteObject(WCUSER_CopyFont(&di->config, 
+                                             PRIVATE(di->data)->hWnd, &lf));
+            }
 
-            (di->apply)(di, hDlg, WCUSER_ApplyToAttribute,
-                        (GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0) << 4) |
-                        GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0));
+            val = (GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0) << 4) |
+                GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0);
+            di->config.def_attr = val;
 
             SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
@@ -690,10 +592,12 @@
 	di = (struct dialog_info*)((PROPSHEETPAGEA*)lParam)->lParam;
 	di->hDlg = hDlg;
 	SetWindowLong(hDlg, DWL_USER, (DWORD)di);
-	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);
+	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);
+        SendDlgItemMessage(hDlg, IDC_CNF_CLOSE_EXIT, BM_SETCHECK,
+                           (di->config.exit_on_die) ? BST_CHECKED : BST_UNCHECKED, 0L);
 	break;
     case WM_COMMAND:
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
@@ -704,9 +608,8 @@
     case WM_NOTIFY:
     {
 	NMHDR*	        nmhdr = (NMHDR*)lParam;
-        COORD           sb;
-        SMALL_RECT	pos;
-        BOOL	        st_w, st_h;
+        int             x, y;
+        BOOL            st1, st2;
 
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
 	switch (nmhdr->code)
@@ -715,22 +618,23 @@
             di->hDlg = hDlg;
             break;
 	case PSN_APPLY:
-            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))
+            x = GetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,  &st1, FALSE);
+            y = GetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT, &st2, FALSE);
+            if (st1 && st2)
             {
-                (di->apply)(di, hDlg, WCUSER_ApplyToBufferSize, (DWORD)&sb);
+                di->config.sb_width  = x;
+                di->config.sb_height = y;
             }
 
-            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))
+            x = GetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  &st1, FALSE);
+            y = GetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, &st2, FALSE);
+            if (st1 && st2)
             {
-                pos.Left = pos.Top = 0;
-                pos.Right--; pos.Bottom--;
-                (di->apply)(di, hDlg, WCUSER_ApplyToWindow, (DWORD)&pos);
+                di->config.win_width  = x;
+                di->config.win_height = y;
             }
+            di->config.exit_on_die = IsDlgButtonChecked(hDlg, IDC_CNF_CLOSE_EXIT) ? 1 : 0;
+
             SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
 	default:
@@ -745,6 +649,36 @@
 }
 
 /******************************************************************
+ *		WCUSER_SaveDlgProc
+ *
+ *      Dialog Procedure for choosing how to handle modification to the
+ * console settings.
+ */
+static BOOL WINAPI WCUSER_SaveDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    switch (msg)
+    {
+    case WM_INITDIALOG:
+	break;
+    case WM_COMMAND:
+	switch (LOWORD(wParam))
+	{
+        case IDOK:
+            EndDialog(hDlg, 
+                      (IsDlgButtonChecked(hDlg, IDC_SAV_SAVE) == BST_CHECKED) ?
+                      IDC_SAV_SAVE : IDC_SAV_SESSION);      
+            break;
+        case IDCANCEL:
+            EndDialog(hDlg, IDCANCEL); break;
+	}
+        break;
+    default:
+        return FALSE;
+    }
+    return TRUE;
+}
+
+/******************************************************************
  *		WCUSER_GetProperties
  *
  * Runs the dialog box to set up the wineconsole options
@@ -759,23 +693,29 @@
     static const WCHAR szFntPreview[] = {'W','i','n','e','C','o','n','F','o','n','t','P','r','e','v','i','e','w',0};
     static const 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;
+    struct config_data  defcfg;
+    struct config_data* refcfg;
+    BOOL                save, modify_session;
 
     InitCommonControls();
 
     di.data = data;
     if (current)
     {
-        di.config = &data->curcfg;
-        di.apply = WCUSER_ApplyCurrent;
+        refcfg = &data->curcfg;
+        save = FALSE;
     }
     else
     {
-        di.config = &data->defcfg;
-        di.apply = WCUSER_ApplyDefault;
+        WINECON_RegLoad(NULL, refcfg = &defcfg);
+        save = TRUE;
     }
+    di.config = *refcfg;
     di.nFont = 0;
     di.font = NULL;
 
+    modify_session = FALSE;
+
     wndclass.style         = 0;
     wndclass.lpfnWndProc   = WCUSER_FontPreviewProc;
     wndclass.cbClsExtra    = 0;
@@ -838,7 +778,29 @@
     psHead.hwndParent = PRIVATE(data)->hWnd;
     psHead.u3.phpage = psPage;
 
+    WINECON_DumpConfig("init", refcfg);
+
     PropertySheet(&psHead);
+
+    if (memcmp(refcfg, &di.config, sizeof(*refcfg)) == 0)
+        return TRUE;
+
+    WINECON_DumpConfig("ref", refcfg);
+    WINECON_DumpConfig("cur", &di.config);
+    if (refcfg == &data->curcfg)
+    {
+        switch (DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SAVE_SETTINGS),
+                          PRIVATE(data)->hWnd, WCUSER_SaveDlgProc))
+        {
+        case IDC_SAV_SAVE:      save = TRUE; modify_session = TRUE; break;
+        case IDC_SAV_SESSION:   modify_session = TRUE; break;
+        case IDCANCEL:          break;
+        default: WINE_ERR("ooch\n");
+        }
+    }
+
+    if (modify_session) WINECON_SetConfig(data, &di.config, FALSE);
+    if (save)           WINECON_RegSave(&di.config);
 
     return TRUE;
 }
Index: programs/wineconsole/registry.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/registry.c,v
retrieving revision 1.8
diff -u -u -r1.8 registry.c
--- programs/wineconsole/registry.c	23 Jul 2002 02:02:46 -0000	1.8
+++ programs/wineconsole/registry.c	1 Sep 2002 19:16:59 -0000
@@ -35,111 +35,177 @@
 static const WCHAR wszFontSize[]          = {'F','o','n','t','S','i','z','e',0};
 static const WCHAR wszFontWeight[]        = {'F','o','n','t','W','e','i','g','h','t',0};
 static const WCHAR wszHistoryBufferSize[] = {'H','i','s','t','o','r','y','B','u','f','f','e','r','S','i','z','e',0};
+static const WCHAR wszHistoryNoDup[]      = {'H','i','s','t','o','r','y','N','o','D','u','p',0};
 static const WCHAR wszMenuMask[]          = {'M','e','n','u','M','a','s','k',0};
 static const WCHAR wszQuickEdit[]         = {'Q','u','i','c','k','E','d','i','t',0};
 static const WCHAR wszScreenBufferSize[]  = {'S','c','r','e','e','n','B','u','f','f','e','r','S','i','z','e',0};
 static const WCHAR wszScreenColors[]      = {'S','c','r','e','e','n','C','o','l','o','r','s',0};
 static const WCHAR wszWindowSize[]        = {'W','i','n','d','o','w','S','i','z','e',0};
 
+void WINECON_DumpConfig(const char* pfx, const struct config_data* cfg)
+{
+    WINE_TRACE("%s cell=(%u,%u) cursor=(%d,%d) attr=%02lx font=%s/%lu hist=%lu/%d flags=%c%c msk=%08lx sb=(%u,%u) win=(%u,%u)x(%u,%u) registry=%s\n",
+               pfx, cfg->cell_width, cfg->cell_height, cfg->cursor_size, cfg->cursor_visible, cfg->def_attr,
+               wine_dbgstr_w(cfg->face_name), cfg->font_weight, cfg->history_size, cfg->history_nodup ? 1 : 2,
+               cfg->quick_edit ? 'Q' : 'q', cfg->exit_on_die ? 'X' : 'x',
+               cfg->menu_mask, cfg->sb_width, cfg->sb_height, cfg->win_pos.X, cfg->win_pos.Y, cfg->win_width, cfg->win_height, 
+               wine_dbgstr_w(cfg->registry));
+}
+
 /******************************************************************
- *		WINECON_RegLoad
+ *		WINECON_CreateKeyName
  *
+ * Get a proper key name from an appname (mainly convert '\\' to '_')
+ */
+static LPWSTR   WINECON_CreateKeyName(LPCWSTR kn)
+{
+    LPWSTR      ret = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(kn) + 1) * sizeof(WCHAR));
+    LPWSTR      ptr = ret;
+
+    if (!ptr) WINECON_Fatal("OOM");
+
+    do
+    {
+        *ptr++ = *kn == '\\' ? '_' : *kn;
+    } while (*kn++ != 0);
+    return ret;
+}
+    
+/******************************************************************
+ *		WINECON_RegLoadHelper
  *
+ * Read the basic configuration from any console key or subkey
  */
-BOOL WINECON_RegLoad(struct config_data* cfg)
+static void WINECON_RegLoadHelper(HKEY hConKey, struct config_data* cfg)
 {
-    HKEY        hConKey;
     DWORD 	type;
     DWORD 	count;
     DWORD       val;
 
-    WINE_TRACE("loading registry settings.\n");
-    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;
+    if (!RegQueryValueEx(hConKey, wszCursorSize, 0, &type, (char*)&val, &count))
+        cfg->cursor_size = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszCursorVisible, 0, &type, (char*)&val, &count))
-        val = 1;
-    cfg->cursor_visible = val;
+    if (!RegQueryValueEx(hConKey, wszCursorVisible, 0, &type, (char*)&val, &count))
+        cfg->cursor_visible = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszExitOnDie, 0, &type, (char*)&val, &count))
-        val = 1;
-    cfg->exit_on_die = val;
+    if (!RegQueryValueEx(hConKey, wszExitOnDie, 0, &type, (char*)&val, &count))
+        cfg->exit_on_die = val;
 
     count = sizeof(cfg->face_name);
-    if (!hConKey || RegQueryValueEx(hConKey, wszFaceName, 0, &type, (char*)&cfg->face_name, &count))
-        cfg->face_name[0] = 0;
+    RegQueryValueEx(hConKey, wszFaceName, 0, &type, (char*)&cfg->face_name, &count);
+
+    count = sizeof(val);
+    if (!RegQueryValueEx(hConKey, wszFontSize, 0, &type, (char*)&val, &count))
+    {
+        cfg->cell_height = HIWORD(val);
+        cfg->cell_width  = LOWORD(val);
+    }
 
     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);
+    if (!RegQueryValueEx(hConKey, wszFontWeight, 0, &type, (char*)&val, &count))
+        cfg->font_weight = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszFontWeight, 0, &type, (char*)&val, &count))
-        val = 0;
-    cfg->font_weight = val;
+    if (!RegQueryValueEx(hConKey, wszHistoryBufferSize, 0, &type, (char*)&val, &count))
+        cfg->history_size = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszHistoryBufferSize, 0, &type, (char*)&val, &count))
-        val = 0;
-    cfg->history_size = val;
+    if (!RegQueryValueEx(hConKey, wszHistoryNoDup, 0, &type, (char*)&val, &count))
+        cfg->history_nodup = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszMenuMask, 0, &type, (char*)&val, &count))
-        val = 0;
-    cfg->menu_mask = val;
+    if (!RegQueryValueEx(hConKey, wszMenuMask, 0, &type, (char*)&val, &count))
+        cfg->menu_mask = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszQuickEdit, 0, &type, (char*)&val, &count))
-        val = 0;
-    cfg->quick_edit = val;
+    if (!RegQueryValueEx(hConKey, wszQuickEdit, 0, &type, (char*)&val, &count))
+        cfg->quick_edit = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszScreenBufferSize, 0, &type, (char*)&val, &count))
-        val = 0x00190050;
-    cfg->sb_height = HIWORD(val);
-    cfg->sb_width  = LOWORD(val);
+    if (!RegQueryValueEx(hConKey, wszScreenBufferSize, 0, &type, (char*)&val, &count))
+    {
+        cfg->sb_height = HIWORD(val);
+        cfg->sb_width  = LOWORD(val);
+    }
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszScreenColors, 0, &type, (char*)&val, &count))
-        val = 0x000F;
-    cfg->def_attr = val;
+    if (!RegQueryValueEx(hConKey, wszScreenColors, 0, &type, (char*)&val, &count))
+        cfg->def_attr = val;
 
     count = sizeof(val);
-    if (!hConKey || RegQueryValueEx(hConKey, wszWindowSize, 0, &type, (char*)&val, &count))
-        val = 0x00190050;
-    cfg->win_height = HIWORD(val);
-    cfg->win_width  = LOWORD(val);
+    if (!RegQueryValueEx(hConKey, wszWindowSize, 0, &type, (char*)&val, &count))
+    {
+        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
+ *		WINECON_RegLoad
  *
  *
  */
-BOOL WINECON_RegSave(const struct config_data* cfg)
+void WINECON_RegLoad(const WCHAR* appname, struct config_data* cfg)
 {
     HKEY        hConKey;
-    DWORD       val;
 
-    WINE_TRACE("saving registry settings.\n");
-    if (RegCreateKey(HKEY_CURRENT_USER, wszConsole, &hConKey))
+    WINE_TRACE("loading %s registry settings.\n", appname ? wine_dbgstr_w(appname) : "default");
+
+    /* first set default values */
+    cfg->cursor_size = 25;
+    cfg->cursor_visible = 1;
+    cfg->exit_on_die = 1;
+    cfg->face_name[0] = 0;
+    cfg->cell_height = 12;
+    cfg->cell_width  = 8;
+    cfg->font_weight = 0;
+    cfg->history_size = 0;
+    cfg->history_nodup = 0;
+    cfg->menu_mask = 0;
+    cfg->quick_edit = 0;
+    cfg->sb_height = 25;
+    cfg->sb_width  = 80;
+    cfg->def_attr = 0x000F;
+    cfg->win_height = 25;
+    cfg->win_width  = 80;
+    cfg->registry = NULL;
+
+    /* then read global settings */
+    if (!RegOpenKey(HKEY_CURRENT_USER, wszConsole, &hConKey))
     {
-        WINE_ERR("Can't open registry for saving\n");
-        return FALSE;
+        WINECON_RegLoadHelper(hConKey, cfg);
+        /* if requested, load part related to console title */
+        if (appname)
+        {
+            HKEY        hAppKey;
+
+            cfg->registry = WINECON_CreateKeyName(appname);
+            if (!RegOpenKey(hConKey, cfg->registry, &hAppKey))
+            {
+                WINECON_RegLoadHelper(hAppKey, cfg);
+                RegCloseKey(hAppKey);
+            }
+        }
+        RegCloseKey(hConKey);
     }
+    WINECON_DumpConfig("load", cfg);
+}
+
+/******************************************************************
+ *		WINECON_RegSaveHelper
+ *
+ *
+ */
+static void WINECON_RegSaveHelper(HKEY hConKey, const struct config_data* cfg)
+{
+    DWORD       val;
+
+    WINECON_DumpConfig("save", cfg);
 
     val = cfg->cursor_size;
     RegSetValueEx(hConKey, wszCursorSize, 0, REG_DWORD, (char*)&val, sizeof(val));
@@ -161,6 +227,9 @@
     val = cfg->history_size;
     RegSetValueEx(hConKey, wszHistoryBufferSize, 0, REG_DWORD, (char*)&val, sizeof(val));
 
+    val = cfg->history_nodup;
+    RegSetValueEx(hConKey, wszHistoryNoDup, 0, REG_DWORD, (char*)&val, sizeof(val));
+
     val = cfg->menu_mask;
     RegSetValueEx(hConKey, wszMenuMask, 0, REG_DWORD, (char*)&val, sizeof(val));
 
@@ -175,7 +244,40 @@
 
     val = MAKELONG(cfg->win_width, cfg->win_height);
     RegSetValueEx(hConKey, wszWindowSize, 0, REG_DWORD, (char*)&val, sizeof(val));
+}
+
+/******************************************************************
+ *		WINECON_RegSave
+ *
+ *
+ */
+void WINECON_RegSave(const struct config_data* cfg)
+{
+    HKEY        hConKey;
 
-    RegCloseKey(hConKey);
-    return TRUE;
+    WINE_TRACE("saving registry settings.\n");
+    if (RegCreateKey(HKEY_CURRENT_USER, wszConsole, &hConKey))
+    {
+        WINE_ERR("Can't open registry for saving\n");
+    }
+    else
+    {
+        if (cfg->registry)
+        {
+            HKEY    hAppKey;
+
+            if (RegCreateKey(hConKey, cfg->registry, &hAppKey))
+            {
+                WINE_ERR("Can't open registry for saving\n");
+            }
+            else
+            {
+                /* FIXME: maybe only save the values different from the default value ? */
+                WINECON_RegSaveHelper(hAppKey, cfg);
+                RegCloseKey(hAppKey);
+            }
+        }
+        else WINECON_RegSaveHelper(hConKey, cfg);
+        RegCloseKey(hConKey);
+    }
 }
Index: programs/wineconsole/user.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/user.c,v
retrieving revision 1.15
diff -u -u -r1.15 user.c
--- programs/wineconsole/user.c	23 Jul 2002 02:02:46 -0000	1.15
+++ programs/wineconsole/user.c	1 Sep 2002 19:43:57 -0000
@@ -36,6 +36,8 @@
     RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xFF),
 };
 
+static BOOL WCUSER_SetFont(struct inner_data* data, const LOGFONT* font);
+
 /******************************************************************
  *		WCUSER_FillMemDC
  *
@@ -54,8 +56,11 @@
      */
     if (!PRIVATE(data)->hFont) return;
 
+    /* FIXME: could set up a mechanism to reuse the line between different 
+     * calls to this function
+     */
     if (!(line = HeapAlloc(GetProcessHeap(), 0, data->curcfg.sb_width * sizeof(WCHAR))))
-    {WINE_ERR("OOM\n"); return;}
+        WINECON_Fatal("OOM\n");
 
     hOldFont = SelectObject(PRIVATE(data)->hMemDC, PRIVATE(data)->hFont);
     for (j = upd_tp; j <= upd_bm; j++)
@@ -85,7 +90,7 @@
  * Either the font geometry or the sb geometry has changed. we need
  * to recreate the bitmap geometry.
  */
-static void WCUSER_NewBitmap(struct inner_data* data, BOOL fill)
+static void WCUSER_NewBitmap(struct inner_data* data)
 {
     HDC         hDC;
     HBITMAP	hnew, hold;
@@ -107,8 +112,7 @@
 	    WINE_FIXME("leak\n");
     }
     PRIVATE(data)->hBitmap = hnew;
-    if (fill)
-	WCUSER_FillMemDC(data, 0, data->curcfg.sb_height - 1);
+    WCUSER_FillMemDC(data, 0, data->curcfg.sb_height - 1);
 }
 
 /******************************************************************
@@ -118,7 +122,7 @@
  */
 static void WCUSER_ResizeScreenBuffer(struct inner_data* data)
 {
-    WCUSER_NewBitmap(data, FALSE);
+    WCUSER_NewBitmap(data);
 }
 
 /******************************************************************
@@ -140,7 +144,7 @@
  *
  * Sets a new shape for the cursor
  */
-void	WCUSER_ShapeCursor(struct inner_data* data, int size, int vis, BOOL force)
+static void	WCUSER_ShapeCursor(struct inner_data* data, int size, int vis, BOOL force)
 {
     if (force || size != data->curcfg.cursor_size)
     {
@@ -155,7 +159,7 @@
 
 	    w16b = ((data->curcfg.cell_width + 15) & ~15) / 8;
 	    ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, w16b * data->curcfg.cell_height);
-	    if (!ptr) {WINE_ERR("OOM\n"); return;}
+	    if (!ptr) WINECON_Fatal("OOM");
 	    nbl = max((data->curcfg.cell_height * size) / 100, 1);
 	    for (j = data->curcfg.cell_height - nbl; j < data->curcfg.cell_height; j++)
 	    {
@@ -190,6 +194,7 @@
 	    }
 	}
     }
+    WINECON_DumpConfig("crsr", &data->curcfg);
 }
 
 /******************************************************************
@@ -207,11 +212,7 @@
     r.right = data->curcfg.win_width * data->curcfg.cell_width;
     r.bottom = data->curcfg.win_height * data->curcfg.cell_height;
 
-    if (IsRectEmpty(&r))
-    {
-	ShowWindow(PRIVATE(data)->hWnd, SW_HIDE);
-	return;
-    }
+    if (IsRectEmpty(&r)) return;
 
     AdjustWindowRect(&r, GetWindowLong(PRIVATE(data)->hWnd, GWL_STYLE), FALSE);
 
@@ -243,7 +244,7 @@
     }
 
     SetWindowPos(PRIVATE(data)->hWnd, 0, 0, 0, r.right - r.left + dx, r.bottom - r.top + dy,
-		 SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW);
+		 SWP_NOMOVE|SWP_NOZORDER);
     WCUSER_ShapeCursor(data, data->curcfg.cursor_size, data->curcfg.cursor_visible, TRUE);
     WCUSER_PosCursor(data);
 }
@@ -367,18 +368,21 @@
         mlf.lfHeight = fc->data->curcfg.cell_height;
         if (WCUSER_SetFont(fc->data, &mlf))
         {
+            struct      config_data     defcfg;
+
             WCUSER_DumpLogFont("InitChoosing: ", &mlf, FontType);
             fc->done = 1;
             /* since we've modified the current config with new font information,
              * set this information as the new default.
              */
-            fc->data->defcfg.cell_width = fc->data->curcfg.cell_width;
-            fc->data->defcfg.cell_height = fc->data->curcfg.cell_height;
-            lstrcpyW(fc->data->defcfg.face_name, fc->data->curcfg.face_name);
+            WINECON_RegLoad(NULL, &defcfg);
+            defcfg.cell_width = fc->data->curcfg.cell_width;
+            defcfg.cell_height = fc->data->curcfg.cell_height;
+            lstrcpyW(defcfg.face_name, fc->data->curcfg.face_name);
             /* Force also its writing back to the registry so that we can get it
              * the next time.
              */
-            WINECON_RegSave(&fc->data->defcfg);
+            WINECON_RegSave(&defcfg);
             return 0;
         }
     }
@@ -510,7 +514,7 @@
     PRIVATE(data)->hFont = hFont;
 
     WCUSER_ComputePositions(data);
-    WCUSER_NewBitmap(data, TRUE);
+    WCUSER_NewBitmap(data);
     InvalidateRect(PRIVATE(data)->hWnd, NULL, FALSE);
     UpdateWindow(PRIVATE(data)->hWnd);
 
@@ -518,30 +522,27 @@
 }
 
 /******************************************************************
- *		WCUSER_InitFont
+ *		WCUSER_SetFontPmt
  *
- * create a hFont from the settings saved in registry...
- * (called on init, assuming no font has been created before)
+ * Sets a new font for the console.
+ * In fact a wrapper for WCUSER_SetFont
  */
-static BOOL	WCUSER_InitFont(struct inner_data* data)
+static void     WCUSER_SetFontPmt(struct inner_data* data, const WCHAR* font, 
+                                  unsigned height, unsigned weight)
 {
+    LOGFONT             lf;
     struct font_chooser fc;
+    
+    WINE_TRACE_(wc_font)("=> %s h=%u w=%u\n", 
+                         wine_dbgstr_wn(font, -1), height, weight);
 
-    WINE_TRACE_(wc_font)("=> %s\n", wine_dbgstr_wn(data->curcfg.face_name, -1));
-    if (data->curcfg.face_name[0] != '\0' &&
-        data->curcfg.cell_height != 0 &&
-        data->curcfg.font_weight != 0)
-    {
-        LOGFONT             lf;
-
-        WCUSER_FillLogFont(&lf, data->curcfg.face_name,
-                           data->curcfg.cell_height, data->curcfg.font_weight);
-        if (PRIVATE(data)->hFont != 0) WINE_FIXME("Oh strange\n");
-
+    if (font[0] != '\0' && height != 0 && weight != 0)
+    {
+        WCUSER_FillLogFont(&lf, font, height, weight);
         if (WCUSER_SetFont(data, &lf))
         {
             WCUSER_DumpLogFont("InitReuses: ", &lf, 0);
-            return TRUE;
+            return;
         }
     }
 
@@ -550,8 +551,7 @@
     fc.data = data;
     fc.done = 0;
     EnumFontFamilies(PRIVATE(data)->hMemDC, NULL, get_first_font_enum, (LPARAM)&fc);
-    if (!fc.done) WINE_WARN("Couldn't find a decent font, aborting\n");
-    return fc.done;
+    if (!fc.done) WINECON_Fatal("Couldn't find a decent font, aborting\n");
 }
 
 /******************************************************************
@@ -858,8 +858,6 @@
     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();
@@ -1343,9 +1341,10 @@
 {
     MSG		msg;
 
+    ShowWindow(PRIVATE(data)->hWnd, SW_SHOW);
     for (;;)
     {
-	switch(MsgWaitForMultipleObjects(1, &data->hSynchro, FALSE, INFINITE, QS_ALLINPUT))
+	switch (MsgWaitForMultipleObjects(1, &data->hSynchro, FALSE, INFINITE, QS_ALLINPUT))
 	{
 	case WAIT_OBJECT_0:
 	    if (!WINECON_GrabChanges(data) && data->curcfg.exit_on_die)
@@ -1392,6 +1391,7 @@
     data->fnRefresh = WCUSER_Refresh;
     data->fnResizeScreenBuffer = WCUSER_ResizeScreenBuffer;
     data->fnSetTitle = WCUSER_SetTitle;
+    data->fnSetFont = WCUSER_SetFontPmt;
     data->fnScroll = WCUSER_Scroll;
     data->fnDeleteBackend = WCUSER_DeleteBackend;
 
@@ -1412,11 +1412,6 @@
 		 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 (!PRIVATE(data)->hWnd) return FALSE;
-
-    /* force update of current data */
-    if (!WINECON_GrabChanges(data)) return FALSE;
-
-    if (!WCUSER_InitFont(data)) return FALSE;
 
     return TRUE;
 }
Index: programs/wineconsole/winecon_private.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/winecon_private.h,v
retrieving revision 1.7
diff -u -u -r1.7 winecon_private.h
--- programs/wineconsole/winecon_private.h	31 May 2002 23:40:59 -0000	1.7
+++ programs/wineconsole/winecon_private.h	1 Sep 2002 19:16:39 -0000
@@ -32,7 +32,8 @@
     DWORD       def_attr;
     WCHAR       face_name[32];  /* name of font (size is LF_FACESIZE) */
     DWORD       font_weight;
-    DWORD       history_size;
+    DWORD       history_size;   /* number of commands in history buffer */
+    DWORD       history_nodup;  /* TRUE if commands are not stored twice in buffer */
     DWORD       menu_mask;      /* MK_CONTROL MK_SHIFT mask to drive submenu opening */
     DWORD       quick_edit;     /* whether mouse ops are sent to app (false) or used for content selection (true) */
     unsigned	sb_width;	/* active screen buffer width */
@@ -41,11 +42,11 @@
     unsigned	win_height;
     COORD	win_pos;	/* position (in cells) of visible part of screen buffer in window */
     BOOL        exit_on_die;    /* whether the wineconsole should quit if server destroys the console */
+    WCHAR*      registry;       /* <x> part of HKLU\\<x>\\Console where config is read from (NULL if default settings) */
 };
 
 struct inner_data {
     struct config_data  curcfg;
-    struct config_data  defcfg;
 
     CHAR_INFO*		cells;		/* local copy of cells (sb_width * sb_height) */
 
@@ -63,12 +64,14 @@
     void		(*fnResizeScreenBuffer)(struct inner_data* data);
     void		(*fnSetTitle)(const struct inner_data* data);
     void		(*fnScroll)(struct inner_data* data, int pos, BOOL horz);
+    void                (*fnSetFont)(struct inner_data* data, const WCHAR* font, unsigned height, unsigned weight);
     void		(*fnDeleteBackend)(struct inner_data* data);
 
     void*               private;        /* data part belonging to the choosen backed */
 };
 
 /* from wineconsole.c */
+extern void WINECON_Fatal(const char* msg);
 extern void WINECON_NotifyWindowChange(struct inner_data* data);
 extern int  WINECON_GetHistorySize(HANDLE hConIn);
 extern BOOL WINECON_SetHistorySize(HANDLE hConIn, int size);
@@ -77,10 +80,13 @@
 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);
-
+extern VOID WINECON_SetConfig(struct inner_data* data, 
+                              const struct config_data* cfg, BOOL force);
 /* from registry.c */
-extern BOOL WINECON_RegLoad(struct config_data* cfg);
-extern BOOL WINECON_RegSave(const struct config_data* cfg);
+extern void WINECON_RegLoad(const WCHAR* appname, struct config_data* cfg);
+extern void WINECON_RegSave(const struct config_data* cfg);
+extern void WINECON_DumpConfig(const char* pfx, const struct config_data* cfg);
 
 /* backends... */
 extern BOOL WCUSER_InitBackend(struct inner_data* data);
+extern BOOL WCCURSE_InitBackend(struct inner_data* data);
Index: programs/wineconsole/winecon_user.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/winecon_user.h,v
retrieving revision 1.6
diff -u -u -r1.6 winecon_user.h
--- programs/wineconsole/winecon_user.h	31 May 2002 23:40:59 -0000	1.6
+++ programs/wineconsole/winecon_user.h	31 Aug 2002 15:55:21 -0000
@@ -43,7 +43,6 @@
 /* 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, DWORD fontType);
Index: programs/wineconsole/wineconsole.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole.c,v
retrieving revision 1.15
diff -u -u -r1.15 wineconsole.c
--- programs/wineconsole/wineconsole.c	1 Jul 2002 23:22:48 -0000	1.15
+++ programs/wineconsole/wineconsole.c	31 Aug 2002 20:10:05 -0000
@@ -1,7 +1,7 @@
 /*
  * an application for displaying Win32 console
  *
- * Copyright 2001 Eric Pouech
+ * Copyright 2001, 2002 Eric Pouech
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -30,6 +30,12 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(wineconsole);
 
+void WINECON_Fatal(const char* msg)
+{
+    WINE_ERR("%s\n", msg);
+    ExitProcess(0);
+}
+
 /******************************************************************
  *		WINECON_FetchCells
  *
@@ -261,7 +267,7 @@
 	    break;
 	case CONSOLE_RENDERER_SB_RESIZE_EVENT:
 	    if (data->curcfg.sb_width != evts[i].u.resize.width ||
-		data->curcfg.sb_height != evts[i].u.resize.height)
+		data->curcfg.sb_height != evts[i].u.resize.height || !data->cells)
 	    {
 		if (WINE_TRACE_ON(wineconsole))
                     WINE_DPRINTF(" resize(%d,%d)", evts[i].u.resize.width, evts[i].u.resize.height);
@@ -270,7 +276,7 @@
 
 		data->cells = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, data->cells,
 					  data->curcfg.sb_width * data->curcfg.sb_height * sizeof(CHAR_INFO));
-		if (!data->cells) {WINE_ERR("OOM\n"); exit(0);}
+		if (!data->cells) WINECON_Fatal("OOM\n");
 		data->fnResizeScreenBuffer(data);
 		data->fnComputePositions(data);
 	    }
@@ -339,6 +345,81 @@
 }
 
 /******************************************************************
+ *		WINECON_SetConfig
+ *
+ * Apply to data all the configuration elements from cfg. This includes modification
+ * of server side equivalent and visual parts.
+ * If force is FALSE, only the changed items are modified.
+ */
+void     WINECON_SetConfig(struct inner_data* data, 
+                           const struct config_data* cfg, BOOL force)
+{
+    if (force || data->curcfg.cursor_size != cfg->cursor_size ||
+        data->curcfg.cursor_visible != cfg->cursor_visible)
+    {
+        CONSOLE_CURSOR_INFO cinfo;
+        cinfo.dwSize = cfg->cursor_size;
+        /* <FIXME>: this hack is needed to pass thru the invariant test operation on server side
+         * (no notification is sent when invariant operation is requested
+         */
+        cinfo.bVisible = !cfg->cursor_visible;
+        SetConsoleCursorInfo(data->hConOut, &cinfo);
+        /* </FIXME> */
+        cinfo.bVisible = cfg->cursor_visible;
+        /* this shall update (through notif) curcfg */
+        SetConsoleCursorInfo(data->hConOut, &cinfo);
+    }
+    if (force || data->curcfg.history_size != cfg->history_size)
+    {
+        data->curcfg.history_size = cfg->history_size;
+        WINECON_SetHistorySize(data->hConIn, cfg->history_size);
+    }
+    if (force || data->curcfg.history_nodup != cfg->history_nodup)
+    {
+        data->curcfg.history_nodup = cfg->history_nodup;
+        WINECON_SetHistoryMode(data->hConIn, cfg->history_nodup);
+    }
+    data->curcfg.menu_mask = cfg->menu_mask;
+    data->curcfg.quick_edit = cfg->quick_edit;
+    if (force || 1 /* FIXME: font info has changed */)
+    {
+        data->fnSetFont(data, cfg->face_name, cfg->cell_height, cfg->font_weight);
+    }
+    if (force || data->curcfg.def_attr != cfg->def_attr)
+    {
+        data->curcfg.def_attr = cfg->def_attr;
+        SetConsoleTextAttribute(data->hConOut, cfg->def_attr);
+    }
+    if (force || data->curcfg.sb_width != cfg->sb_width ||
+        data->curcfg.sb_height != cfg->sb_height)
+    {
+        COORD       c;
+        
+        c.X = cfg->sb_width;
+        c.Y = cfg->sb_height;
+        
+        /* this shall update (through notif) curcfg */
+        SetConsoleScreenBufferSize(data->hConOut, c);
+    }
+    if (force || data->curcfg.win_width != cfg->win_width ||
+        data->curcfg.win_height != cfg->win_height)
+    {
+        SMALL_RECT  pos;
+        
+        pos.Left = pos.Top = 0;
+        pos.Right = cfg->win_width - 1;
+        pos.Bottom = cfg->win_height - 1;
+        /* this shall update (through notif) curcfg */
+        SetConsoleWindowInfo(data->hConOut, FALSE, &pos);
+    }
+    data->curcfg.exit_on_die = cfg->exit_on_die;
+    /* we now need to gather all events we got from the operations above, 
+     * in order to get data correctly updated
+     */
+    WINECON_GrabChanges(data);
+}
+
+/******************************************************************
  *		WINECON_Delete
  *
  * Destroy wineconsole internal data
@@ -361,18 +442,40 @@
  * Initialisation part I. Creation of server object (console input and
  * active screen buffer)
  */
-static struct inner_data* WINECON_Init(HINSTANCE hInst, void* pid)
+static struct inner_data* WINECON_Init(HINSTANCE hInst, void* pid, LPCWSTR appname,
+                                       BOOL (*backend)(struct inner_data*))
 {
     struct inner_data*	data = NULL;
     DWORD		ret;
-    WCHAR		szTitle[] = {'W','i','n','e',' ','c','o','n','s','o','l','e',0};
+    struct config_data  cfg;
+    STARTUPINFOW        si;
 
     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;
+    GetStartupInfo(&si);
+
+    if (pid == 0)
+    {
+        if (!si.lpTitle) WINECON_Fatal("Should have a title set");
+        appname = si.lpTitle;
+    }
+    
+    /* load settings */
+    WINECON_RegLoad(appname, &cfg);
+
+    /* some overrides */
+    if (pid == 0)
+    {
+        if (si.dwFlags & STARTF_USECOUNTCHARS)
+        {
+            cfg.sb_width  = si.dwXCountChars;
+            cfg.sb_height = si.dwYCountChars;
+        }
+        if (si.dwFlags & STARTF_USEFILLATTRIBUTE)
+            cfg.def_attr = si.dwFillAttribute; 
+        /* should always be defined */
+    }
 
     /* the handles here are created without the whistles and bells required by console
      * (mainly because wineconsole doesn't need it)
@@ -390,13 +493,13 @@
     }
     SERVER_END_REQ;
     if (!ret) goto error;
-    WINE_TRACE("using hConIn event %p, hSynchro event %p\n", data->hConIn, data->hSynchro);
+    WINE_TRACE("using hConIn %p, hSynchro event %p\n", data->hConIn, data->hSynchro);
 
     SERVER_START_REQ( set_console_input_info )
     {
         req->handle = (obj_handle_t)data->hConIn;
         req->mask = SET_CONSOLE_INPUT_INFO_TITLE;
-        wine_server_add_data( req, szTitle, strlenW(szTitle) * sizeof(WCHAR) );
+        wine_server_add_data( req, appname, strlenW(appname) * sizeof(WCHAR) );
         ret = !wine_server_call_err( req );
     }
     SERVER_END_REQ;
@@ -408,12 +511,25 @@
         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);
+        ret = !wine_server_call_err( req );
+        data->hConOut  = (HANDLE)reply->handle_out;
     }
     SERVER_END_REQ;
-    if (data->hConOut) return data;
+    if (!ret) goto error;
+    WINE_TRACE("using hConOut %p\n", data->hConOut);
+
+    /* filling data->curcfg from cfg */
+    if ((*backend)(data))
+    {
+        WINECON_SetConfig(data, &cfg, TRUE);
+        data->curcfg.registry = cfg.registry;
+        WINECON_DumpConfig("fint", &data->curcfg);
+        return data;
+    }
 
  error:
+    WINE_ERR("failed to init.\n");
+
     WINECON_Delete(data);
     return NULL;
 }
@@ -423,11 +539,10 @@
  *
  * Spawn the child process when invoked with wineconsole foo bar
  */
-static BOOL WINECON_Spawn(struct inner_data* data, LPCSTR lpCmdLine)
+static BOOL WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine)
 {
     PROCESS_INFORMATION	info;
     STARTUPINFO		startup;
-    LPWSTR		ptr = GetCommandLine(); /* we're unicode... */
     BOOL		done;
 
     /* we're in the case wineconsole <exe> <options>... spawn the new process */
@@ -443,21 +558,14 @@
 	!DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(),
 			 &startup.hStdOutput, GENERIC_READ|GENERIC_WRITE, TRUE, 0) ||
 	!DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(),
-			     &startup.hStdError, GENERIC_READ|GENERIC_WRITE, TRUE, 0))
+                         &startup.hStdError, GENERIC_READ|GENERIC_WRITE, TRUE, 0))
     {
 	WINE_ERR("Can't dup handles\n");
 	/* no need to delete handles, we're exiting the programm anyway */
 	return FALSE;
     }
 
-    /* we could have several ' ' in process command line... so try first space...
-     * FIXME:
-     * the correct way would be to check the existence of the left part of ptr
-     * (to be a file)
-     */
-    while (*ptr && *ptr++ != ' ');
-
-    done = *ptr && CreateProcess(NULL, ptr, NULL, NULL, TRUE, 0L, NULL, NULL, &startup, &info);
+    done = CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, 0L, NULL, NULL, &startup, &info);
 
     /* we no longer need the handles passed to the child for the console */
     CloseHandle(startup.hStdInput);
@@ -492,15 +600,15 @@
     struct inner_data*	data;
     int			ret = 1;
     unsigned		evt;
+    BOOL                (*backend)(struct inner_data*);
+    char*               p;
+    
+    backend = WCUSER_InitBackend;
 
     /* case of wineconsole <evt>, signal process that created us that we're up and running */
     if (WINECON_HasEvent(lpCmdLine, &evt))
     {
-        if (!(data = WINECON_Init(hInst, 0)))
-	{
-	    WINE_ERR("failed to init1 wineconsole.\n");
-	    return 0;
-	}
+        if (!(data = WINECON_Init(hInst, 0, NULL, backend))) return 0;
 	ret = SetEvent((HANDLE)evt);
 	if (!ret)
 	{
@@ -510,12 +622,26 @@
     }
     else
     {
-        if (!(data = WINECON_Init(hInst, (void*)GetCurrentProcessId())))
-	{
-	    WINE_ERR("failed to init2 wineconsole.\n");
-	    return 0;
-	}
-	ret = WINECON_Spawn(data, lpCmdLine);
+        LPWSTR		wcmdLine = GetCommandLine() /* we're unicode... */;
+        LPWSTR          src, dst;
+        WCHAR           buffer[256];
+
+        /* remove wineconsole from commandline...
+         * we could have several ' ' in process command line... so try first space...
+         */
+        /* FIXME:
+         * the correct way would be to check the existence of the left part of ptr
+         * (to be a file)
+         */
+        while (*wcmdLine && *wcmdLine++ != ' ');
+
+        /* FIXME: see above */
+        src = wcmdLine; dst = buffer;
+        while (*src && *src != ' ') *dst++ = *src++;
+        *dst = 0;
+
+        if (!(data = WINECON_Init(hInst, (void*)GetCurrentProcessId(), buffer, backend))) return 0;
+	ret = WINECON_Spawn(data, wcmdLine);
         if (!ret)
 	{
 	    WINE_MESSAGE("wineconsole: spawning client program failed. Invalid/missing command line arguments ?\n");
@@ -523,13 +649,11 @@
 	}
     }
 
-    if (WCUSER_InitBackend(data))
+    if (ret)
     {
 	WINE_TRACE("calling MainLoop.\n");
 	ret = data->fnMainLoop(data);
     }
-    else
-	WINE_ERR("WCUSER_InitBackend failed.\n");
 
 cleanup:
     WINECON_Delete(data);
Index: programs/wineconsole/wineconsole_De.rc
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_De.rc,v
retrieving revision 1.1
diff -u -u -r1.1 wineconsole_De.rc
--- programs/wineconsole/wineconsole_De.rc	1 Jul 2002 23:22:48 -0000	1.1
+++ programs/wineconsole/wineconsole_De.rc	31 Aug 2002 20:23:21 -0000
@@ -57,7 +57,7 @@
 	LTEXT "&Anzahl gemerkter Befehle :", -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
-	AUTOCHECKBOX "&Entferne doppelte", IDC_OPT_HIST_DOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
+	AUTOCHECKBOX "&Entferne doppelte", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
 }
 
 IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
@@ -81,19 +81,36 @@
 CAPTION " Konfiguration "
 FONT 8, "Helv"
 {
-	GROUPBOX "Pufferbereich", -1, 10, 11, 110, 42, BS_GROUPBOX
+	GROUPBOX "Pufferbereich", -1, 10, 11, 100, 42, BS_GROUPBOX
 	LTEXT "&Breite :", -1, 14, 25, 54, 9
-	EDITTEXT IDC_CNF_SB_WIDTH, 78, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 	LTEXT "&H?he :", -1, 14, 39, 54, 9
-	EDITTEXT IDC_CNF_SB_HEIGHT, 78, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 
-	GROUPBOX "Fenstergr?sse", -1, 10, 55, 110, 42
+	GROUPBOX "Fenstergr?sse", -1, 10, 55, 100, 42
 	LTEXT "Brei&te :", -1, 14, 69, 54, 9
-	EDITTEXT IDC_CNF_WIN_WIDTH, 78, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 	LTEXT "H?h&e :", -1, 14, 83, 54, 9
-	EDITTEXT IDC_CNF_WIN_HEIGHT, 78, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 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
+
+	GROUPBOX "End of program", -1, 115, 11, 80, 42, BS_GROUPBOX
+	AUTOCHECKBOX "&Close console", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP
 }
+
+IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 140, 60
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
+CAPTION "Console parameters"
+FONT 8, "Helv"
+{
+	GROUPBOX "", -1, 10, 10, 120, 31, BS_GROUPBOX
+	AUTORADIOBUTTON "Retain these settings for later sessions", IDC_SAV_SAVE, 14, 15, 110, 10, WS_TABSTOP
+	AUTORADIOBUTTON "Modify only current session", IDC_SAV_SESSION, 14, 27, 110, 10, WS_TABSTOP
+
+	PUSHBUTTON "OK", IDOK, 20, 45, 35, 12
+	PUSHBUTTON "Cancel", IDCANCEL, 65, 45, 35, 12
+}
+
Index: programs/wineconsole/wineconsole_En.rc
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_En.rc,v
retrieving revision 1.7
diff -u -u -r1.7 wineconsole_En.rc
--- programs/wineconsole/wineconsole_En.rc	1 Jul 2002 23:22:48 -0000	1.7
+++ programs/wineconsole/wineconsole_En.rc	31 Aug 2002 20:22:59 -0000
@@ -57,7 +57,7 @@
 	LTEXT "&Number 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
-	AUTOCHECKBOX "&Remove doubles", IDC_OPT_HIST_DOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
+	AUTOCHECKBOX "&Remove doubles", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
 }
 
 IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
@@ -81,19 +81,36 @@
 CAPTION " Configuration "
 FONT 8, "Helv"
 {
-	GROUPBOX "Buffer zone", -1, 10, 11, 110, 42, BS_GROUPBOX
+	GROUPBOX "Buffer zone", -1, 10, 11, 100, 42, BS_GROUPBOX
 	LTEXT "&Width :", -1, 14, 25, 54, 9
-	EDITTEXT IDC_CNF_SB_WIDTH, 78, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 	LTEXT "&Height :", -1, 14, 39, 54, 9
-	EDITTEXT IDC_CNF_SB_HEIGHT, 78, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 
-	GROUPBOX "Window size", -1, 10, 55, 110, 42
+	GROUPBOX "Window size", -1, 10, 55, 100, 42
 	LTEXT "W&idth :", -1, 14, 69, 54, 9
-	EDITTEXT IDC_CNF_WIN_WIDTH, 78, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 	LTEXT "H&eight :", -1, 14, 83, 54, 9
-	EDITTEXT IDC_CNF_WIN_HEIGHT, 78, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 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
+
+	GROUPBOX "End of program", -1, 115, 11, 80, 42, BS_GROUPBOX
+	AUTOCHECKBOX "&Close console", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP
 }
+
+IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 140, 60
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
+CAPTION "Console parameters"
+FONT 8, "Helv"
+{
+	GROUPBOX "", -1, 10, 10, 120, 31, BS_GROUPBOX
+	AUTORADIOBUTTON "Retain these settings for later sessions", IDC_SAV_SAVE, 14, 15, 110, 10, WS_TABSTOP
+	AUTORADIOBUTTON "Modify only current session", IDC_SAV_SESSION, 14, 27, 110, 10, WS_TABSTOP
+
+	PUSHBUTTON "OK", IDOK, 20, 45, 35, 12
+	PUSHBUTTON "Cancel", IDCANCEL, 65, 45, 35, 12
+}
+
Index: programs/wineconsole/wineconsole_Fr.rc
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_Fr.rc,v
retrieving revision 1.6
diff -u -u -r1.6 wineconsole_Fr.rc
--- programs/wineconsole/wineconsole_Fr.rc	1 Jul 2002 23:22:48 -0000	1.6
+++ programs/wineconsole/wineconsole_Fr.rc	31 Aug 2002 20:23:03 -0000
@@ -57,7 +57,7 @@
 	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
-	AUTOCHECKBOX "&Supprimer les doublons", IDC_OPT_HIST_DOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
+	AUTOCHECKBOX "&Supprimer les doublons", IDC_OPT_HIST_NODOUBLE, 130, 67, 60, 18, WS_TABSTOP|BS_MULTILINE
 }
 
 IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
@@ -81,19 +81,35 @@
 CAPTION " Configuration "
 FONT 8, "Helv"
 {
-	GROUPBOX "Taille m?moire tampon ?cran", -1, 10, 11, 110, 42, BS_GROUPBOX
+	GROUPBOX "Taille m?moire tampon ?cran", -1, 10, 11, 100, 42, BS_GROUPBOX
 	LTEXT "&Largeur :", -1, 14, 25, 54, 9
-	EDITTEXT IDC_CNF_SB_WIDTH, 78, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 	LTEXT "Ha&uteur :", -1, 14, 39, 54, 9
-	EDITTEXT IDC_CNF_SB_HEIGHT, 78, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 
-	GROUPBOX "Taille de la fen?tre", -1, 10, 55, 110, 42
+	GROUPBOX "Taille de la fen?tre", -1, 10, 55, 100, 42
 	LTEXT "La&rgeur :", -1, 14, 69, 54, 9
-	EDITTEXT IDC_CNF_WIN_WIDTH, 78, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
 	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
 	LTEXT "Hau&teur :", -1, 14, 83, 54, 9
-	EDITTEXT IDC_CNF_WIN_HEIGHT, 78, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
+	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 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
+
+	GROUPBOX "Fin du programme", -1, 115, 11, 80, 42, BS_GROUPBOX
+	AUTOCHECKBOX "&Fermer la console", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP
+}
+
+IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 200, 60
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
+CAPTION "Param?tres de la console"
+FONT 8, "Helv"
+{
+	GROUPBOX "", -1, 10, 10, 180, 31, BS_GROUPBOX
+	AUTORADIOBUTTON "Sauver les param?tres pour les prochaines sessions", IDC_SAV_SAVE, 14, 15, 170, 10, WS_TABSTOP
+	AUTORADIOBUTTON "Appliquer uniquement ? la session courante", IDC_SAV_SESSION, 14, 27, 170, 10, WS_TABSTOP
+
+	PUSHBUTTON "OK", IDOK, 50, 45, 35, 12
+	PUSHBUTTON "Annuler", IDCANCEL, 115, 45, 35, 12
 }
Index: programs/wineconsole/wineconsole_res.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole_res.h,v
retrieving revision 1.5
diff -u -u -r1.5 wineconsole_res.h
--- programs/wineconsole/wineconsole_res.h	1 Jul 2002 23:22:48 -0000	1.5
+++ programs/wineconsole/wineconsole_res.h	31 Aug 2002 20:22:27 -0000
@@ -37,17 +37,19 @@
 #define IDS_FNT_PREVIEW_1	0x201
 #define IDS_FNT_PREVIEW_2	0x202
 
+/* dialog boxes */
 #define IDD_OPTION		0x0100
 #define IDD_FONT		0x0200
 #define IDD_CONFIG		0x0300
+#define IDD_SAVE_SETTINGS       0x0400
 
-/* dialog boxes */
+/* dialog boxes controls */
 #define IDC_OPT_CURSOR_SMALL	0x0101
 #define IDC_OPT_CURSOR_MEDIUM	0x0102
 #define IDC_OPT_CURSOR_LARGE	0x0103
 #define IDC_OPT_HIST_SIZE	0x0104
 #define IDC_OPT_HIST_SIZE_UD	0x0105
-#define IDC_OPT_HIST_DOUBLE	0x0106
+#define IDC_OPT_HIST_NODOUBLE	0x0106
 #define IDC_OPT_CONF_CTRL       0x0107
 #define IDC_OPT_CONF_SHIFT      0x0108
 #define IDC_OPT_QUICK_EDIT      0x0109
@@ -67,3 +69,7 @@
 #define IDC_CNF_WIN_WIDTH_UD	0x0306
 #define IDC_CNF_WIN_HEIGHT	0x0307
 #define IDC_CNF_WIN_HEIGHT_UD	0x0308
+#define IDC_CNF_CLOSE_EXIT      0x0309
+
+#define IDC_SAV_SAVE            0x0401
+#define IDC_SAV_SESSION         0x0402


More information about the wine-patches mailing list