From: Jeffrey Altman Date: Mon, 2 Apr 2007 17:49:08 +0000 (+0000) Subject: More commits for NIM 1.2 Beta 1 X-Git-Tag: krb5-1.7-alpha1~1184 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=c697f74a7c058e3fc8a83f4b36154000cd3b587e;p=krb5.git More commits for NIM 1.2 Beta 1 netidmgr.exe - Credentials display : - When picking out the mouse hit rectangles, correctly handle the case where a sticky identity doesn't have any outline controls. - Move code to check and uncheck view layout action to cw_load_view() for consistency. - Initialize outlines properly when creating them. - cw_select_row_creds() should be called on all rows that are being selected or unselected. - Actions : - Remove the 'Contents' item from the 'Help' menu. The KHUI_ACTION_HELP_CTX action already opens the 'Contents' section. - Add 'Change password', 'Import', 'Help contents', and 'About' to the notification icon context menu. - Move the 'Import' action to be between 'Renew' and 'Destroy' for consistency. - Resources : - "Run Network Identity Manager in System Tray" -> "Run from taskbar notification area" - "New Credentials" -> "Obtain new credentials" - Main window : - Don't switch the window mode when handling a KHUI_ACTION_LAYOUT_RELOAD. - Refresh the action tables after changing the window state actions. - Main Menu : - Call khm_refresh_identity_menus() when initializing the menus so that they have a consistent initial state. - When refreshing menus, the checked/unchecked state needs to be set explicitly by turning off flags that are no longer necessary. - Refresh the identities before refreshing the identity menus. - If there are no identities with credentials, disable renew/destroy menus and actions. - Don't bother adding 'renew/destroy all' menu items to the per-identity action menus if there is only one identity. krb5cred.dll - Resources : - Expand the 'Credential flags' control so that it's big enough to hold the contents. source - ccsv.pl : - Handle comment lines before the actual content. - csvschema.cfg : - Don't bother embedding documentation in the data strucutre now. We don't use it. - Convert '[~]' to '\0' before we send it back to the parser. ticket: new component: windows tags: pullup git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@19376 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/windows/identity/config/ccsv.pl b/src/windows/identity/config/ccsv.pl index c6c82814f..a3777975a 100644 --- a/src/windows/identity/config/ccsv.pl +++ b/src/windows/identity/config/ccsv.pl @@ -88,10 +88,10 @@ $first_line = 1; while() { chomp $_; - if($skip_lines > 0) { - $skip_lines--; - } elsif (m/^\#/) { + if (m/^\#/) { # ignore + } elsif ($skip_lines > 0) { + $skip_lines--; } else { if($first_line == 0){ print OUT $record_sep; diff --git a/src/windows/identity/config/csvschema.cfg b/src/windows/identity/config/csvschema.cfg index ba3bf9bfc..cc8acd26b 100644 --- a/src/windows/identity/config/csvschema.cfg +++ b/src/windows/identity/config/csvschema.cfg @@ -55,13 +55,11 @@ $skip_lines = 1; sub rec_handler { $arr = shift; if($$arr[1] =~ "KC_STRING") { - $$arr[2] = "(khm_int64) L\"".$$arr[2]."\""; $$arr[2] =~ s/\[\~\]/\\0/g; + $$arr[2] = "(khm_int64) L\"".$$arr[2]."\""; } - if($#$arr == 2){ - $$arr[3] = ""; - } + $$arr[3] = ""; } $record_parser = \&rec_handler; diff --git a/src/windows/identity/plugins/krb5/lang/en_us/langres.rc b/src/windows/identity/plugins/krb5/lang/en_us/langres.rc index 1bdae10e2..67492dadf 100644 --- a/src/windows/identity/plugins/krb5/lang/en_us/langres.rc +++ b/src/windows/identity/plugins/krb5/lang/en_us/langres.rc @@ -81,7 +81,7 @@ BEGIN LTEXT "Valid till",IDC_STATIC,7,39,24,8 LTEXT "Renewable till",IDC_STATIC,7,55,45,12 LTEXT "Issued on",IDC_STATIC,7,23,32,8 - LTEXT "Credential flags",IDC_STATIC,7,75,37,8 + LTEXT "Credential flags",IDC_STATIC,7,75,51,8 EDITTEXT IDC_PPK5_NAME,72,7,156,12,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_PPK5_ISSUE,72,23,156,12,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_PPK5_VALID,72,39,156,12,ES_AUTOHSCROLL | ES_READONLY diff --git a/src/windows/identity/ui/credwnd.c b/src/windows/identity/ui/credwnd.c index 4ed45e6d9..a31daac5a 100644 --- a/src/windows/identity/ui/credwnd.c +++ b/src/windows/identity/ui/credwnd.c @@ -470,31 +470,31 @@ cw_load_view(khui_credwnd_tbl * tbl, wchar_t * view, HWND hwnd) { if(KHM_FAILED(khc_read_string(hc_cw, viewval, buf, &cbsize))) goto _exit; view = buf; + } else { + khc_write_string(hc_cw, viewval, view); + } /* in addition, if we are loading the default view, we should also check the appropriate menu item */ - if (!wcscmp(view, L"ByIdentity")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_ID); - else if (!wcscmp(view, L"ByLocation")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_LOC); - else if (!wcscmp(view, L"ByType")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_TYPE); - else if (!wcscmp(view, L"Custom_0")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_CUST); - else if (!wcscmp(view, L"CompactIdentity")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_MINI); - - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } else { - khc_write_string(hc_cw, viewval, view); + if (!wcscmp(view, L"ByIdentity")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_ID); + else if (!wcscmp(view, L"ByLocation")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_LOC); + else if (!wcscmp(view, L"ByType")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_TYPE); + else if (!wcscmp(view, L"Custom_0")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_CUST); + else { + /* do nothing */ } + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + if(KHM_FAILED(khc_open_space(hc_vs, view, 0, &hc_v))) goto _exit; @@ -1064,6 +1064,7 @@ cw_new_outline_node(wchar_t * heading) { o->header = PMALLOC(cblen); StringCbCopy(o->header, cblen, heading); } + o->start = -1; return o; } @@ -1708,23 +1709,29 @@ cw_update_outline(khui_credwnd_tbl * tbl) o->col = grouping[0]; o->data = id_def; o->attr_id = KCDB_ATTR_ID; + o->start = -1; + } else { + kcdb_identity_release(id_def); + } - if (flags & KCDB_IDENT_FLAG_STICKY) - o->flags |= KHUI_CW_O_STICKY; + if (o->start != -1) + goto done_with_defident; + + if (flags & KCDB_IDENT_FLAG_STICKY) + o->flags |= KHUI_CW_O_STICKY; + else + o->flags &= ~KHUI_CW_O_STICKY; - o->start = n_rows; - o->length = 1; - o->idx_start = -1; + o->start = n_rows; + o->length = 1; + o->idx_start = -1; - if (grouping[0] == tbl->n_cols - 1) - o->flags |= KHUI_CW_O_NOOUTLINE; + if (grouping[0] == tbl->n_cols - 1) + o->flags |= KHUI_CW_O_NOOUTLINE; - cw_set_tbl_row_header(tbl, n_rows, grouping[0], o); + cw_set_tbl_row_header(tbl, n_rows, grouping[0], o); - n_rows ++; - } else { - kcdb_identity_release(id_def); - } + n_rows ++; done_with_defident: ; @@ -1775,7 +1782,7 @@ cw_update_outline(khui_credwnd_tbl * tbl) /* found it */ if (o->start != -1) /* already visible? */ continue; - o->flags &= KHUI_CW_O_STICKY; + o->flags &= KHUI_CW_O_STICKY | KHUI_CW_O_RELIDENT; o->flags |= KHUI_CW_O_VISIBLE; } else { /* not found. create */ @@ -1786,21 +1793,22 @@ cw_update_outline(khui_credwnd_tbl * tbl) o->col = grouping[0]; o->data = (void *) h; o->attr_id = KCDB_ATTR_ID; - - if (grouping[0] == tbl->n_cols - 1) - o->flags |= KHUI_CW_O_NOOUTLINE; } + if (grouping[0] == tbl->n_cols - 1) + o->flags |= KHUI_CW_O_NOOUTLINE; + if (o->flags & KHUI_CW_O_STICKY) kcdb_identity_release(h); else /* leave identity held in this case */ - o->flags |= KHUI_CW_O_STICKY; + o->flags |= KHUI_CW_O_STICKY | KHUI_CW_O_RELIDENT; o->flags &= ~KHUI_CW_O_EXPAND; o->start = n_rows; o->length = 1; o->idx_start = -1; + o->idx_end = -1; cw_set_tbl_row_header(tbl, n_rows, grouping[0], o); @@ -2369,6 +2377,9 @@ cw_draw_header(HDC hdc, if (o->flags & KHUI_CW_O_STICKY) { /* khui_ilist_draw_id(tbl->ilist, IDB_TK_NEW_SM, hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); */ + if (!(o->flags & KHUI_CW_O_NOOUTLINE)) { + r->left += KHUI_SMICON_CX * 3 / 2; + } } else if (!(o->flags & KHUI_CW_O_NOOUTLINE)) { if((tbl->mouse_state & CW_MOUSE_WOUTLINE) && tbl->mouse_row == row) { @@ -3582,7 +3593,7 @@ cw_select_outline(khui_credwnd_outline * o, } static void -cw_select_cred_row(khui_credwnd_tbl * tbl, int row, int selected) { +cw_select_row_creds(khui_credwnd_tbl * tbl, int row, int selected) { khm_size j; khm_size idx_start, idx_end; @@ -3613,6 +3624,9 @@ cw_select_cred_row(khui_credwnd_tbl * tbl, int row, int selected) { idx_end = tbl->rows[row].idx_end; } + if (idx_start == -1 || idx_end == -1) + return; + for (j = idx_start; j <= idx_end; j++) { khm_handle cred = NULL; @@ -3634,9 +3648,7 @@ cw_unselect_all(khui_credwnd_tbl * tbl) for(i=0; in_rows; i++) { tbl->rows[i].flags &= ~KHUI_CW_ROW_SELECTED; - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - cw_select_cred_row(tbl, i, FALSE); - } + cw_select_row_creds(tbl, i, FALSE); } cw_select_outline_level(tbl->outline, FALSE); @@ -3856,8 +3868,7 @@ cw_select_all(khui_credwnd_tbl * tbl) for(i=0; in_rows; i++) { tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) - cw_select_cred_row(tbl, i, TRUE); + cw_select_row_creds(tbl, i, TRUE); } cw_select_outline_level(tbl->outline, TRUE); @@ -3913,7 +3924,7 @@ cw_select_row(khui_credwnd_tbl * tbl, int row, WPARAM wParam) for (i = group_begin; i <= group_end; i++) { tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - cw_select_cred_row(tbl, i, TRUE); + cw_select_row_creds(tbl, i, TRUE); } } else if (toggle) { BOOL select; @@ -3929,7 +3940,7 @@ cw_select_row(khui_credwnd_tbl * tbl, int row, WPARAM wParam) else tbl->rows[i].flags &= ~KHUI_CW_ROW_SELECTED; - cw_select_cred_row(tbl, i, select); + cw_select_row_creds(tbl, i, select); } } else if (extend) { int range_begin; @@ -3943,7 +3954,7 @@ cw_select_row(khui_credwnd_tbl * tbl, int row, WPARAM wParam) for (i = range_begin; i <= range_end; i++) { tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - cw_select_cred_row(tbl, i, TRUE); + cw_select_row_creds(tbl, i, TRUE); } tbl->cursor_row = row; @@ -4073,7 +4084,7 @@ cw_wm_mouse(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) x < KHUI_SMICON_CX * 4) { nm_state |= CW_MOUSE_WICON | CW_MOUSE_WIDGET; } - } else if (tbl->cols[tbl->rows[row].col].attr_id == KCDB_ATTR_ID_NAME) { + } else if (tbl->cols[o->col].attr_id == KCDB_ATTR_ID_NAME) { if (col == tbl->rows[row].col && x >= 0 && x < KHUI_SMICON_CX){ @@ -5000,8 +5011,6 @@ cw_wm_command(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) InvalidateRect(tbl->hwnd, NULL, TRUE); - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), KHUI_ACTION_LAYOUT_ID); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); } break; @@ -5020,9 +5029,6 @@ cw_wm_command(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) InvalidateRect(tbl->hwnd, NULL, TRUE); - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_LOC); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); } break; @@ -5041,9 +5047,6 @@ cw_wm_command(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) InvalidateRect(tbl->hwnd, NULL, TRUE); - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_TYPE); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); } break; @@ -5062,9 +5065,6 @@ cw_wm_command(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) InvalidateRect(tbl->hwnd, NULL, TRUE); - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_CUST); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); } break; diff --git a/src/windows/identity/ui/lang/en_us/khapp.rc b/src/windows/identity/ui/lang/en_us/khapp.rc index 74255fb02..285db67aa 100644 --- a/src/windows/identity/ui/lang/en_us/khapp.rc +++ b/src/windows/identity/ui/lang/en_us/khapp.rc @@ -247,7 +247,7 @@ BEGIN CONTROL "&Destroy all credentials on exit",IDC_CFG_DESTROYALL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,36,111,10 GROUPBOX "Other",IDC_CFG_OTHER,7,55,241,120 - CONTROL "&Run Network Identity Manager in system tray after window close",IDC_CFG_KEEPRUNNING, + CONTROL "&Run from taskbar notification area after window close",IDC_CFG_KEEPRUNNING, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,68,230,10 LTEXT "Clicking on the ¬ification icon",IDC_CFG_NOTACT_STATIC,26,87,99,8 COMBOBOX IDC_CFG_NOTACTION,133,85,110,48,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP @@ -564,7 +564,7 @@ BEGIN IDS_ACTION_SET_SRCH_ID "Allow applications to &search" IDS_CFG_ROOT_TITLE "Network Identity Manager Configuration" IDS_CFG_GENERAL_SHORT "General" - IDS_ACTION_NEW_CRED "&New credentials ..." + IDS_ACTION_NEW_CRED "Obtain &new credentials ..." IDS_ACTION_PASSWD_ID "Change &password" IDS_ACTION_CHOOSE_COLS "View columns" IDS_ACTION_DEBUG_WINDOW "Debug window" @@ -582,7 +582,7 @@ BEGIN IDS_ACTION_OPT_KHIM "General" IDS_ACTION_OPT_IDENTS "Identities" IDS_ACTION_OPT_NOTIF "Notifications" - IDS_ACTION_HELP_CTX "Help Index" + IDS_ACTION_HELP_CTX "Help Contents" IDS_ACTION_HELP_CONTENTS "Contents" IDS_ACTION_HELP_INDEX "Index" IDS_ACTION_HELP_ABOUT "About Network Identity Manager" diff --git a/src/windows/identity/ui/mainmenu.c b/src/windows/identity/ui/mainmenu.c index 5d9e4d997..e27d0399b 100644 --- a/src/windows/identity/ui/mainmenu.c +++ b/src/windows/identity/ui/mainmenu.c @@ -49,6 +49,8 @@ void khui_init_menu(void) { MAX_ILIST, 5, 0); for(i=0;itype & KHUI_ACTIONTYPE_TOGGLE) { mii.fMask |= MIIM_STATE; if (act->state & KHUI_ACTIONSTATE_CHECKED) { + mii.fState &= ~MFS_UNCHECKED; mii.fState |= MFS_CHECKED; } else { + mii.fState &= ~MFS_CHECKED; mii.fState |= MFS_UNCHECKED; } } @@ -817,6 +821,8 @@ khm_refresh_identity_menus(void) { khm_size t; khm_int32 rv = KHM_ERROR_SUCCESS; + kcdb_identity_refresh_all(); + khui_action_lock(); idcmd_refreshcycle++; @@ -858,6 +864,18 @@ khm_refresh_identity_menus(void) { } while(TRUE); + if (idlist != NULL && n_idents > 0) { + khui_enable_action(KHUI_MENU_RENEW_CRED, TRUE); + khui_enable_action(KHUI_MENU_DESTROY_CRED, TRUE); + khui_enable_action(KHUI_ACTION_RENEW_CRED, TRUE); + khui_enable_action(KHUI_ACTION_DESTROY_CRED, TRUE); + } else { + khui_enable_action(KHUI_MENU_RENEW_CRED, FALSE); + khui_enable_action(KHUI_MENU_DESTROY_CRED, FALSE); + khui_enable_action(KHUI_ACTION_RENEW_CRED, FALSE); + khui_enable_action(KHUI_ACTION_DESTROY_CRED, FALSE); + } + renew_def = khui_find_menu(KHUI_MENU_RENEW_CRED); dest_def = khui_find_menu(KHUI_MENU_DESTROY_CRED); #ifdef DEBUG @@ -870,17 +888,18 @@ khm_refresh_identity_menus(void) { khui_menu_remove_action(renew_def, 0); t--; } - khui_menu_insert_action(renew_def, 0, KHUI_ACTION_RENEW_ALL, 0); t = khui_menu_get_size(dest_def); while(t) { khui_menu_remove_action(dest_def, 0); t--; } - khui_menu_insert_action(dest_def, 0, KHUI_ACTION_DESTROY_ALL, 0); - if (idlist != NULL && n_idents > 0) { + if (idlist != NULL && n_idents > 1) { + khui_menu_insert_action(renew_def, 0, KHUI_ACTION_RENEW_ALL, 0); khui_menu_insert_action(renew_def, 1, KHUI_MENU_SEP, 0); + + khui_menu_insert_action(dest_def, 0, KHUI_ACTION_DESTROY_ALL, 0); khui_menu_insert_action(dest_def, 1, KHUI_MENU_SEP, 0); } diff --git a/src/windows/identity/ui/mainwnd.c b/src/windows/identity/ui/mainwnd.c index 128be085c..76a3fdefe 100644 --- a/src/windows/identity/ui/mainwnd.c +++ b/src/windows/identity/ui/mainwnd.c @@ -387,11 +387,14 @@ khm_main_wnd_proc(HWND hwnd, return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); + case KHUI_ACTION_LAYOUT_RELOAD: + return SendMessage(khm_hwnd_main_cred, uMsg, + wParam, lParam); + case KHUI_ACTION_LAYOUT_ID: case KHUI_ACTION_LAYOUT_TYPE: case KHUI_ACTION_LAYOUT_LOC: case KHUI_ACTION_LAYOUT_CUST: - case KHUI_ACTION_LAYOUT_RELOAD: khm_set_main_window_mode(KHM_MAIN_WND_NORMAL); return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); @@ -1105,6 +1108,8 @@ khm_set_main_window_mode(int mode) { khui_enable_action(KHUI_MENU_COLUMNS, ((mode == KHM_MAIN_WND_MINI)? FALSE : TRUE)); + khui_refresh_actions(); + khm_main_wnd_mode = mode; if (khm_hwnd_main) { khm_get_main_window_rect(&r); diff --git a/src/windows/identity/uilib/action.c b/src/windows/identity/uilib/action.c index 00902eec9..a0295d39e 100644 --- a/src/windows/identity/uilib/action.c +++ b/src/windows/identity/uilib/action.c @@ -53,8 +53,8 @@ khui_action_ref khui_menu_cred[] = { MENU_ACTION(KHUI_ACTION_NEW_CRED), MENU_SEP(), MENU_SUBMENU(KHUI_MENU_RENEW_CRED), - MENU_SUBMENU(KHUI_MENU_DESTROY_CRED), MENU_ACTION(KHUI_ACTION_IMPORT), + MENU_SUBMENU(KHUI_MENU_DESTROY_CRED), MENU_SEP(), MENU_ACTION(KHUI_ACTION_SET_DEF_ID), #if 0 @@ -110,7 +110,6 @@ khui_action_ref khui_menu_options[] = { khui_action_ref khui_menu_help[] = { MENU_ACTION(KHUI_ACTION_HELP_CTX), MENU_SEP(), - MENU_ACTION(KHUI_ACTION_HELP_CONTENTS), MENU_ACTION(KHUI_ACTION_HELP_INDEX), MENU_SEP(), MENU_ACTION(KHUI_ACTION_HELP_ABOUT), @@ -157,8 +156,14 @@ khui_action_ref khui_menu_ico_ctx_min[] = { MENU_SEP(), MENU_ACTION(KHUI_ACTION_NEW_CRED), MENU_SUBMENU(KHUI_MENU_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_IMPORT), MENU_SUBMENU(KHUI_MENU_DESTROY_CRED), MENU_SEP(), + MENU_ACTION(KHUI_ACTION_PASSWD_ID), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_HELP_CTX), + MENU_ACTION(KHUI_ACTION_HELP_ABOUT), + MENU_SEP(), MENU_ACTION(KHUI_ACTION_EXIT), MENU_END() }; @@ -168,8 +173,14 @@ khui_action_ref khui_menu_ico_ctx_normal[] = { MENU_SEP(), MENU_ACTION(KHUI_ACTION_NEW_CRED), MENU_SUBMENU(KHUI_MENU_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_IMPORT), MENU_SUBMENU(KHUI_MENU_DESTROY_CRED), MENU_SEP(), + MENU_ACTION(KHUI_ACTION_PASSWD_ID), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_HELP_CTX), + MENU_ACTION(KHUI_ACTION_HELP_ABOUT), + MENU_SEP(), MENU_ACTION(KHUI_ACTION_EXIT), MENU_END() };