/[winpt]/trunk/Src/wptKeyManagerDlg.cpp
ViewVC logotype

Diff of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 122 by twoaday, Mon Dec 12 11:19:56 2005 UTC revision 123 by twoaday, Wed Dec 14 09:01:45 2005 UTC
# Line 18  Line 18 
18   * along with WinPT; if not, write to the Free Software Foundation,   * along with WinPT; if not, write to the Free Software Foundation,
19   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20   */   */
   
21  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
22  #include <config.h>  #include <config.h>
23  #endif  #endif
# Line 43  Line 42 
42  #include "wptKeyEdit.h"  #include "wptKeyEdit.h"
43  #include "wptRegistry.h"  #include "wptRegistry.h"
44    
45    /* Name and ID of the separator window. */
46  #define KM_SEPARATOR_ID                10000  #define KM_SEPARATOR_ID                10000
47  #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"  #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"
 //#define KM_SEPARATOR_HEIGHT            5  
48    
49    /* Virtual key codes. */
50    #ifndef VK_F
51    #define VK_F 70
52    #endif
53    #ifndef VK_A
54    #define VK_A 65
55    #endif
56    #ifndef VK_C
57    #define VK_C 67
58    #endif
59    #ifndef VK_P
60    #define VK_P 80
61    #endif
62    
63  static subclass_s keylist_proc;  static subclass_s keylist_proc;
 static int km_index = -1;  
64    
65  HIMAGELIST glob_imagelist;  HIMAGELIST glob_imagelist;
66    
# Line 64  struct km_info { Line 75  struct km_info {
75      HWND statbar;      HWND statbar;
76    
77      listview_ctrl_t lv;      listview_ctrl_t lv;
78        int             lv_idx;
79      int keylist_sortby;      int keylist_sortby;
80  };  };
81    
82    /* Toolbar button structure. */
83  struct mybuttons {  struct mybuttons {
84      long icon;      long icon;
85      long command;      long command;
# Line 82  struct mybuttons myb[] = { Line 95  struct mybuttons myb[] = {
95  };  };
96    
97    
98  #ifndef VK_F  /* Subclass the keylist listview control to allow extended commands. */
 #define VK_F 70  
 #endif  
 #ifndef VK_A  
 #define VK_A 65  
 #endif  
 #ifndef VK_C  
 #define VK_C 67  
 #endif  
 #ifndef VK_P  
 #define VK_P 80  
 #endif  
   
99  static BOOL CALLBACK  static BOOL CALLBACK
100  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
101  {  {
# Line 109  keylist_subclass_proc (HWND dlg, UINT ms Line 110  keylist_subclass_proc (HWND dlg, UINT ms
110          int virt_key = (int)wparam;          int virt_key = (int)wparam;
111          switch (virt_key) {          switch (virt_key) {
112          case VK_SPACE:          case VK_SPACE:
113              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_PROPS );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
114              break;              break;
115                    
116          case VK_DELETE:          case VK_DELETE:
117              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_DELETE );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
118              break;              break;
119                    
120          case VK_INSERT:          case VK_INSERT:
# Line 130  keylist_subclass_proc (HWND dlg, UINT ms Line 131  keylist_subclass_proc (HWND dlg, UINT ms
131          case VK_C:          case VK_C:
132              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL)) {
133                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
                 km_index = listview_get_curr_pos (&lv);  
134                  km_clip_export (keylist_proc.dlg, &lv);                  km_clip_export (keylist_proc.dlg, &lv);
135              }              }
136              break;              break;
137    
138          case VK_P:          case VK_P:
139              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL))          
                 km_index = -1;  
140                  km_clip_import (keylist_proc.dlg);                  km_clip_import (keylist_proc.dlg);
             }  
141              break;              break;
142    
143          case VK_F:          case VK_F:
# Line 152  keylist_subclass_proc (HWND dlg, UINT ms Line 150  keylist_subclass_proc (HWND dlg, UINT ms
150          break;          break;
151      }      }
152            
153      return CallWindowProc( keylist_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
154  } /* keylist_subclass_proc */  }
155    
156    
157  static HWND  static HWND
158  load_toolbar (HWND dlg, struct km_info * kmi)  load_toolbar (HWND dlg, struct km_info *kmi)
159  {  {
160      HWND tbwnd;      HWND tbwnd;
161      TBSAVEPARAMS tbsp;      TBSAVEPARAMS tbsp;
# Line 175  load_toolbar (HWND dlg, struct km_info * Line 173  load_toolbar (HWND dlg, struct km_info *
173                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
174                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
175      if (tbwnd) {      if (tbwnd) {
176          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
177          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
178                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
179          ShowWindow (tbwnd, SW_SHOW);          ShowWindow (tbwnd, SW_SHOW);
# Line 185  load_toolbar (HWND dlg, struct km_info * Line 183  load_toolbar (HWND dlg, struct km_info *
183          tbsp.pszSubKey = "Software\\WinPT";          tbsp.pszSubKey = "Software\\WinPT";
184          tbsp.pszValueName = "KM_toolbar";          tbsp.pszValueName = "KM_toolbar";
185          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)
186              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]), (LONG)&tb_buttons[0]);              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]),
187                             (LONG)&tb_buttons[0]);
188       }       }
189       return tbwnd;       return tbwnd;
190  } /* load_toolbar */  }
191    
192    
193  /* Center window @dlg. */  /* Center window @dlg. */
194  static void  static void
195  do_center_window (HWND dlg, struct km_info * kmi)  do_center_window (HWND dlg, struct km_info *kmi)
196  {  {
197      RECT rect;      RECT rect;
198      char * p;      char *p;
199      int pos_x = 0, pos_y = 0;      int pos_x = 0, pos_y = 0;
200                    
201      /* Find bottom of keylist */      /* Find bottom of keylist */
# Line 207  do_center_window (HWND dlg, struct km_in Line 206  do_center_window (HWND dlg, struct km_in
206    
207      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
208      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
209          free_if_alloc (p);          free_if_alloc (p);      
210          center_window (dlg, NULL);          center_window (dlg, NULL);
211          return;          return;
212      }      }
# Line 217  do_center_window (HWND dlg, struct km_in Line 216  do_center_window (HWND dlg, struct km_in
216      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
217      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
218          free_if_alloc (p);          free_if_alloc (p);
219          center_window(dlg, NULL);          center_window (dlg, NULL);
220          return;          return;
221      }      }
222      else if (p)      else if (p)
# Line 230  do_center_window (HWND dlg, struct km_in Line 229  do_center_window (HWND dlg, struct km_in
229            
230      if (pos_x < 0 || pos_y < 0)      if (pos_x < 0 || pos_y < 0)
231          pos_x = pos_y = 0;          pos_x = pos_y = 0;
232      if (pos_x > GetSystemMetrics (SM_CXSCREEN)      if (pos_x > GetSystemMetrics (SM_CXSCREEN)
233          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
234          pos_x = pos_y = 0;          pos_x = pos_y = 0;
235      }      }
# Line 239  do_center_window (HWND dlg, struct km_in Line 238  do_center_window (HWND dlg, struct km_in
238  }  }
239    
240    
241    /* Resize the key manager window with the information from @kmi. */
242  static void  static void
243  do_resize_window( HWND dlg, struct km_info *kmi)  do_resize_window (HWND dlg, struct km_info *kmi)
244  {  {
245      HWND h;      HWND h;
246      RECT rclient, rect;      RECT rclient, rect;
247      BOOL bRepaint = FALSE;      BOOL bRepaint = FALSE;
248    
249      /* Get rect of client area and make life easier */      /* Get rect of client area and make life easier */
250      GetClientRect( dlg, &rclient );      GetClientRect (dlg, &rclient);
251    
252      /* Move toolbar to the top of the window */      /* Move toolbar to the top of the window */
253      if (kmi->toolbar) {      if (kmi->toolbar) {
254          GetWindowRect(kmi->toolbar, &rect);          GetWindowRect (kmi->toolbar, &rect);
255          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
256          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
257    
258          rclient.top += rect.bottom - rect.top;          rclient.top += rect.bottom - rect.top;
259          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
# Line 262  do_resize_window( HWND dlg, struct km_in Line 262  do_resize_window( HWND dlg, struct km_in
262    
263      /* Move statusbar to the bottom of the window */      /* Move statusbar to the bottom of the window */
264      if (kmi->statbar) {      if (kmi->statbar) {
265          GetWindowRect( kmi->statbar, &rect );          GetWindowRect (kmi->statbar, &rect);
266          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
267          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
268    
269          rclient.bottom -= rect.bottom - rect.top;          rclient.bottom -= rect.bottom - rect.top;
270          MoveWindow (kmi->statbar, 0, rclient.bottom, rclient.right - rclient.left,          MoveWindow (kmi->statbar, 0, rclient.bottom,
271                        rclient.right - rclient.left,
272                      rect.bottom - rect.top, bRepaint);                      rect.bottom - rect.top, bRepaint);
273      }      }
274    
275      // Obtain separator information and move it to the desired posistion      /* Obtain separator information and move it to the desired posistion */
276      if (kmi->ypercent_sep)      if (kmi->ypercent_sep)
277          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
278      else      else
279          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
280                    
281      // Don't move away      /* Don't move away */
282      if (kmi->ypos_sep+5 > rclient.bottom)      if (kmi->ypos_sep+5 > rclient.bottom)
283          kmi->ypos_sep = rclient.bottom - 5;          kmi->ypos_sep = rclient.bottom - 5;
284      if (kmi->ypos_sep < rclient.top)      if (kmi->ypos_sep < rclient.top)
285          kmi->ypos_sep = rclient.top;          kmi->ypos_sep = rclient.top;
286      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep, (rclient.right - rclient.left), 5, bRepaint);      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
287                    (rclient.right - rclient.left), 5, bRepaint);
288                    
289      // Place the keylist above the separator      /* Place the keylist above the separator */
290      h = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
291      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
292                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
293      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
294    
295      /* Place the group text and the group box below the separator */      /* Place the group text and the group box below the separator */
296      h = GetDlgItem( dlg, IDC_KEYMISC_GTEXT );      h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
297      MoveWindow( h, rclient.left, rclient.top, 100, 14, bRepaint);      MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
298      rclient.top += 18;      rclient.top += 18;
299    
300      h = GetDlgItem( dlg, IDC_KEYMISC_GROUP );      h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
301      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
302                  (rclient.bottom < rclient.top) ? 0 : rclient.bottom - rclient.top, bRepaint);                  (rclient.bottom < rclient.top) ?
303                    0 : rclient.bottom - rclient.top, bRepaint);
304            
305      /* Repaint the whole thing */      /* Repaint the whole thing */
306      InvalidateRect (dlg, NULL, TRUE);      InvalidateRect (dlg, NULL, TRUE);
307  } /* do_resize_window */  }
308    
309    
310    /* Return true if the clipboard contains an OpenPGP key. */
311    static bool
312    clip_contains_pgpkey (void)
313    {
314        char *ctxt;
315        bool val = false;
316    
317        ctxt = get_clip_text (NULL);
318        if (!ctxt || strlen (ctxt) < 512)
319            val = false;
320        else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
321                 strstr (ctxt, "END PGP"))
322            val = true;
323        free_if_alloc (ctxt);
324        return val;
325    }
326    
327    
328    /* Show a mini popup menu to import keys. */
329  static void  static void
330  do_create_minpopup (HWND dlg)  do_create_minpopup (HWND dlg)
331  {  {
# Line 312  do_create_minpopup (HWND dlg) Line 334  do_create_minpopup (HWND dlg)
334      char * s;      char * s;
335      POINT p;      POINT p;
336            
337      if (gpg_read_only)      if (gpg_read_only || !clip_contains_pgpkey ())
338          return;          return;
339      hm = CreatePopupMenu ();      hm = CreatePopupMenu ();
340      if (!hm)      if (!hm)
# Line 329  do_create_minpopup (HWND dlg) Line 351  do_create_minpopup (HWND dlg)
351      GetCursorPos (&p);      GetCursorPos (&p);
352      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
353      DestroyMenu (hm);      DestroyMenu (hm);
354  } /* do_create_minpopup */  }
355    
356    
357    /* Reload the key cache if requested. */
358  static void  static void
359  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)
360  {  {
361      gpg_keycache_t cache;      gpg_keycache_t cache;
362    
363      if( keycache_get_reload( ) ) {      if (keycache_get_reload ()) {
364          keycache_reload( dlg );          keycache_reload (dlg);
365          keycache_set_reload( 0 );          keycache_set_reload (0);
366          cache = keycache_get_ctx( 1 );          cache = keycache_get_ctx (1);
367          if( !cache )          if (!cache)
368              BUG( dlg );              BUG (dlg);
369          keylist_reload( lv, cache, KEYLIST_LIST, KEY_SORT_USERID );          keylist_reload (lv, cache, KEYLIST_LIST, KEY_SORT_USERID);
370          km_update_status_bar (sb, lv);          km_update_status_bar (sb, lv);
371      }      }
372  } /* do_check_cache */  }
373    
374    
375  long CALLBACK  long CALLBACK
376  separator_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )  separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
377  {  {
378      static POINT last_mouse_pos;      static POINT last_mouse_pos;
379      RECT rect;  
       
380      if (msg == WM_CREATE)      if (msg == WM_CREATE)
381          SetWindowLong (hwnd, GWL_USERDATA, (long)(((CREATESTRUCT*)lparam)->lpCreateParams));          SetWindowLong (hwnd, GWL_USERDATA,
382                           (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
383    
384      switch (msg) {      switch (msg) {
385      case WM_PAINT:      case WM_PAINT:
386          PAINTSTRUCT ps;          PAINTSTRUCT ps;
387            RECT rect;
388          HPEN hpen;          HPEN hpen;
389    
390          GetClientRect (hwnd, &rect);          GetClientRect (hwnd, &rect);
391          BeginPaint (hwnd, &ps);          BeginPaint (hwnd, &ps);
392    
393          // Background          /* Background */
394          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
395    
396          // The lines from the light into the dark          /* The lines from the light into the dark */
397          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx(ps.hdc, 0,0, NULL);
398          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {
399              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
400              LineTo(ps.hdc, rect.right, 0);              LineTo (ps.hdc, rect.right, 0);
401              DeleteObject(hpen);              DeleteObject (hpen);
402          }          }
403          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx(ps.hdc, 0, 1, NULL);
404          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {
405               SelectObject(ps.hdc, (LPVOID)hpen);               SelectObject (ps.hdc, (LPVOID)hpen);
406               LineTo(ps.hdc, rect.right, rect.bottom);               LineTo (ps.hdc, rect.right, rect.bottom);
407               DeleteObject(hpen);               DeleteObject (hpen);
408           }           }
409    
410          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
411          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {
412              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
413              LineTo(ps.hdc, rect.right, rect.bottom-1);              LineTo (ps.hdc, rect.right, rect.bottom-1);
414              DeleteObject(hpen);              DeleteObject (hpen);
415          }          }
416          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx(ps.hdc, 0, rect.bottom, NULL);
417          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
418              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
419              LineTo(ps.hdc, rect.right, rect.bottom);              LineTo (ps.hdc, rect.right, rect.bottom);
420              DeleteObject(hpen);              DeleteObject (hpen);
421          }          }
422    
423          EndPaint (hwnd, &ps);          EndPaint (hwnd, &ps);
424          return 0;          return 0;
425    
426      case WM_LBUTTONDOWN:      case WM_LBUTTONDOWN:
427          last_mouse_pos.x = LOWORD(lparam);          last_mouse_pos.x = LOWORD (lparam);
428          last_mouse_pos.y = HIWORD(lparam);          last_mouse_pos.y = HIWORD (lparam);
429          ClientToScreen (hwnd, &last_mouse_pos);          ClientToScreen (hwnd, &last_mouse_pos);
430          SetCapture (hwnd);          SetCapture (hwnd);
431          return 0;          return 0;
# Line 414  separator_wnd_proc( HWND hwnd, UINT msg, Line 438  separator_wnd_proc( HWND hwnd, UINT msg,
438          if (wparam == MK_LBUTTON) {          if (wparam == MK_LBUTTON) {
439              struct km_info *kmi;              struct km_info *kmi;
440              POINT p;              POINT p;
441                RECT r;
442    
443              if ((kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA)) == NULL)              kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA);
444                if (kmi == NULL)
445                  break;                  break;
446    
447              // Calculate mouse movement              /* Calculate mouse movement */
448              p.x = LOWORD(lparam);              p.x = LOWORD(lparam);
449              p.y = HIWORD(lparam);              p.y = HIWORD(lparam);
450              ClientToScreen (hwnd, &p);              ClientToScreen (hwnd, &p);
451    
452              GetWindowRect (hwnd, &rect);              GetWindowRect (hwnd, &r);
453              rect.top += (short)(p.y - last_mouse_pos.y);              r.top += (short)(p.y - last_mouse_pos.y);
454              rect.bottom += (short)(p.y - last_mouse_pos.y);              r.bottom += (short)(p.y - last_mouse_pos.y);
455    
456              last_mouse_pos.y = p.y;              last_mouse_pos.y = p.y;
457    
458              // Apply mouse movement to window. Beware the MoveWindow is relaive              /* Apply mouse movement to window. Beware the MoveWindow is relaive
459              // to parent NOT screen                 to parent NOT screen */
460              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&rect, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
461              kmi->ypos_sep = rect.top;              kmi->ypos_sep = r.top;
462              kmi->ypercent_sep = 0; // This forces do_resize_window to use abs. position              kmi->ypercent_sep = 0; /* This forces do_resize_window to use abs. position */
463              do_resize_window (GetParent(hwnd), kmi);              do_resize_window (GetParent(hwnd), kmi);
464              return 0;              return 0;
465          }          }
# Line 443  separator_wnd_proc( HWND hwnd, UINT msg, Line 469  separator_wnd_proc( HWND hwnd, UINT msg,
469  }  }
470    
471    
472    /* Register the separator window with @dlg as the parent window. */
473  static HWND  static HWND
474  regist_sep_wnd (HWND dlg, struct km_info * kmi)  regist_sep_wnd (HWND dlg, struct km_info * kmi)
475  {  {
# Line 466  regist_sep_wnd (HWND dlg, struct km_info Line 493  regist_sep_wnd (HWND dlg, struct km_info
493                          0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);                              0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);    
494      ShowWindow (h, SW_SHOW);      ShowWindow (h, SW_SHOW);
495      return h;      return h;
496  } /* regist_sep_wnd */  }
   
497    
498    
499  #define enable_button(hwnd, cid) \  #define enable_button(hwnd, cid) \
# Line 486  update_ui_items (HWND hwnd, listview_ctr Line 512  update_ui_items (HWND hwnd, listview_ctr
512      int key_has_sec = 0;      int key_has_sec = 0;
513      int key_inv = 0;      int key_inv = 0;
514      int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,      int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
515                           ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};                           ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
516      int i;      int i;
517            
518      /* Get some states */      /* Get some states */
# Line 497  update_ui_items (HWND hwnd, listview_ctr Line 523  update_ui_items (HWND hwnd, listview_ctr
523      if (key_selected) {      if (key_selected) {
524          i = listview_get_curr_pos (lv);          i = listview_get_curr_pos (lv);
525          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
526          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED;          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
527                      km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
528      }      }
529    
530      /* Enable / disable toolbar buttons */      /* Enable / disable toolbar buttons */
# Line 517  update_ui_items (HWND hwnd, listview_ctr Line 544  update_ui_items (HWND hwnd, listview_ctr
544      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
545      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);
546      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);
547        
548      /* Disable some menu items when multiple keys are selected. */      /* Disable some menu items when multiple keys are selected. */
549      if (listview_count_items (lv, 1) > 1) {      if (listview_count_items (lv, 1) > 1) {
550          for (i=0; mult_resids[i] != 0; i++)          for (i=0; mult_resids[i] != 0; i++)
551              set_menu_state (hmenu, mult_resids[i], MF_GRAYED);              set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
552      }          }
553  }  }
554    
555    
556  /* Disable some context menu items when multiple keys are selected. */  /* Disable some context menu items when multiple keys are selected. */
557  static void  static void
558  popup_multiple (HWND dlg, HMENU hm)  popup_multiple (HWND dlg, HMENU hm)
# Line 533  popup_multiple (HWND dlg, HMENU hm) Line 561  popup_multiple (HWND dlg, HMENU hm)
561          ID_KEYCTX_EDIT,          ID_KEYCTX_EDIT,
562          ID_KEYCTX_SIGN,          ID_KEYCTX_SIGN,
563          ID_KEYCTX_REV,          ID_KEYCTX_REV,
564          ID_KEYCTX_ENABLE,          ID_KEYCTX_ENABLE,
565          ID_KEYCTX_DISABLE,          ID_KEYCTX_DISABLE,
566          ID_KEYCTX_ADDKEY,          ID_KEYCTX_ADDKEY,
567          ID_KEYCTX_ADDPHOTO,          ID_KEYCTX_ADDPHOTO,
568          ID_KEYCTX_ADDUID,          ID_KEYCTX_ADDUID,
569          ID_KEYCTX_ADDREV,          ID_KEYCTX_ADDREV,
570          ID_KEYCTX_LISTSIGS,          ID_KEYCTX_LISTSIGS,
571          ID_KEYCTX_MAXTRUST,          ID_KEYCTX_MAXTRUST,
572          ID_KEYCTX_PROPS,          ID_KEYCTX_PROPS,
573          ID_KEYCTX_SENDMAIL,          ID_KEYCTX_SENDMAIL,
574          0          0};
     };  
575      int i;      int i;
576      for (i=0; i < resids[i] != 0; i++)      for (i=0; i < resids[i] != 0; i++)
577          set_menu_state (hm, resids[i], MF_GRAYED);          set_menu_state (hm, resids[i], MF_GRAYED);
578  }  }
579    
580    
581  /* The items which are shown when GPG is in read-only mode. */  /* The items which are shown when GPG is in read-only mode. */
582  static void  static void
# Line 579  popup_gpg_readonly (HWND dlg, HMENU hm) Line 606  popup_gpg_readonly (HWND dlg, HMENU hm)
606  }  }
607    
608    
609    /* Change the 'Edit' menu based on the current state. */
610  static void  static void
611  menu_gpg_readonly (HWND dlg, HMENU hm, int id)  change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
612    {
613        int no_sel;
614    
615        if (id != 1 /*EDIT_MENU*/)
616            return;
617    
618        if (!clip_contains_pgpkey ())
619            set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
620        else
621            set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
622        no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
623        set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
624        set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
625    }
626    
627    
628    
629    /* Show limited key menu entries when GPG is in read-only mode. */
630    static void
631    change_key_menu (HMENU hm, int id)
632  {  {
633      int key_resids[] = {      int key_resids[] = {
634          ID_KEYMISC_SIGN,          ID_KEYMISC_SIGN,
# Line 611  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 659  menu_gpg_readonly (HWND dlg, HMENU hm, i
659      case 0: return;      case 0: return;
660      case 3: resids = key_resids; break;      case 3: resids = key_resids; break;
661      case 1: resids = edit_resids;break;      case 1: resids = edit_resids;break;
662      default: resids = edit_resids; return;      default:resids = edit_resids; break;
663      }      }
664    
665      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 619  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 667  menu_gpg_readonly (HWND dlg, HMENU hm, i
667  }  }
668    
669    
670    /* Return a user-friendly name for a key derrived from
671       name. If @is_secret is 1, a secret key name will be generated. */
672  static char*  static char*
673  gen_export_filename (const char *keyid, int is_secret)  gen_export_filename (const char *keyid, int is_secret)
674  {  {
# Line 643  gen_export_filename (const char *keyid, Line 693  gen_export_filename (const char *keyid,
693  }  }
694    
695    
696    /* Reload a single key in the cache. */
697  static void  static void
698  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)
699  {  {
# Line 663  update_key (listview_ctrl_t lv, int pos, Line 714  update_key (listview_ctrl_t lv, int pos,
714  static HWND  static HWND
715  setup_status_bar (HWND dlg, listview_ctrl_t lv)  setup_status_bar (HWND dlg, listview_ctrl_t lv)
716  {        {      
717      HWND statbar;          HWND statbar;
718      RECT r;      RECT r;
719      int partpos[3];      int partpos[3];
720      int i;      int i;
# Line 684  setup_status_bar (HWND dlg, listview_ctr Line 735  setup_status_bar (HWND dlg, listview_ctr
735  }  }
736    
737    
738    /* Dialog box procedure for the Key Manager. */
739  BOOL CALLBACK  BOOL CALLBACK
740  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
741  {  {
742      struct km_info *kmi;      struct km_info *kmi;
     /*static km_group_s *gc = NULL;*/  
743      static HMENU menu = NULL;      static HMENU menu = NULL;
744      static int refresh_keys = 0;          static int refresh_keys = 0;    
745      INITCOMMONCONTROLSEX icex;      INITCOMMONCONTROLSEX icex;
# Line 696  keymanager_dlg_proc (HWND dlg, UINT msg, Line 747  keymanager_dlg_proc (HWND dlg, UINT msg,
747      HMENU hm;      HMENU hm;
748      gpg_keycache_t c;      gpg_keycache_t c;
749      gpgme_key_t key;      gpgme_key_t key;
     /*km_group_cb_s gcb; XXX */  
750      struct genkey_s genkey;      struct genkey_s genkey;
751      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
752      struct URL_ctx_s *url;      struct URL_ctx_s *url;
753      refresh_cache_s rcs = {0};      refresh_cache_s rcs = {0};
754      char keyid[48], uid[128], type[32], *name;      char keyid[48], uid[128], type[32], *name;
755      const char *t, * host;      const char *t, *host;
756      u16 port = 0;      u16 port = 0;
757      int idx = 0, i=0, rc;      int l_idx = 0, i=0, rc;
758    
759      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
760          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
# Line 714  keymanager_dlg_proc (HWND dlg, UINT msg, Line 764  keymanager_dlg_proc (HWND dlg, UINT msg,
764      case WM_INITDIALOG:      case WM_INITDIALOG:
765          kmi = new struct km_info;          kmi = new struct km_info;
766          memset (kmi, 0, sizeof (struct km_info));          memset (kmi, 0, sizeof (struct km_info));
767            kmi->lv_idx = -1;
768          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
769          icex.dwICC  = ICC_BAR_CLASSES;          icex.dwICC  = ICC_BAR_CLASSES;
770          InitCommonControlsEx (&icex);          InitCommonControlsEx (&icex);
771          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
772          imagelist_load (dlg);          imagelist_load (dlg);
773            SetWindowText (dlg, _("Key Manager"));
774          SetWindowText( dlg, _("Key Manager") );          menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
         menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );  
775          set_menu_text_bypos (menu, 0, _("File"));          set_menu_text_bypos (menu, 0, _("File"));
776          set_menu_text_bypos (menu, 1, _("Edit"));          set_menu_text_bypos (menu, 1, _("Edit"));
777          set_menu_text_bypos (menu, 2, _("View"));          set_menu_text_bypos (menu, 2, _("View"));
778          set_menu_text_bypos (menu, 3, _("Key"));          set_menu_text_bypos (menu, 3, _("Key"));
779          set_menu_text_bypos (menu, 4, _("Groups"));          set_menu_text_bypos (menu, 4, _("Groups"));
           
780          set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));          set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
781          set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));          set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
782          set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */          set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
# Line 742  keymanager_dlg_proc (HWND dlg, UINT msg, Line 791  keymanager_dlg_proc (HWND dlg, UINT msg,
791          set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));          set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
792          set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));          set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
793          set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));          set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
794            set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
795          set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));          set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));
796          set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));          set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
797          set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));          set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
# Line 757  keymanager_dlg_proc (HWND dlg, UINT msg, Line 807  keymanager_dlg_proc (HWND dlg, UINT msg,
807          set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));          set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
808          set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );          set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
809          set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));          set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
810            
811            /* XXX: implement help code. */
812            set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
813            
814          SetMenu (dlg, menu);          SetMenu (dlg, menu);
815          if( keyring_check_last_access() )          if (keyring_check_last_access ())
816              keycache_set_reload( 1 );              keycache_set_reload (1);
817          if( keycache_get_reload( ) )          if (keycache_get_reload ())
818              keycache_reload( dlg );              keycache_reload (dlg);
819          c = keycache_get_ctx( KEYCACHE_PUB );          c = keycache_get_ctx (KEYCACHE_PUB);
820          if( !c )          if (!c)
821              BUG( NULL );              BUG (NULL);
822          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
823          Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),          Header_SetImageList(ListView_GetHeader (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST)),
824                              glob_imagelist);                              glob_imagelist);
825          kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
826                                  NULL, KEYLIST_LIST, kmi->keylist_sortby );                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
827          /* init subclassing for the listview */          /* init subclassing for the listview */
828          kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );          kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
829          keylist_proc.dlg = dlg;          keylist_proc.dlg = dlg;
830          keylist_proc.current = (WNDPROC)keylist_subclass_proc;          keylist_proc.current = (WNDPROC)keylist_subclass_proc;
831          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );
832          if( keylist_proc.old ) {          if (keylist_proc.old) {
833              if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {              if( !SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
834                  msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("Could not set keylist window procedure."),
835                  BUG( NULL );                           _("Key Manager"), MB_ERR);
836                    BUG (NULL);
837              }              }
838          }          }
839          #if 0          #if 0
840          km_groups_new( &gc, GetDlgItem( dlg, IDC_KEYMISC_GROUP ) );          km_groups_new (&gc, GetDlgItem (dlg, IDC_KEYMISC_GROUP));
841          km_groups_load( gc );          km_groups_load (gc);
842          #endif          #endif
         SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst, (LPCTSTR)IDI_WINPT));  
   
843          kmi->statbar = setup_status_bar (dlg, kmi->lv);          kmi->statbar = setup_status_bar (dlg, kmi->lv);
844          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
845          kmi->toolbar = load_toolbar (dlg, kmi);          kmi->toolbar = load_toolbar (dlg, kmi);
# Line 795  keymanager_dlg_proc (HWND dlg, UINT msg, Line 847  keymanager_dlg_proc (HWND dlg, UINT msg,
847          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
848          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
849          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
850            
851          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
852            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
853                          (LPCTSTR)IDI_WINPT));
854          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
855          return TRUE;          return TRUE;
856                    
# Line 804  keymanager_dlg_proc (HWND dlg, UINT msg, Line 858  keymanager_dlg_proc (HWND dlg, UINT msg,
858          if (kmi->lv) {          if (kmi->lv) {
859              keylist_delete (kmi->lv);              keylist_delete (kmi->lv);
860              kmi->lv = NULL;                    kmi->lv = NULL;      
861                    }
862           /*          imagelist_destroy ();
863           if (gc) {  
864              km_groups_release (gc);          ltoa (kmi->pos_x, type, 10);
865              gc = NULL;          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
866          }*/          ltoa (kmi->pos_y, type, 10);
867         imagelist_destroy ();          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
868            /* Remove runtime information. This should be the last action taken here. */
869         char buf[32];          delete kmi; kmi = NULL;
870         ltoa (kmi->pos_x, buf, 10);          SetWindowLong (dlg, GWL_USERDATA, 0);
871         set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );          keycache_set_reload (refresh_keys);
872         ltoa (kmi->pos_y, buf, 10);          return FALSE;
873         set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);  
874         /* Remove runtime information. This should be the last action taken here. */      case WM_MOVE:
        delete kmi; kmi = NULL;  
        SetWindowLong (dlg, GWL_USERDATA, 0);  
        keycache_set_reload (refresh_keys);  
        return FALSE;  
   
     case WM_MOVE:        
         /* kmi->pos_x = (int)(short)LOWORD(lparam);  
            kmi->pos_y = (int)(short)HIWORD(lparam); */  
875          RECT r;          RECT r;
876          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
877          kmi->pos_x = r.left;          kmi->pos_x = r.left;
# Line 838  keymanager_dlg_proc (HWND dlg, UINT msg, Line 884  keymanager_dlg_proc (HWND dlg, UINT msg,
884          break;          break;
885    
886      case WM_NOTIFY:                  case WM_NOTIFY:            
887          NMHDR * notify;          NMHDR *notify;
888          POINT p;          POINT p;
889          HMENU popup;          HMENU popup;
890                    
891          notify = (NMHDR *)lparam;          notify = (NMHDR *)lparam;
892          if (notify == NULL)          if (!notify)
893              break;              break;
894          switch (notify->code)          switch (notify->code) {
         {  
895          case TBN_QUERYDELETE:          case TBN_QUERYDELETE:
896              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
897              return TRUE;              return TRUE;
898                    
899          case TBN_QUERYINSERT:          case TBN_QUERYINSERT:
900              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
901              return TRUE;              return TRUE;
902    
903          case TBN_GETBUTTONINFO:          case TBN_GETBUTTONINFO:
# Line 921  keymanager_dlg_proc (HWND dlg, UINT msg, Line 966  keymanager_dlg_proc (HWND dlg, UINT msg,
966              return TRUE;              return TRUE;
967                            
968          case LVN_ITEMCHANGED:          case LVN_ITEMCHANGED:
969              if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */              if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
970              {                  kmi->lv_idx = listview_get_curr_pos (kmi->lv);
971                  update_ui_items (dlg, kmi->lv);                  update_ui_items (dlg, kmi->lv);
972                  return TRUE;                  return TRUE;
973              }              }
# Line 930  keymanager_dlg_proc (HWND dlg, UINT msg, Line 975  keymanager_dlg_proc (HWND dlg, UINT msg,
975    
976          case NM_RCLICK:          case NM_RCLICK:
977              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
978                  if (listview_get_curr_pos (kmi->lv) == -1)                  l_idx =listview_get_curr_pos (kmi->lv);
979                    if (l_idx == -1)
980                      return TRUE; /* Popup only when a item was selected */                      return TRUE; /* Popup only when a item was selected */
981                  do_check_cache (kmi->lv, dlg, kmi->statbar);                  do_check_cache (kmi->lv, dlg, kmi->statbar);
982                  GetCursorPos (&p);                  GetCursorPos (&p);
# Line 957  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1003  keymanager_dlg_proc (HWND dlg, UINT msg,
1003                  set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));                  set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
1004                  set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));                  set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
1005                  set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));                  set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
1006                  /* change popup texts */  
                 set_menu_text_bypos (popup, 0, _("Key Attributes"));  
                 set_menu_text_bypos (popup, 6, _("Add"));  
                 set_menu_text_bypos (popup, 19, _("Send to Keyserver"));  
                   
1007                  set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));                  set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
1008                  set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));                  set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
1009                  set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));                  set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
1010                  set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));                  set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
1011                    
1012                  idx = listview_get_curr_pos (kmi->lv);                  /* change popup texts */
1013                  if (km_check_for_seckey (kmi->lv, idx, &i))                  set_menu_text_bypos (popup, 0, _("Key Attributes"));
1014                    set_menu_text_bypos (popup, 6, _("Add"));
1015                    set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
1016    
1017                    if (km_check_for_seckey (kmi->lv, l_idx, &i))
1018                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1019                  if (i == 0)                  if (i == 0)
1020                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1021                  if (!km_check_for_seckey (kmi->lv, idx, NULL)) {                  if (!km_check_for_seckey (kmi->lv, l_idx, NULL)) {
1022                      set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1023                      set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1024                      set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1025                      set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1026                      set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1027                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1028                  }                  }
1029                  else if( km_check_for_seckey (kmi->lv, idx, NULL)                  else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1030                        && km_key_is_v3 (kmi->lv, idx)) {                           km_key_is_v3 (kmi->lv, l_idx)) {
1031                      /* PGP 2 keys, version 3 have no no support for photo-id's,                      /* PGP 2 keys, version 3 have no no support for photo-id's,
1032                         designated revokers and secondary keys. */                         designated revokers and secondary keys. */
1033                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1034                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1035                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1036                  }                  }
1037                  if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )                  if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1038                      set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1039                  else                  else
1040                      set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1041                  if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)                  if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1042                        km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1043                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1044                  if (mapi_init())                  if (!clip_contains_pgpkey ())
1045                        set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1046                    if (mapi_init ())
1047                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1048                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1049                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
1050                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1051                  popup_gpg_readonly (dlg, popup);                  popup_gpg_readonly (dlg, popup);
1052                  if (listview_count_items (kmi->lv, 1) > 1)                  if (listview_count_items (kmi->lv, 1) > 1)
1053                      popup_multiple (dlg, popup);                                      popup_multiple (dlg, popup);
1054                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1055                  DestroyMenu (popup);                  DestroyMenu (popup);
1056                  DestroyMenu (hm);                  DestroyMenu (hm);
# Line 1013  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1062  keymanager_dlg_proc (HWND dlg, UINT msg,
1062                  if( TreeView_GetSelection( tree ) ) {                  if( TreeView_GetSelection( tree ) ) {
1063                      GetCursorPos( &p );                      GetCursorPos( &p );
1064                      hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );                      hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );
1065                      popup = GetSubMenu( hm, 0 );                      popup = GetSubMenu (hm, 0);
1066                      if( km_index == -1 )                      if (km_index == -1) /* XXX */
1067                          set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );                          set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );
1068                      set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );                      set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );
1069                      set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );                      set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );
# Line 1029  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1078  keymanager_dlg_proc (HWND dlg, UINT msg,
1078    
1079          case LVN_COLUMNCLICK:          case LVN_COLUMNCLICK:
1080              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1081                  NMLISTVIEW * nml = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1082                  int sortby = 0;                  int sortby = 0;
1083                  switch (nml->iSubItem) {                  switch (nft->iSubItem) {
1084                  case 0:  sortby = KEY_SORT_USERID; break;                  case 0:  sortby = KEY_SORT_USERID; break;
1085                  case 1:  sortby = KEY_SORT_KEYID; break;                  case 1:  sortby = KEY_SORT_KEYID; break;
1086                  case 2:  sortby = KEY_SORT_IS_SECRET; break;                  case 2:  sortby = KEY_SORT_IS_SECRET; break;
# Line 1053  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1102  keymanager_dlg_proc (HWND dlg, UINT msg,
1102              break;              break;
1103          }          }
1104          break;          break;
         }  
1105    
1106      case WM_WINDOWPOSCHANGING:      case WM_WINDOWPOSCHANGING:
1107          if (((WINDOWPOS*)lparam)->cx < 400)          if (((WINDOWPOS*)lparam)->cx < 400)
# Line 1067  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1115  keymanager_dlg_proc (HWND dlg, UINT msg,
1115          return TRUE;          return TRUE;
1116                    
1117      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
1118          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
1119              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1120          return FALSE;          return FALSE;
1121                    
1122      case WM_MENUSELECT:      case WM_MENUSELECT:
1123          menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));          change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1124            change_key_menu ((HMENU)lparam, LOWORD (wparam));
1125          break;          break;
1126    
1127      case WM_INITMENUPOPUP:      case WM_INITMENUPOPUP:
1128          if ((UINT)LOWORD (lparam) == 3) {          if ((UINT)LOWORD (lparam) == 3) {
1129              HMENU m = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1130              set_menu_text_bypos (m, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1131          }          }
1132          return FALSE;          return FALSE;
1133    
1134      case WM_COMMAND:      case WM_COMMAND:
1135            /* Allow at least 'Exit' in such a case. */
1136          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1137              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );              msg_box (dlg, _("Could not access public keyring"),
1138                         _("Key Manager"), MB_ERR);
1139              return FALSE;              return FALSE;
1140          }          }
1141          do_check_cache( kmi->lv, dlg, kmi->statbar );          do_check_cache (kmi->lv, dlg, kmi->statbar);
1142          switch( LOWORD( wparam ) ) {          switch( LOWORD (wparam)) {
1143          case ID_KEYMISC_QUIT:          case ID_KEYMISC_QUIT:
1144              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1145              return TRUE;              return TRUE;
1146                            
1147          case ID_KEYMISC_MAIL:          case ID_KEYMISC_MAIL:
# Line 1104  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1155  keymanager_dlg_proc (HWND dlg, UINT msg,
1155              break;              break;
1156    
1157          case ID_KEYMISC_DELETE:          case ID_KEYMISC_DELETE:
1158              km_delete_keys (kmi->lv, dlg);          case ID_KEYMISC_DELETE2:
1159                if (!km_delete_keys (kmi->lv, dlg))
1160                    km_update_status_bar (kmi->statbar, kmi->lv);
1161              return TRUE;              return TRUE;
1162                            
1163          case ID_KEYMISC_SIGN:                  case ID_KEYMISC_SIGN:
1164              if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {              if (kmi->lv_idx == -1) {
1165                  msg_box( dlg, _("Please select a key."),  _("Key Manager"),                  msg_box (dlg, _("Please select a key."),  
1166                           MB_ERR );                           _("Key Manager"), MB_ERR);
1167                  return TRUE;;                  return TRUE;;
1168              }              }
1169              if (km_check_key_status (kmi->lv, idx))              if (km_check_key_status (kmi->lv, kmi->lv_idx))
1170                  return TRUE;                  return TRUE;
1171              key = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1172              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1173              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1174              k.ctx = key;              k.ctx = key;
1175              k.keyid = keyid;              k.keyid = keyid;
# Line 1124  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1177  keymanager_dlg_proc (HWND dlg, UINT msg,
1177                                keysign_dlg_proc, (LPARAM)&k,                                keysign_dlg_proc, (LPARAM)&k,
1178                                _("Key Signing"), IDS_WINPT_KEYSIGN);                                _("Key Signing"), IDS_WINPT_KEYSIGN);
1179              if (k.update)              if (k.update)
1180                  update_key (kmi->lv, idx, k.keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 0);
1181              return TRUE;              return TRUE;
1182                            
1183          case ID_KEYMISC_REVCERT:          case ID_KEYMISC_REVCERT:
1184              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1185              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1186                  return TRUE;                  return TRUE;
1187              }              }
1188              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              listview_get_item_text (kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1);
1189              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof keyid-1);
1190              if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if ( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1191                  msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("There is no secret key available!"),
1192                            _("Key Manager"), MB_ERR);
1193                  return TRUE;                  return TRUE;
1194              }              }
1195                            
1196              {              {
1197                  char rinf[128];                  char state[64];
1198                  listview_get_item_text (kmi->lv, idx, 5, rinf, sizeof (rinf) -1);                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1199                  if (strchr (rinf, 'R')) {                                          state, sizeof (state) -1);
1200                    if( strchr (state, 'R' )) {
1201                      msg_box (dlg, _("Key already revoked!"),                      msg_box (dlg, _("Key already revoked!"),
1202                               _("Key Manager"), MB_INFO);                               _("Key Manager"), MB_INFO);
1203                      return TRUE;                      return TRUE;
# Line 1153  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1207  keymanager_dlg_proc (HWND dlg, UINT msg,
1207              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1208              k.key_pair = 1;              k.key_pair = 1;
1209              k.keyid = keyid;              k.keyid = keyid;
1210              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1211              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1212                               key_revoke_dlg_proc, (LPARAM)&k,                               key_revoke_dlg_proc, (LPARAM)&k,
1213                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);
1214              return TRUE;              return TRUE;
1215                            
1216          case ID_KEYMISC_TRUSTPATH:          case ID_KEYMISC_TRUSTPATH:
1217              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1218              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1219                  return TRUE;                  return TRUE;
1220              }              }
1221              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid -1 );
1222              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );              listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, sizeof keyid -1 );
1223              if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1224                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );
1225                  return FALSE;                  return TRUE;
1226              }              }
1227              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1228              k.keyid = keyid;              k.keyid = keyid;
# Line 1179  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1232  keymanager_dlg_proc (HWND dlg, UINT msg,
1232                                _("List Trust Path"), IDS_WINPT_KEYTRUST );                                _("List Trust Path"), IDS_WINPT_KEYTRUST );
1233              return TRUE;              return TRUE;
1234                            
1235          case ID_KEYMISC_CHECKSIGS:          case ID_KEYMISC_CHECKSIGS:          
1236              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1237              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1238                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1239              }              }
1240              listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 0, uid, DIM (uid)-1);
1241              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1242              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1243              k.keyid = keyid;              k.keyid = keyid;
1244              k.uid = uid;              k.uid = uid;
1245              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1246              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
1247                                keysig_dlg_proc, (LPARAM)&k,                                keysig_dlg_proc, (LPARAM)&k,
1248                                _("Key Signature List" ), IDS_WINPT_KEYSIG);                                _("Key Signature List" ), IDS_WINPT_KEYSIG);
1249              return TRUE;              return TRUE;
1250                            
1251          case ID_KEYMISC_PROPS:          case ID_KEYMISC_PROPS:      
1252              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
             if( idx == -1 ) {  
1253                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1254                  return FALSE;                  return TRUE;
1255              }              }
1256              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1257              listview_get_item_text (kmi->lv, idx, 2, type, DIM (type)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 2, type, DIM (type)-1);
1258              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1259              k.key_pair = 0;              k.key_pair = 0;
1260              k.keyid = keyid;              k.keyid = keyid;
1261              if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )              if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )
1262                  k.key_pair = 1;                  k.key_pair = 1;
1263              k.callback.ctl = kmi->lv;              k.callback.ctl = kmi->lv;
1264              k.callback.idx = idx;              k.callback.idx = kmi->lv_idx;
1265              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1266              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1267                                keyprops_dlg_proc, (LPARAM)&k,                                keyprops_dlg_proc, (LPARAM)&k,
1268                                _("Key Properties"), IDS_WINPT_KEYPROPS );                                _("Key Properties"), IDS_WINPT_KEYPROPS );
1269              if (k.callback.new_val != 0) {              if (k.callback.new_val != 0) {
1270                  t = get_key_trust_str (k.callback.new_val);                  t = get_key_trust_str (k.callback.new_val);
1271                  listview_add_sub_item (kmi->lv, idx, 6, t);                  listview_add_sub_item (kmi->lv, kmi->lv_idx, 6, t);
1272              }              }
1273              return TRUE;              return TRUE;
1274                            
1275          case ID_KEYMISC_RECACHE:          case ID_KEYMISC_RECACHE:
1276              /* If there is already a reload request, don't bother the user with a message. */              /* If there is already a reload request, don't bother the user with a message. */
1277              if (keycache_get_reload () == 1)              if (keycache_get_reload() == 1)
1278                  idx = IDYES;                  l_idx = IDYES;
1279              else {              else {
1280                  char inf[256];                  char inf[256];
1281                  _snprintf (inf, sizeof (inf) -1,                  _snprintf (inf, sizeof (inf) -1,
1282                             _("This is only useful when the keyring has been "                             _("This is only useful when the keyring has been "
1283                               "modified (sign a key...).\n"                               "modified (sign a key...).\n"
1284                               "Do you really want to reload the keycache?"));                               "Do you really want to reload the keycache?"));
1285                  idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);                  l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
1286              }              }
1287              if( idx == IDYES ) {              if (l_idx == IDYES) {
1288                  rcs.kr_reload = rcs.kr_update = 1;                  rcs.kr_reload = rcs.kr_update = 1;
1289                  rcs.tr_update = 0;                  rcs.tr_update = 0;
1290                  DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,                  DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1291                                  keycache_dlg_proc, (LPARAM)&rcs );                                  keycache_dlg_proc, (LPARAM)&rcs);
1292                  c = keycache_get_ctx( 1 );                  c = keycache_get_ctx (1);
1293                  if( !c )                  if (!c)
1294                      BUG( dlg );                      BUG (dlg);
1295                  keylist_reload( kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID );                  keylist_reload (kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID);
1296                  refresh_keys = 0;                  refresh_keys = 0;
1297              }              }
1298              return TRUE;              return TRUE;
1299                            
1300          case ID_KEYMISC_REBUILD:          case ID_KEYMISC_REBUILD:
1301              name=NULL;              name = NULL;
1302              gpg_rebuild_cache (&name);              gpg_rebuild_cache (&name);
1303              if (name) {              if (name != NULL) {
1304                  char *p = strchr (name, '\n');                  char *line = strchr (name, '\n');
1305                  show_msg (dlg, 2000, p? name + (p-name)+1 : name);                  show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1306                  free (name);                  safe_free (name);
1307              }              }
1308              return TRUE;              return TRUE;
1309                            
1310          case ID_KEYMISC_NEWKEY:          case ID_KEYMISC_NEWKEY:
1311              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1312              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1313                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1314                                IDS_WINPT_KEYGEN);                                IDS_WINPT_KEYGEN);
1315              if (genkey.newkey != NULL) {              if (genkey.newkey != NULL) {
1316                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
# Line 1268  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1319  keymanager_dlg_proc (HWND dlg, UINT msg,
1319              return TRUE;              return TRUE;
1320    
1321          case ID_KEYMISC_CARDNEW:          case ID_KEYMISC_CARDNEW:
1322              if( !scard_support ) {              if (!scard_support) {
1323                  msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );                  msg_box (dlg, _("Smart Card support is not available."),
1324                             _("Key Manager"), MB_INFO);
1325                  return TRUE;                  return TRUE;
1326              }              }
1327              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1328                                card_keygen_dlg_proc, 0, _("Card Key Generation"),                                card_keygen_dlg_proc, 0, _("Card Key Generation"),
1329                                IDS_WINPT_CARD_KEYGEN );                                IDS_WINPT_CARD_KEYGEN);
1330              /* XXX: use new code */              /* XXX: use new code */
1331              if( keycache_get_reload() )              if (keycache_get_reload ())
1332                  send_cmd_id( dlg, ID_KEYMISC_RECACHE );                  send_cmd_id (dlg, ID_KEYMISC_RECACHE);
1333              return TRUE;              return TRUE;
1334    
1335          case ID_KEYMISC_KEYWIZARD:          case ID_KEYMISC_KEYWIZARD:
1336              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1337              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1338                                keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),                                keygen_wizard_dlg_proc, (LPARAM)&genkey,
1339                                  _("Key Generation Wizard"),
1340                                IDS_WINPT_KEYWIZARD);                                IDS_WINPT_KEYWIZARD);
1341              if (genkey.newkey != NULL) {              if (genkey.newkey != NULL) {
1342                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
# Line 1293  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1346  keymanager_dlg_proc (HWND dlg, UINT msg,
1346                            
1347          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1348              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1349              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1350                                keyserver_dlg_proc, (LPARAM)&genkey,                                keyserver_dlg_proc, (LPARAM)&genkey, _("Keyserver Access"),
1351                                _("Keyserver Access"), IDS_WINPT_KEYSERVER);                                IDS_WINPT_KEYSERVER);
1352              if (genkey.newkey != NULL) {              if (genkey.newkey != NULL) {
1353                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1354                  keylist_sort (kmi->lv, KEY_SORT_USERID);                  keylist_sort (kmi->lv, KEY_SORT_USERID);
# Line 1328  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1381  keymanager_dlg_proc (HWND dlg, UINT msg,
1381              break;              break;
1382                            
1383          case ID_KEYMISC_EXPORT:          case ID_KEYMISC_EXPORT:
1384              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
             if (idx == -1) {  
1385                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1386                  return TRUE;                  return TRUE;
1387              }              }
1388              if (listview_count_items (kmi->lv, 1) > 1)              if (listview_count_items (kmi->lv, 1) > 1)
1389                  name = m_strdup ("Exported_GPG_Keys.asc");                  name = m_strdup ("Exported_GPG_Keys.asc");
1390              else {              else {
1391                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1392                  name = gen_export_filename (keyid, 0);                  name = gen_export_filename (keyid, 0);
1393              }              }
1394              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
# Line 1347  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1399  keymanager_dlg_proc (HWND dlg, UINT msg,
1399              return TRUE;              return TRUE;
1400                            
1401          case ID_KEYMISC_EXPORT_PRIVKEY:          case ID_KEYMISC_EXPORT_PRIVKEY:
1402              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1403              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1404                  return TRUE;                  return TRUE;
1405              }              }
1406              if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1407                  msg_box( dlg, _("There is no corresponding secret key for this key."),                  msg_box (dlg, _("There is no corresponding secret key for this key."),
1408                          _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1409                  return TRUE;                  return TRUE;
1410              }              }
1411              if( listview_count_items( kmi->lv, 1 ) > 1 ) {              if (listview_count_items (kmi->lv, 1) > 1) {
1412                  msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("You can only export one secret key."),
1413                             _("Key Manager"), MB_ERR);
1414                  return TRUE;                  return TRUE;
1415              }              }
1416              idx = msg_box( dlg,              i = msg_box (dlg,
1417                            _("This operation will export your *SECRET* key!\n\n"                            _("This operation will export your *SECRET* key!\n\n"
1418                              "Never send this key to ANYONE, it should be available\n"                              "Never send this key to ANYONE, it should be available\n"
1419                              "ONLY on your machine and you may use this function\n"                              "ONLY on your machine and you may use this function\n"
1420                              "to copy the key to a safe place.\n\n"                              "to copy the key to a safe place.\n\n"
1421                              "Do you really want to export the key?"),                              "Do you really want to export the key?"),
1422                            _("WARNING"), MB_INFO|MB_YESNO );                            _("WARNING"), MB_INFO|MB_YESNO);
1423              if( idx == IDYES ) {              if( i == IDYES ) {
1424                  idx = listview_get_curr_pos( kmi->lv );                  listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-8 );
                 listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );  
1425                  name = gen_export_filename (keyid, 1);                  name = gen_export_filename (keyid, 1);
1426                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1427                  if (t != NULL)                            if (t != NULL)          
1428                      km_privkey_export (dlg, kmi->lv, t);                      km_privkey_export (dlg, kmi->lv, t);
1429              }              }
1430              return TRUE;              return TRUE;
1431    
1432          case ID_KEYMISC_INFO:          case ID_KEYMISC_INFO:
1433              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1434                                about_winpt_dlg_proc, 0, _("About WinPT"),                                about_winpt_dlg_proc, 0, _("About WinPT"),
1435                                IDS_WINPT_ABOUT );                                IDS_WINPT_ABOUT);
1436              break;              break;
1437    
1438          case ID_KEYMISC_HELP:          case ID_KEYMISC_HELP:
# Line 1394  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1445  keymanager_dlg_proc (HWND dlg, UINT msg,
1445                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );
1446              break;              break;
1447    
1448          case ID_KEYMISC_EDITKEY:          case ID_KEYMISC_EDITKEY:          
1449              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1)
             if (idx == -1)  
1450                  break;                  break;
1451              listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-1);
1452              /* XXX: pub/crd = secret key does not work */              /* XXX: pub/crd = secret key does not work */
1453              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1454              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1455              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1456              k.keyid = keyid;              k.keyid = keyid;
1457              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1458              k.flags = km_get_key_status (kmi->lv, idx);              k.flags = km_get_key_status (kmi->lv, kmi->lv_idx);
1459              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1460                                keyedit_main_dlg_proc, (LPARAM)&k,                                keyedit_main_dlg_proc, (LPARAM)&k,
1461                                _("Key Edit"), IDS_KEYCTX_EDIT);                                _("Key Edit"), IDS_KEYCTX_EDIT);
1462              if (k.update)              if (k.update)
1463                  update_key (kmi->lv,  idx, keyid, 1);                  update_key (kmi->lv,  kmi->lv_idx, keyid, 1);
1464              break;              break;
1465                            
1466          case ID_KEYMISC_COPY:          case ID_KEYMISC_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1467              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1468              break;              break;
1469                            
# Line 1423  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1472  keymanager_dlg_proc (HWND dlg, UINT msg,
1472              break;              break;
1473    
1474          case ID_KEYMISC_PASTE:          case ID_KEYMISC_PASTE:
             km_index = -1;  
1475              km_clip_import (dlg);              km_clip_import (dlg);
1476              break;              break;
1477                            
1478          case ID_KEYCTX_SETPREFKS:          case ID_KEYCTX_SETPREFKS:
1479              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM(keyid)-1);
1480              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1481              k.keyid = keyid;              k.keyid = keyid;
1482              keyedit_set_pref_keyserver (&k, dlg);              keyedit_set_pref_keyserver (&k, dlg);
# Line 1477  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1525  keymanager_dlg_proc (HWND dlg, UINT msg,
1525              break;              break;
1526    
1527          case ID_KEYCTX_ADDKEY:          case ID_KEYCTX_ADDKEY:
1528              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1529              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1530              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1531              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1532              k.keyid = keyid;              k.keyid = keyid;
1533              keyedit_add_subkey (&k, dlg, NULL);              keyedit_add_subkey (&k, dlg, NULL);
1534              if (k.update)              if (k.update)
1535                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1536              break;              break;
1537    
1538          case ID_KEYCTX_ADDUID:          case ID_KEYCTX_ADDUID:
1539              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1540              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1541              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1542              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1543              k.keyid = keyid;              k.keyid = keyid;
1544              keyedit_add_userid (&k, dlg, NULL);              keyedit_add_userid (&k, dlg, NULL);
1545              if (k.update)              if (k.update)
1546                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1547              break;              break;
1548    
1549          case ID_KEYCTX_ADDREV:          case ID_KEYCTX_ADDREV:
1550              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1551              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1552              k.keyid = keyid;              k.keyid = keyid;
1553              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1554              k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );              k.key_pair = km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL );
1555              keyedit_add_revoker (&k, dlg);              keyedit_add_revoker (&k, dlg);
1556              if (k.update)              if (k.update)
1557                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1558              break;              break;
1559    
1560          case ID_KEYCTX_ADDPHOTO:          case ID_KEYCTX_ADDPHOTO:
1561              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1562              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1563              k.keyid = keyid;              k.keyid = keyid;
1564              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1565              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1566              keyedit_add_photo (&k, dlg);              keyedit_add_photo (&k, dlg);
1567              if (k.update)              if (k.update)
1568                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1569              break;              break;
1570    
1571          case ID_KEYCTX_KS_NL:          case ID_KEYCTX_KS_NL:
# Line 1543  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1587  keymanager_dlg_proc (HWND dlg, UINT msg,
1587          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
1588              /* XXX: add generic function to support multiple selection              /* XXX: add generic function to support multiple selection
1589                      with a callback */                      with a callback */
1590              idx = listview_get_curr_pos( kmi->lv );              listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1 );
             listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );  
1591              set_clip_text( NULL, uid, strlen( uid ) );              set_clip_text( NULL, uid, strlen( uid ) );
1592              break;              break;
1593    
1594          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
1595              idx = listview_get_curr_pos( kmi->lv );              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1);
1596              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              set_clip_text (NULL, uid, strlen (uid));
             set_clip_text( NULL, uid, strlen( uid ) );  
1597              break;              break;
1598    
1599          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
1600              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);        
             key = (gpgme_key_t) listview_get_item2 (kmi->lv, idx);          
1601              if (key) {              if (key) {
1602                  const char * s = get_key_fpr (key);                  t = get_key_fpr (key);
1603                  set_clip_text (NULL, s? s : "", s? strlen (s): 0);                  set_clip_text (NULL, t? t : "", t? strlen (t): 0);
1604              }              }
1605              break;              break;
1606    
1607          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
1608              idx = listview_get_curr_pos( kmi->lv );              listview_get_item_text( kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1 );
             listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );  
1609              km_set_clip_info( uid );                      km_set_clip_info( uid );        
1610              break;              break;
1611    
1612          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1613              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1614              break;              break;
1615    
1616          case ID_KEYCTX_PASTE:            case ID_KEYCTX_PASTE:
             km_index = -1;  
1617              km_clip_import (dlg);              km_clip_import (dlg);
1618              break;              break;
1619    
1620          case ID_KEYCTX_DISABLE:          case ID_KEYCTX_DISABLE:
             idx = listview_get_curr_pos (kmi->lv);  
             km_enable_disable_key (kmi->lv, dlg, idx, 0);  
             break;  
   
1621          case ID_KEYCTX_ENABLE:          case ID_KEYCTX_ENABLE:
1622              idx = listview_get_curr_pos (kmi->lv);              i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
1623              km_enable_disable_key (kmi->lv, dlg, idx, 1);              listview_get_item_text (kmi->lv, kmi->lv_idx, KM_COL_KEYID,
1624                                        keyid, DIM (keyid)-1);
1625                rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
1626                if (!rc)
1627                    update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1628                /* XXX: switching a key from disabled -> enabled. does not
1629                   change the validity field in the KM. */
1630              break;              break;
1631    
1632          case ID_KEYCTX_LISTSIGS:          case ID_KEYCTX_LISTSIGS:
# Line 1594  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1634  keymanager_dlg_proc (HWND dlg, UINT msg,
1634              break;              break;
1635    
1636          case ID_KEYCTX_MAXTRUST:          case ID_KEYCTX_MAXTRUST:
1637              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1638              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
             rc = km_set_implicit_trust (dlg, kmi->lv, idx);  
1639              if (!rc)              if (!rc)
1640                  update_key (kmi->lv, idx, keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1641              break;              break;
1642    
1643          case ID_KEYCTX_SETDEFKEY:          case ID_KEYCTX_SETDEFKEY:
1644              idx = listview_get_curr_pos (kmi->lv);              if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
1645              if (!km_check_key_status (kmi->lv, idx)) {                  listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
                 listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1646                  rc = set_gnupg_default_key (keyid);                  rc = set_gnupg_default_key (keyid);
1647                  if (rc)                  if (rc)
1648                      msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);                      msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1649                  km_update_default_key_str (kmi->statbar);                  km_update_default_key_str (kmi->statbar);
1650              }              }
1651              break;              break;
1652    
         #if 0 /* XXX */  
1653          case ID_GROUP_NEW:          case ID_GROUP_NEW:
             memset (&gcb, 0, sizeof (gcb));  
             gcb.gc = gc;  
             dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GROUP, glob_hwnd,  
                              group_manager_dlg_proc, (LPARAM)&gcb, _("New Group"),  
                              IDS_WINPT_GROUP);  
             if( gcb.use_name )  
                 treeview_add_item( GetDlgItem(dlg, IDC_KEYMISC_GROUP), NULL, gcb.name );  
             return TRUE;  
               
1654          case ID_GROUP_PASTE:          case ID_GROUP_PASTE:
             km_groups_add (gc, kmi->lv, km_index);  
             break;  
               
1655          case ID_GROUP_DELETE:          case ID_GROUP_DELETE:
1656              km_groups_del (gc);              /* XXX: Implement group manager. */
1657              break;              return TRUE;
         #endif  
1658          }          }
1659                    
1660          break;          break;

Legend:
Removed from v.122  
changed lines
  Added in v.123

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26