pull up r19855 from trunk
authorTom Yu <tlyu@mit.edu>
Fri, 28 Sep 2007 23:36:43 +0000 (23:36 +0000)
committerTom Yu <tlyu@mit.edu>
Fri, 28 Sep 2007 23:36:43 +0000 (23:36 +0000)
 r19855@cathode-dark-space:  jaltman | 2007-08-24 10:28:21 -0400
 ticket: new
 subject: NIM: Color Schemas
 component: windows

 The default color scheme used by the Network Identity Manager credentials
 display can sometimes cause the text to be difficult to read.  In
 addition, since some of the colors are derived from colors used by the
 current Windows theme, the selection, window background and text
 colors may be mismatched with the colors that are hardcoded into the
 application.

 To rememdy this problem, this patch defines a new set of colors
 that will be used with the credentials display.  The new scheme
 doesn't use a special color to distinguish the default identity which
 is already indicated with the text "(Default)" displayed alongside it.
 Instead the colors are used to denote the remaining lifetime of
 credentials and identities.

 Also, the color scheme defines all the colors that it uses instead of
 deriving some of them from the Windows color scheme.

 All the color information is now kept in the Network Identity Manager
 UI schema.  The schema automatically maps to the registry, so users
 (and deployers) can override the colors by creating the necessary
 registry keys and values.  The registry keys containing color
 information are:

   Software\MIT\NetIDMgr\CredWindow\Themes and
   Software\MIT\NetIDMgr\CredWindow\Themes\Default

 The "Default" key contains the default color scheme.  The color value
 names are defined in ui\uiconfig.csv under Themes\_Schema
 configuration subspace.  Each color is represented by a 32-bit number.
 The low-order 24 bits contain a COLORREF value.  The high-order 8 bits
 contain an alpha value which, if non-zero, will be used to blend the
 color with the selection color (color value named ClrSelection).

ticket: 5676
version_fixed: 1.6.3

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-6@19990 dc483132-0cff-0310-8789-dd5450dbe970

src/windows/identity/ui/credwnd.c
src/windows/identity/ui/credwnd.h
src/windows/identity/ui/uiconfig.csv

index acbd46e678c678b9b3a4537ee728249a46d515c6..b8d159ac48b8f07876f36c70ca1a7930cee5e0d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 Massachusetts Institute of Technology
+ * Copyright (c) 2007 Secure Endpoints Inc.
  *
  * Permission is hereby granted, free of charge, to any person
  * obtaining a copy of this software and associated documentation
@@ -435,6 +435,24 @@ cw_mix_colors(COLORREF c1, COLORREF c2, int alpha) {
     return RGB(r,g,b);
 }
 
+static COLORREF
+cw_get_theme_color(khm_handle hc, const wchar_t * name, COLORREF ref_color) {
+    khm_int32 t;
+    COLORREF c;
+    int alpha;
+
+    if (KHM_FAILED(khc_read_int32(hc, name, &t))) {
+#ifdef DEBUG
+        assert(FALSE);
+#endif
+        return ref_color;
+    }
+
+    alpha = ((t >> 24) & 0xff);
+    c = (COLORREF) (t & 0xffffff);
+    return cw_mix_colors(ref_color, c, alpha);
+}
+
 void 
 cw_load_view(khui_credwnd_tbl * tbl, wchar_t * view, HWND hwnd) {
     khm_handle hc_cw = NULL;
@@ -649,8 +667,6 @@ _skip_col:
 
     tbl->flags |= KHUI_CW_TBL_INITIALIZED | KHUI_CW_TBL_COL_DIRTY | KHUI_CW_TBL_ACTIVE;
 
-    /*TODO: the graphics objects should be customizable */
-
     hdc = GetWindowDC(hwnd);
 
     khm_get_cw_element_font(hdc, L"FontHeader", FALSE, &log_font);
@@ -680,24 +696,64 @@ _skip_col:
                                     LR_DEFAULTCOLOR));
 
     {
+
 #define SEL_ALPHA 50
 
-        COLORREF bg_s = GetSysColor(COLOR_HIGHLIGHT);
-        COLORREF bg_normal = GetSysColor(COLOR_WINDOW);
-        COLORREF bg_gray = RGB(240,240,240);
-        COLORREF bg_hdr = RGB(240,240,240);
-        COLORREF bg_hdr_warn = RGB(235,235,134);
-        COLORREF bg_hdr_crit = RGB(235,184,134);
-        COLORREF bg_hdr_exp = RGB(235,134,134);
-        COLORREF bg_hdr_def = GetSysColor(COLOR_WINDOW);
-
-        tbl->cr_normal =       GetSysColor(COLOR_WINDOWTEXT);
-        tbl->cr_s =            GetSysColor(COLOR_WINDOWTEXT);
-        tbl->cr_hdr_outline =  RGB(0,0,0);
-        tbl->cr_hdr_normal =   GetSysColor(COLOR_WINDOWTEXT);
-        tbl->cr_hdr_s =        GetSysColor(COLOR_WINDOWTEXT);
-        tbl->cr_hdr_gray =     GetSysColor(COLOR_GRAYTEXT);
-        tbl->cr_hdr_gray_s =   GetSysColor(COLOR_HIGHLIGHTTEXT);
+        khm_handle hc_themes = NULL;
+        khm_handle hc_theme = NULL;
+
+        COLORREF bg_s;
+        COLORREF bg_normal;
+        COLORREF bg_gray;
+        COLORREF bg_hdr;
+        COLORREF bg_hdr_cred;
+        COLORREF bg_hdr_warn;
+        COLORREF bg_hdr_crit;
+        COLORREF bg_hdr_exp;
+
+        COLORREF bg_hdr_s;
+        COLORREF bg_hdr_cred_s;
+        COLORREF bg_hdr_warn_s;
+        COLORREF bg_hdr_crit_s;
+        COLORREF bg_hdr_exp_s;
+
+        cbsize = sizeof(buf);
+        if (KHM_SUCCEEDED(khc_read_string(hc_cw, L"DefaultTheme", buf, &cbsize)) &&
+            KHM_SUCCEEDED(khc_open_space(hc_cw, L"Themes", KHM_PERM_READ, &hc_themes)) &&
+            KHM_SUCCEEDED(khc_open_space(hc_themes, buf, KHM_PERM_READ, &hc_theme))) {
+
+            bg_s           = cw_get_theme_color(hc_theme, L"ClrSelection", 0);
+            bg_normal      = cw_get_theme_color(hc_theme, L"ClrBackground", 0);
+            bg_gray        = cw_get_theme_color(hc_theme, L"ClrGray", 0);
+            bg_hdr         = cw_get_theme_color(hc_theme, L"ClrHeader", 0);
+            bg_hdr_cred    = cw_get_theme_color(hc_theme, L"ClrHeaderCred", 0);
+            bg_hdr_warn    = cw_get_theme_color(hc_theme, L"ClrHeaderWarn", 0);
+            bg_hdr_crit    = cw_get_theme_color(hc_theme, L"ClrHeaderCrit", 0);
+            bg_hdr_exp     = cw_get_theme_color(hc_theme, L"ClrHeaderExp", 0);
+            bg_hdr_s       = cw_get_theme_color(hc_theme, L"ClrHeaderSel", bg_s);
+            bg_hdr_cred_s  = cw_get_theme_color(hc_theme, L"ClrHeaderCredSel", bg_s);
+            bg_hdr_warn_s  = cw_get_theme_color(hc_theme, L"ClrHeaderWarnSel", bg_s);
+            bg_hdr_crit_s  = cw_get_theme_color(hc_theme, L"ClrHeaderCritSel", bg_s);
+            bg_hdr_exp_s   = cw_get_theme_color(hc_theme, L"ClrHeaderExpSel", bg_s);
+
+            tbl->cr_normal      = cw_get_theme_color(hc_theme, L"ClrText", 0);
+            tbl->cr_s           = cw_get_theme_color(hc_theme, L"ClrTextSel", bg_s);
+            tbl->cr_hdr_outline = cw_get_theme_color(hc_theme, L"ClrHeaderOutline", 0);
+            tbl->cr_hdr_normal  = cw_get_theme_color(hc_theme, L"ClrTextHeader", 0);
+            tbl->cr_hdr_s       = cw_get_theme_color(hc_theme, L"ClrTextHeaderSel", bg_s);
+            tbl->cr_hdr_gray    = cw_get_theme_color(hc_theme, L"ClrTextHeaderGray", 0);
+            tbl->cr_hdr_gray_s  = cw_get_theme_color(hc_theme, L"ClrTextHeaderGraySel", bg_s);
+        } else {
+#ifdef DEBUG
+            assert(FALSE);
+#endif
+        }
+
+        if (hc_theme)
+            khc_close_space(hc_theme);
+        if (hc_themes)
+            khc_close_space(hc_themes);
+        hc_theme = hc_themes = NULL;
 
         if (khm_main_wnd_mode == KHM_MAIN_WND_MINI) {
             bg_hdr = bg_normal;
@@ -709,16 +765,16 @@ _skip_col:
         tbl->hb_s =           CreateSolidBrush(cw_mix_colors(bg_s, bg_normal, SEL_ALPHA));
 
         tbl->hb_hdr_bg =      CreateSolidBrush(bg_hdr);
+        tbl->hb_hdr_bg_cred = CreateSolidBrush(bg_hdr_cred);
         tbl->hb_hdr_bg_warn = CreateSolidBrush(bg_hdr_warn);
         tbl->hb_hdr_bg_crit = CreateSolidBrush(bg_hdr_crit);
         tbl->hb_hdr_bg_exp =  CreateSolidBrush(bg_hdr_exp);
-        tbl->hb_hdr_bg_def =  CreateSolidBrush(bg_hdr_def);
 
-        tbl->hb_hdr_bg_s =      CreateSolidBrush(cw_mix_colors(bg_s, bg_hdr, SEL_ALPHA));
-        tbl->hb_hdr_bg_warn_s = CreateSolidBrush(cw_mix_colors(bg_s, bg_hdr_warn, SEL_ALPHA));
-        tbl->hb_hdr_bg_crit_s = CreateSolidBrush(cw_mix_colors(bg_s, bg_hdr_crit, SEL_ALPHA));
-        tbl->hb_hdr_bg_exp_s =  CreateSolidBrush(cw_mix_colors(bg_s, bg_hdr_exp, SEL_ALPHA));
-        tbl->hb_hdr_bg_def_s =  CreateSolidBrush(cw_mix_colors(bg_s, bg_hdr_def, SEL_ALPHA));
+        tbl->hb_hdr_bg_s =      CreateSolidBrush(bg_s);
+        tbl->hb_hdr_bg_cred_s = CreateSolidBrush(bg_hdr_cred_s);
+        tbl->hb_hdr_bg_warn_s = CreateSolidBrush(bg_hdr_warn_s);
+        tbl->hb_hdr_bg_crit_s = CreateSolidBrush(bg_hdr_crit_s);
+        tbl->hb_hdr_bg_exp_s =  CreateSolidBrush(bg_hdr_exp_s);
     }
 
     tbl->ilist = khui_create_ilist(KHUI_SMICON_CX, KHUI_SMICON_CY-1, 20, 8, 0);
@@ -1887,13 +1943,13 @@ cw_unload_view(khui_credwnd_tbl * tbl)
     SafeDeleteObject(tbl->hb_hdr_bg_crit);
     SafeDeleteObject(tbl->hb_hdr_bg_exp);
     SafeDeleteObject(tbl->hb_hdr_bg_warn);
-    SafeDeleteObject(tbl->hb_hdr_bg_def);
+    SafeDeleteObject(tbl->hb_hdr_bg_cred);
 
     SafeDeleteObject(tbl->hb_hdr_bg_s);
     SafeDeleteObject(tbl->hb_hdr_bg_crit_s);
     SafeDeleteObject(tbl->hb_hdr_bg_exp_s);
     SafeDeleteObject(tbl->hb_hdr_bg_warn_s);
-    SafeDeleteObject(tbl->hb_hdr_bg_def_s);
+    SafeDeleteObject(tbl->hb_hdr_bg_cred_s);
 
 #undef SafeDeleteObject
 
@@ -2363,8 +2419,8 @@ cw_draw_header(HDC hdc,
                 hbr = tbl->hb_hdr_bg_crit_s;
             else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_WARN)
                 hbr = tbl->hb_hdr_bg_warn_s;
-            else if (idf & KCDB_IDENT_FLAG_DEFAULT)
-                hbr = tbl->hb_hdr_bg_def_s;
+            else if ((colattr == KCDB_ATTR_ID_NAME) && !(o->flags & KHUI_CW_O_EMPTY)) 
+                hbr = tbl->hb_hdr_bg_cred_s;
             else
                 hbr = tbl->hb_hdr_bg_s;
         } else {
@@ -2374,8 +2430,8 @@ cw_draw_header(HDC hdc,
                 hbr = tbl->hb_hdr_bg_crit;
             else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_WARN)
                 hbr = tbl->hb_hdr_bg_warn;
-            else if (idf & KCDB_IDENT_FLAG_DEFAULT)
-                hbr = tbl->hb_hdr_bg_def;
+            else if ((colattr == KCDB_ATTR_ID_NAME) && !(o->flags & KHUI_CW_O_EMPTY)) 
+                hbr = tbl->hb_hdr_bg_cred;
             else
                 hbr = tbl->hb_hdr_bg;
         }
@@ -2550,9 +2606,9 @@ cw_draw_header(HDC hdc,
 
             tr.left = max(tr.right - cx_str, tr.left + cx_id + KHUI_SMICON_CX * 2);
             if (selected)
-                SetTextColor(hdc, tbl->cr_hdr_gray_s);
+                SetTextColor(hdc, tbl->cr_hdr_s);
             else
-                SetTextColor(hdc, tbl->cr_hdr_gray);
+                SetTextColor(hdc, tbl->cr_hdr_normal);
             DrawText(hdc, typestr, len, &tr, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);
         }
 
@@ -2609,9 +2665,9 @@ cw_draw_header(HDC hdc,
                 len = (int) wcslen(buf);
 
                 if (selected)
-                    SetTextColor(hdc, tbl->cr_hdr_gray_s);
+                    SetTextColor(hdc, tbl->cr_hdr_s);
                 else
-                    SetTextColor(hdc, tbl->cr_hdr_gray);
+                    SetTextColor(hdc, tbl->cr_hdr_normal);
                 DrawText(hdc, buf, len, &tr, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);
             }
         }
index 47f8a745e125f35307dec771e5f3bbb17c94983c..f47f62f6530947e459d9c5e053fca617a6504c9b 100644 (file)
@@ -198,16 +198,16 @@ typedef struct khui_credwnd_tbl_t {
     HBRUSH hb_s;            /* normal background brush (selected) */
 
     HBRUSH hb_hdr_bg;       /* header background brush (normal) */
+    HBRUSH hb_hdr_bg_cred;  /* header background brush (valid creds) */
     HBRUSH hb_hdr_bg_exp;   /* header background brush (expired) */
     HBRUSH hb_hdr_bg_warn;  /* header background brush (warn) */
     HBRUSH hb_hdr_bg_crit;  /* header background brush (critical) */
-    HBRUSH hb_hdr_bg_def;   /* header background brush (default) */
 
     HBRUSH hb_hdr_bg_s;     /* header background brush (selected) */
+    HBRUSH hb_hdr_bg_cred_s;/* header background brush (valid creds) */
     HBRUSH hb_hdr_bg_exp_s; /* header background brush (expired,selected) */
     HBRUSH hb_hdr_bg_warn_s;/* header background brush (warn,selected) */
     HBRUSH hb_hdr_bg_crit_s;/* header background brush (critical,selected) */
-    HBRUSH hb_hdr_bg_def_s; /* header background brush (default,selected) */
 
     COLORREF cr_normal;     /* text color (normal) */
     COLORREF cr_s;          /* text color (selected) */
index 0c76dc0658ad80e0c3c02123f07547cd7486667d..6fb931dfd4a58e657de877c7932a76ac323ab742 100644 (file)
-Name,Type,Value,Description\r
-CredWindow,KC_SPACE,0,"Options for the credentials window as well as the Network Identity Manager application."\r
-  AutoInit,KC_INT32,0,"Boolean. Prompt for new credentials if no credentials are present during startup."\r
-  AutoStart,KC_INT32,0,"[PRIVATE] Boolean. Start Network Identity Manager automatically when the current user logs in."\r
-  AutoImport,KC_INT32,1,"Boolean. Import credentials from the LSA cache when Network Identity Manager starts."\r
-  AutoDetectNet,KC_INT32,1,"Boolean. Automatically detect network connectivity changes."\r
-  HideWatermark,KC_INT32,0,"Boolean. Suppress watermark in Credentials display.  NOTE:  there is no guarantee that this value will exist in future versions."\r
-  KeepRunning,KC_INT32,1,"Boolean. Run from the system notification area after the main window is closed."\r
-  DefaultView,KC_STRING,ByIdentity,"[PRIVATE] Name of the default view in Advanced mode."\r
-  DefaultViewMini,KC_STRING,CompactIdentity,"[PRIVATE] Name of the default view in Basic mode."\r
-  PaddingHorizontal,KC_INT32,4,"[PRIVATE]"\r
-  PaddingVertical,KC_INT32,2,"[PRIVATE]"\r
-  PaddingHeader,KC_INT32,16,"[PRIVATE]"\r
-  Monitor,KC_INT32,1,"Boolean. Monitor credentials for expiration and renewal."\r
-  DefaultMonitor,KC_INT32,1,"Boolean. This is the default Monitor value that is assigned for new identities."\r
-  RefreshTimeout,KC_INT32,60,"Number of seconds between credentials window refreshes.  The credentials window automatically triggers a refresh operation.  This value specifies the number of seconds that must elapse between two refreshes.  During the refresh, all the credentials provider plug-ins will need to re-enumerate their respective credentials."\r
-  WarnThreshold,KC_INT32,900,In seconds\r
-  AllowWarn,KC_INT32,1,"Boolean. Enables warning."\r
-  CriticalThreshold,KC_INT32,300,In seconds\r
-  AllowCritical,KC_INT32,1,Boolean. Enables critical.\r
-  AutoRenewThreshold,KC_INT32,600,In seconds\r
-  AllowAutoRenew,KC_INT32,1,Boolean.\r
-  RenewAtHalfLife,KC_INT32,1,Boolean. Use half-life algorithm for renewals.\r
-  DefaultAllowAutoRenew,KC_INT32,1,Default AllowAutoRenew value for new identities\r
-  DefaultSticky,KC_INT32,0,Default Sticky value for new identities\r
-  MaxThreshold,KC_INT32,86400,Max value for a threshold (1 day)\r
-  MinThreshold,KC_INT32,10,Min value for a threshold (0)\r
-  LogToFile,KC_INT32,0,Boolean. If true logs trace events to a nidmdbg.log in the temp folder\r
-  DestroyCredsOnExit,KC_INT32,0,Boolean.  If true; all credentials will be destroyed when NetIDMgr exits.\r
-  NotificationAction,KC_INT32,50025,Action to perform when the user clicks on the notification icon.\r
-  DefaultWindowMode,KC_INT32,1,(0-normal; 1-mini)\r
-  Windows,KC_SPACE,0,Window parameters\r
-    _Schema,KC_SPACE,0,Schema\r
-      Width,KC_INT32,0,\r
-      Height,KC_INT32,0,\r
-      XPos,KC_INT32,0,\r
-      YPos,KC_INT32,0,\r
-      Dock,KC_INT32,0,Dock on window corner (0-none; 1-top left; 2-top right; 3-bottom right; 4-bottom left)\r
-    _Schema,KC_ENDSPACE,0,\r
-    Main,KC_SPACE,0,Main window\r
-    Main,KC_ENDSPACE,0,\r
-    MainMini,KC_SPACE,0,Main window (mini mode)\r
-      Width,KC_INT32,470,\r
-      Height,KC_INT32,500,\r
-      Dock,KC_INT32,3,\r
-    MainMini,KC_ENDSPACE,0,\r
-    NewCred,KC_SPACE,0,New credentials window\r
-      ForceToTop,KC_INT32,1,Force new creds window to the top\r
-      AnimateSizeChanges,KC_INT32,1,Animate the new creds window when the size needs changing.\r
-      AnimationSteps,KC_INT32,7,Number of steps in size-change animation\r
-      AnimationStepTimeout,KC_INT32,40,Number of milliseconds to wait between each step of the size-change animation\r
-    NewCred,KC_ENDSPACE,0,\r
-  Windows,KC_ENDSPACE,0,\r
-  Views,KC_SPACE,0,Preconfigured views for credentials\r
-   Custom_0,KC_SPACE,0,First custom view.  Additional views have names of the form Custom_N\r
-    Description,KC_STRING,Custom view,\r
-    ColumnList,KC_STRING,"_CWFlags,IdentityName,TypeName,Name,TimeLeft",\r
-    Columns,KC_SPACE,0,Columns\r
-      _CWFlags,KC_SPACE,0,\r
-        Width,KC_INT32,20,\r
-        Flags,KC_INT32,112,\r
-      _CWFlags,KC_ENDSPACE,0,\r
-      IdentityName,KC_SPACE,0,\r
-        Width,KC_INT32,100,\r
-        SortIndex,KC_INT32,0,\r
-        Flags,KC_INT32,11,\r
-      IdentityName,KC_ENDSPACE,0\r
-      TypeName,KC_SPACE,0\r
-        Width,KC_INT32,100\r
-        SortIndex,KC_INT32,1\r
-        Flags,KC_INT32,11\r
-      TypeName,KC_ENDSPACE,0\r
-      Name,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        SortIndex,KC_INT32,2\r
-        Flags,KC_INT32,3\r
-      Name,KC_ENDSPACE,0\r
-      TimeLeft,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        Flags,KC_INT32,1\r
-      TimeLeft,KC_ENDSPACE,0\r
-    Columns,KC_ENDSPACE,0\r
-   Custom_0,KC_ENDSPACE,0,\r
-   ByIdentity,KC_SPACE,0,The default view\r
-    Description,KC_STRING,View grouped by identity and credential type,\r
-    ColumnList,KC_STRING,"_CWFlags,IdentityName,TypeName,Location,Name,TimeLeft",\r
-    Columns,KC_SPACE,0,Columns\r
-      _CWFlags,KC_SPACE,0,\r
-        Width,KC_INT32,20,\r
-        Flags,KC_INT32,112,\r
-      _CWFlags,KC_ENDSPACE,0,\r
-      IdentityName,KC_SPACE,0,\r
-        Width,KC_INT32,100,\r
-        SortIndex,KC_INT32,0,\r
-        Flags,KC_INT32,11,\r
-      IdentityName,KC_ENDSPACE,0\r
-      TypeName,KC_SPACE,0\r
-        Width,KC_INT32,100\r
-        SortIndex,KC_INT32,1\r
-        Flags,KC_INT32,11\r
-      TypeName,KC_ENDSPACE,0\r
-      Location,KC_SPACE,0,\r
-        Width,KC_INT32,50\r
-        SortIndex,KC_INT32,2\r
-        Flags,KC_INT32,11\r
-      Location,KC_ENDSPACE,0,\r
-      Name,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        SortIndex,KC_INT32,3\r
-        Flags,KC_INT32,3\r
-      Name,KC_ENDSPACE,0\r
-      TimeLeft,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        Flags,KC_INT32,1\r
-      TimeLeft,KC_ENDSPACE,0\r
-    Columns,KC_ENDSPACE,0\r
-   ByIdentity,KC_ENDSPACE,0\r
-   ByType,KC_SPACE,0,The default view\r
-    Description,KC_STRING,View grouped by type and identity,\r
-    ColumnList,KC_STRING,"_CWFlags,TypeName,IdentityName,Name,TimeLeft",\r
-    Columns,KC_SPACE,0,Columns\r
-      _CWFlags,KC_SPACE,0,\r
-        Width,KC_INT32,20,\r
-        Flags,KC_INT32,112,\r
-      _CWFlags,KC_ENDSPACE,0,\r
-      TypeName,KC_SPACE,0\r
-        Width,KC_INT32,100\r
-        SortIndex,KC_INT32,0\r
-        Flags,KC_INT32,11\r
-      TypeName,KC_ENDSPACE,0\r
-      IdentityName,KC_SPACE,0,\r
-        Width,KC_INT32,100,\r
-        SortIndex,KC_INT32,1,\r
-        Flags,KC_INT32,11,\r
-      IdentityName,KC_ENDSPACE,0\r
-      Name,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        SortIndex,KC_INT32,2\r
-        Flags,KC_INT32,3\r
-      Name,KC_ENDSPACE,0\r
-      TimeLeft,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        Flags,KC_INT32,1\r
-      TimeLeft,KC_ENDSPACE,0\r
-    Columns,KC_ENDSPACE,0\r
-   ByType,KC_ENDSPACE,0\r
-   ByLocation,KC_SPACE,0,View by location\r
-    Description,KC_STRING,View grouped by location,\r
-    ColumnList,KC_STRING,"_CWFlags,Location,IdentityName,TypeName,Name,TimeLeft",\r
-    Columns,KC_SPACE,0,Columns\r
-      _CWFlags,KC_SPACE,0,\r
-        Width,KC_INT32,20,\r
-        Flags,KC_INT32,112,\r
-      _CWFlags,KC_ENDSPACE,0,\r
-      Location,KC_SPACE,0,\r
-        Width,KC_INT32,100,\r
-        SortIndex,KC_INT32,0,\r
-        Flags,KC_INT32,11,\r
-      Location,KC_ENDSPACE,0,\r
-      IdentityName,KC_SPACE,0,\r
-        Width,KC_INT32,100,\r
-        SortIndex,KC_INT32,1,\r
-        Flags,KC_INT32,11,\r
-      IdentityName,KC_ENDSPACE,0\r
-      TypeName,KC_SPACE,0\r
-        Width,KC_INT32,100\r
-        SortIndex,KC_INT32,2\r
-        Flags,KC_INT32,11\r
-      TypeName,KC_ENDSPACE,0\r
-      Name,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        SortIndex,KC_INT32,3\r
-        Flags,KC_INT32,3\r
-      Name,KC_ENDSPACE,0\r
-      TimeLeft,KC_SPACE,0\r
-        Width,KC_INT32,200\r
-        Flags,KC_INT32,1\r
-      TimeLeft,KC_ENDSPACE,0\r
-    Columns,KC_ENDSPACE,0\r
-   ByLocation,KC_ENDSPACE,0\r
-   CompactIdentity,KC_SPACE,0,Default Compact View by Identity\r
-     Description,KC_STRING,Compact view of identities\r
-     ColumnList,KC_STRING,"IdentityName",\r
-     ExpandedIdentity,KC_INT32,1,Use expanded display of identity headers\r
-     NoHeader,KC_INT32,1,Suppress the column header\r
-     Columns,KC_SPACE,0,\r
-       IdentityName,KC_SPACE,0,\r
-         Width,KC_INT32,415,\r
-         SortIndex,KC_INT32,0,\r
-         Flags,KC_INT32,171\r
-       IdentityName,KC_ENDSPACE,0,\r
-     Columns,KC_ENDSPACE,0,\r
-   CompactIdentity,KC_ENDSPACE,0\r
-   Custom_1,KC_SPACE,0,Default Compact View by Identity\r
-     Description,KC_STRING,Compact view of identities\r
-     ColumnList,KC_STRING,"IdentityName",\r
-     ExpandedIdentity,KC_INT32,1,Use expanded display of identity headers\r
-     NoHeader,KC_INT32,1,Suppress the column header\r
-     Columns,KC_SPACE,0,\r
-       IdentityName,KC_SPACE,0,\r
-         Width,KC_INT32,415,\r
-         SortIndex,KC_INT32,0,\r
-         Flags,KC_INT32,171\r
-       IdentityName,KC_ENDSPACE,0,\r
-     Columns,KC_ENDSPACE,0,\r
-   Custom_1,KC_ENDSPACE,0\r
-  Views,KC_ENDSPACE,0\r
-  Notices,KC_SPACE,0,Notices and alerts\r
-    MinimizeWarning,KC_INT32,1,Show the minimize warning?\r
-  Notices,KC_ENDSPACE,0\r
-CredWindow,KC_ENDSPACE,0\r
+#@#include<windows.h>
+#@#define RGBA(r,g,b,a) ((((DWORD) ((a) & 0xff)) << 24) | RGB(r,g,b))
+Name,Type,Value,Description
+CredWindow,KC_SPACE,0,"Options for the credentials window as well as the Network Identity Manager application."
+  AutoInit,KC_INT32,0,"Boolean. Prompt for new credentials if no credentials are present during startup."
+  AutoStart,KC_INT32,0,"[PRIVATE] Boolean. Start Network Identity Manager automatically when the current user logs in."
+  AutoImport,KC_INT32,1,"Boolean. Import credentials from the LSA cache when Network Identity Manager starts."
+  AutoDetectNet,KC_INT32,1,"Boolean. Automatically detect network connectivity changes."
+  HideWatermark,KC_INT32,0,"Boolean. Suppress watermark in Credentials display.  NOTE:  there is no guarantee that this value will exist in future versions."
+  KeepRunning,KC_INT32,1,"Boolean. Run from the system notification area after the main window is closed."
+  DefaultView,KC_STRING,ByIdentity,"[PRIVATE] Name of the default view in Advanced mode."
+  DefaultViewMini,KC_STRING,CompactIdentity,"[PRIVATE] Name of the default view in Basic mode."
+  PaddingHorizontal,KC_INT32,4,"[PRIVATE]"
+  PaddingVertical,KC_INT32,2,"[PRIVATE]"
+  PaddingHeader,KC_INT32,16,"[PRIVATE]"
+  Monitor,KC_INT32,1,"Boolean. Monitor credentials for expiration and renewal."
+  DefaultMonitor,KC_INT32,1,"Boolean. This is the default Monitor value that is assigned for new identities."
+  RefreshTimeout,KC_INT32,60,"Number of seconds between credentials window refreshes.  The credentials window automatically triggers a refresh operation.  This value specifies the number of seconds that must elapse between two refreshes.  During the refresh, all the credentials provider plug-ins will need to re-enumerate their respective credentials."
+  WarnThreshold,KC_INT32,900,In seconds
+  AllowWarn,KC_INT32,1,"Boolean. Enables warning."
+  CriticalThreshold,KC_INT32,300,In seconds
+  AllowCritical,KC_INT32,1,Boolean. Enables critical.
+  AutoRenewThreshold,KC_INT32,600,In seconds
+  AllowAutoRenew,KC_INT32,1,Boolean.
+  RenewAtHalfLife,KC_INT32,1,Boolean. Use half-life algorithm for renewals.
+  DefaultAllowAutoRenew,KC_INT32,1,Default AllowAutoRenew value for new identities
+  DefaultSticky,KC_INT32,0,Default Sticky value for new identities
+  MaxThreshold,KC_INT32,86400,Max value for a threshold (1 day)
+  MinThreshold,KC_INT32,10,Min value for a threshold (0)
+  LogToFile,KC_INT32,0,Boolean. If true logs trace events to a nidmdbg.log in the temp folder
+  DestroyCredsOnExit,KC_INT32,0,Boolean.  If true; all credentials will be destroyed when NetIDMgr exits.
+  NotificationAction,KC_INT32,50025,Action to perform when the user clicks on the notification icon.
+  DefaultWindowMode,KC_INT32,1,(0-normal; 1-mini)
+  DefaultTheme,KC_STRING,Default,Default theme.  The name should correspond to a subspace in Themes
+  Windows,KC_SPACE,0,Window parameters
+    _Schema,KC_SPACE,0,Schema
+      Width,KC_INT32,0,
+      Height,KC_INT32,0,
+      XPos,KC_INT32,0,
+      YPos,KC_INT32,0,
+      Dock,KC_INT32,0,Dock on window corner (0-none; 1-top left; 2-top right; 3-bottom right; 4-bottom left)
+    _Schema,KC_ENDSPACE,0,
+    Main,KC_SPACE,0,Main window
+    Main,KC_ENDSPACE,0,
+    MainMini,KC_SPACE,0,Main window (mini mode)
+      Width,KC_INT32,470,
+      Height,KC_INT32,500,
+      Dock,KC_INT32,3,
+    MainMini,KC_ENDSPACE,0,
+    NewCred,KC_SPACE,0,New credentials window
+      ForceToTop,KC_INT32,1,Force new creds window to the top
+      AnimateSizeChanges,KC_INT32,1,Animate the new creds window when the size needs changing.
+      AnimationSteps,KC_INT32,7,Number of steps in size-change animation
+      AnimationStepTimeout,KC_INT32,40,Number of milliseconds to wait between each step of the size-change animation
+    NewCred,KC_ENDSPACE,0,
+  Windows,KC_ENDSPACE,0,
+  Views,KC_SPACE,0,Preconfigured views for credentials
+   _Schema,KC_SPACE,0,Schema for view definitions
+     Description,KC_STRING,"",Description of the view
+     ColumnList,KC_STRING,"","List of columns for the view, in order"
+     _AppVersion,KC_BINARY,0,Binary version stamp
+     Columns,KC_SPACE,0,"Column definitions.  Each column name should have a corresponding subspace here.  The name of the column should be a property or field name, unless it is a pseudo column like _CWFlags."
+       _Schema,KC_SPACE,0,Column definition schema
+        Width,KC_INT32,0,Width of the column
+        SortIndex,KC_INT32,0,Sort index
+        Flags,KC_INT32,0,Flags (See KHUI_CW_COL_* values)
+       _Schema,KC_ENDSPACE,0
+     Columns,KC_ENDSPACE,0
+   _Schema,KC_ENDSPACE,0,
+   Custom_0,KC_SPACE,0,First custom view.  Additional views have names of the form Custom_N
+    Description,KC_STRING,Custom view,
+    ColumnList,KC_STRING,"_CWFlags,IdentityName,TypeName,Name,TimeLeft",
+    Columns,KC_SPACE,0,Columns
+      _CWFlags,KC_SPACE,0,
+        Width,KC_INT32,20,
+        Flags,KC_INT32,112,
+      _CWFlags,KC_ENDSPACE,0,
+      IdentityName,KC_SPACE,0,
+        Width,KC_INT32,100,
+        SortIndex,KC_INT32,0,
+        Flags,KC_INT32,11,
+      IdentityName,KC_ENDSPACE,0
+      TypeName,KC_SPACE,0
+        Width,KC_INT32,100
+        SortIndex,KC_INT32,1
+        Flags,KC_INT32,11
+      TypeName,KC_ENDSPACE,0
+      Name,KC_SPACE,0
+        Width,KC_INT32,200
+        SortIndex,KC_INT32,2
+        Flags,KC_INT32,3
+      Name,KC_ENDSPACE,0
+      TimeLeft,KC_SPACE,0
+        Width,KC_INT32,200
+        Flags,KC_INT32,1
+      TimeLeft,KC_ENDSPACE,0
+    Columns,KC_ENDSPACE,0
+   Custom_0,KC_ENDSPACE,0,
+   ByIdentity,KC_SPACE,0,The default view
+    Description,KC_STRING,View grouped by identity and credential type,
+    ColumnList,KC_STRING,"_CWFlags,IdentityName,TypeName,Location,Name,TimeLeft",
+    Columns,KC_SPACE,0,Columns
+      _CWFlags,KC_SPACE,0,
+        Width,KC_INT32,20,
+        Flags,KC_INT32,112,
+      _CWFlags,KC_ENDSPACE,0,
+      IdentityName,KC_SPACE,0,
+        Width,KC_INT32,100,
+        SortIndex,KC_INT32,0,
+        Flags,KC_INT32,11,
+      IdentityName,KC_ENDSPACE,0
+      TypeName,KC_SPACE,0
+        Width,KC_INT32,100
+        SortIndex,KC_INT32,1
+        Flags,KC_INT32,11
+      TypeName,KC_ENDSPACE,0
+      Location,KC_SPACE,0,
+        Width,KC_INT32,50
+        SortIndex,KC_INT32,2
+        Flags,KC_INT32,11
+      Location,KC_ENDSPACE,0,
+      Name,KC_SPACE,0
+        Width,KC_INT32,200
+        SortIndex,KC_INT32,3
+        Flags,KC_INT32,3
+      Name,KC_ENDSPACE,0
+      TimeLeft,KC_SPACE,0
+        Width,KC_INT32,200
+        Flags,KC_INT32,1
+      TimeLeft,KC_ENDSPACE,0
+    Columns,KC_ENDSPACE,0
+   ByIdentity,KC_ENDSPACE,0
+   ByType,KC_SPACE,0,The default view
+    Description,KC_STRING,View grouped by type and identity,
+    ColumnList,KC_STRING,"_CWFlags,TypeName,IdentityName,Name,TimeLeft",
+    Columns,KC_SPACE,0,Columns
+      _CWFlags,KC_SPACE,0,
+        Width,KC_INT32,20,
+        Flags,KC_INT32,112,
+      _CWFlags,KC_ENDSPACE,0,
+      TypeName,KC_SPACE,0
+        Width,KC_INT32,100
+        SortIndex,KC_INT32,0
+        Flags,KC_INT32,11
+      TypeName,KC_ENDSPACE,0
+      IdentityName,KC_SPACE,0,
+        Width,KC_INT32,100,
+        SortIndex,KC_INT32,1,
+        Flags,KC_INT32,11,
+      IdentityName,KC_ENDSPACE,0
+      Name,KC_SPACE,0
+        Width,KC_INT32,200
+        SortIndex,KC_INT32,2
+        Flags,KC_INT32,3
+      Name,KC_ENDSPACE,0
+      TimeLeft,KC_SPACE,0
+        Width,KC_INT32,200
+        Flags,KC_INT32,1
+      TimeLeft,KC_ENDSPACE,0
+    Columns,KC_ENDSPACE,0
+   ByType,KC_ENDSPACE,0
+   ByLocation,KC_SPACE,0,View by location
+    Description,KC_STRING,View grouped by location,
+    ColumnList,KC_STRING,"_CWFlags,Location,IdentityName,TypeName,Name,TimeLeft",
+    Columns,KC_SPACE,0,Columns
+      _CWFlags,KC_SPACE,0,
+        Width,KC_INT32,20,
+        Flags,KC_INT32,112,
+      _CWFlags,KC_ENDSPACE,0,
+      Location,KC_SPACE,0,
+        Width,KC_INT32,100,
+        SortIndex,KC_INT32,0,
+        Flags,KC_INT32,11,
+      Location,KC_ENDSPACE,0,
+      IdentityName,KC_SPACE,0,
+        Width,KC_INT32,100,
+        SortIndex,KC_INT32,1,
+        Flags,KC_INT32,11,
+      IdentityName,KC_ENDSPACE,0
+      TypeName,KC_SPACE,0
+        Width,KC_INT32,100
+        SortIndex,KC_INT32,2
+        Flags,KC_INT32,11
+      TypeName,KC_ENDSPACE,0
+      Name,KC_SPACE,0
+        Width,KC_INT32,200
+        SortIndex,KC_INT32,3
+        Flags,KC_INT32,3
+      Name,KC_ENDSPACE,0
+      TimeLeft,KC_SPACE,0
+        Width,KC_INT32,200
+        Flags,KC_INT32,1
+      TimeLeft,KC_ENDSPACE,0
+    Columns,KC_ENDSPACE,0
+   ByLocation,KC_ENDSPACE,0
+   CompactIdentity,KC_SPACE,0,Default Compact View by Identity
+     Description,KC_STRING,Compact view of identities
+     ColumnList,KC_STRING,"IdentityName",
+     ExpandedIdentity,KC_INT32,1,Use expanded display of identity headers
+     NoHeader,KC_INT32,1,Suppress the column header
+     Columns,KC_SPACE,0,
+       IdentityName,KC_SPACE,0,
+         Width,KC_INT32,415,
+         SortIndex,KC_INT32,0,
+         Flags,KC_INT32,171
+       IdentityName,KC_ENDSPACE,0,
+     Columns,KC_ENDSPACE,0,
+   CompactIdentity,KC_ENDSPACE,0
+   Custom_1,KC_SPACE,0,Default Compact View by Identity
+     Description,KC_STRING,Compact view of identities
+     ColumnList,KC_STRING,"IdentityName",
+     ExpandedIdentity,KC_INT32,1,Use expanded display of identity headers
+     NoHeader,KC_INT32,1,Suppress the column header
+     Columns,KC_SPACE,0,
+       IdentityName,KC_SPACE,0,
+         Width,KC_INT32,415,
+         SortIndex,KC_INT32,0,
+         Flags,KC_INT32,171
+       IdentityName,KC_ENDSPACE,0,
+     Columns,KC_ENDSPACE,0,
+   Custom_1,KC_ENDSPACE,0
+  Views,KC_ENDSPACE,0
+  Notices,KC_SPACE,0,Notices and alerts
+    MinimizeWarning,KC_INT32,1,Show the minimize warning?
+  Notices,KC_ENDSPACE,0
+  Themes,KC_SPACE,0,Color schemes for the credentials display
+    _Schema,KC_SPACE,0,Schema for color schemes
+      ClrSelection,KC_INT32,0,"Background (Selection)"
+      ClrBackground,KC_INT32,0,"Background (Normal)"
+      ClrGray,KC_INT32,0,"Background (Gray)"
+      ClrHeader,KC_INT32,0,"Header (Normal)"
+      ClrHeaderCred,KC_INT32,0,"Header (with credentials)"
+      ClrHeaderWarn,KC_INT32,0,"Header (Warning)"
+      ClrHeaderCrit,KC_INT32,0,"Header (Critical)"
+      ClrHeaderExp,KC_INT32,0,"Header (Expired)"
+      ClrHeaderSel,KC_INT32,0,"Header (Normal, Selected)"
+      ClrHeaderCredSel,KC_INT32,0,"Header (with credentials, Selected)"
+      ClrHeaderWarnSel,KC_INT32,0,"Header (Warning, Selected)"
+      ClrHeaderCritSel,KC_INT32,0,"Header (Critical, Selected)"
+      ClrHeaderExpSel,KC_INT32,0,"Header (Expired, Selected)"
+      ClrHeaderOutline,KC_INT32,0,"Header (Outline color)"
+      ClrText,KC_INT32,0,"Text (Normal)"
+      ClrTextSel,KC_INT32,0,"Text (Selected)"
+      ClrTextHeader,KC_INT32,0,"Text (Header)"
+      ClrTextHeaderSel,KC_INT32,0,"Text (Header, Selected)"
+      ClrTextHeaderGray,KC_INT32,0,"Text (Header, Gray)"
+      ClrTextHeaderGraySel,KC_INT32,0,"Text (Header, Gray, Selected)"
+    _Schema,KC_ENDSPACE,0,
+    Default,KC_SPACE,0,Default color scheme
+      ClrSelection,KC_INT32,"RGB(192,192,192)",
+      ClrBackground,KC_INT32,"RGB(255,255,255)",
+      ClrGray,KC_INT32,"RGB(240,240,240)",
+      ClrHeader,KC_INT32,"RGB(240,240,240)",
+      ClrHeaderCred,KC_INT32,"RGB(184,235,134)",
+      ClrHeaderWarn,KC_INT32,"RGB(235,235,134)",
+      ClrHeaderCrit,KC_INT32,"RGB(235,184,134)",
+      ClrHeaderExp,KC_INT32,"RGB(235,134,134)",
+      ClrHeaderSel,KC_INT32,"RGB(200,200,200)",
+      ClrHeaderCredSel,KC_INT32,"RGB(144,195, 94)",
+      ClrHeaderWarnSel,KC_INT32,"RGB(195,195, 94)",
+      ClrHeaderCritSel,KC_INT32,"RGB(195,144, 94)",
+      ClrHeaderExpSel,KC_INT32,"RGB(195, 94, 94)",
+      ClrHeaderOutline,KC_INT32,"RGB(15,15,15)",
+      ClrText,KC_INT32,"RGB(15,15,15)",
+      ClrTextSel,KC_INT32,"RGB(0,0,0)",
+      ClrTextHeader,KC_INT32,"RGB(15,15,15)",
+      ClrTextHeaderSel,KC_INT32,"RGB(0,0,0)",
+      ClrTextHeaderGray,KC_INT32,"RGB(192,192,192)",
+      ClrTextHeaderGraySel,KC_INT32,"RGB(240,240,240)",
+    Default,KC_ENDSPACE,0
+  Themes,KC_ENDSPACE,0
+CredWindow,KC_ENDSPACE,0