/[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 36 by werner, Thu Oct 27 15:25:13 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
24    
25  #include <windows.h>  #include <windows.h>
 #include <windows.h>  
26  #include <commctrl.h>  #include <commctrl.h>
27    
28  #include "../resource.h"  #include "resource.h"
29  #include "wptTypes.h"  #include "wptTypes.h"
30  #include "wptGPG.h"  #include "wptGPG.h"
31  #include "wptCommonCtl.h"  #include "wptCommonCtl.h"
# Line 44  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 65  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 83  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 110  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 131  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 153  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 176  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 186  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. */
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 205  do_center_window (HWND dlg, struct km_in Line 204  do_center_window (HWND dlg, struct km_in
204    
205      kmi->ypos_sep = rect.bottom;      kmi->ypos_sep = rect.bottom;
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      }      }
213      else if( p )      else if (p)
214          pos_x = atol( p );          pos_x = atol (p);
215    
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)
223          pos_y = atol( p );          pos_y = atol (p);
224    
225      if( !pos_y && !pos_x ) {      if (!pos_y && !pos_x) {
226          center_window( dlg, NULL );          center_window (dlg, NULL);
227          return;          return;
228      }      }
229            
230      if( pos_x > GetSystemMetrics( SM_CXSCREEN )      if (pos_x < 0 || pos_y < 0)
231          || pos_y > GetSystemMetrics( SM_CYSCREEN ) ) {          pos_x = pos_y = 0;
232        if (pos_x > GetSystemMetrics (SM_CXSCREEN)
233            || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
234          pos_x = pos_y = 0;          pos_x = pos_y = 0;
235      }      }
236      GetClientRect( dlg, &rect );      GetClientRect (dlg, &rect);
237      MoveWindow( dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE );      MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);
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 260  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 310  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 327  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_complete_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    
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:
# Line 364  separator_wnd_proc( HWND hwnd, UINT msg, Line 390  separator_wnd_proc( HWND hwnd, UINT msg,
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 412  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 rect;              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 442  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 465  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 479  regist_sep_wnd (HWND dlg, struct km_info Line 506  regist_sep_wnd (HWND dlg, struct km_info
506  void  void
507  update_ui_items (HWND hwnd, listview_ctrl_t lv)  update_ui_items (HWND hwnd, listview_ctrl_t lv)
508  {  {
     int key_selected = 0, key_has_sec = 0;  
     int i, key_inv = 0;  
509      HWND hwnd_child;      HWND hwnd_child;
510      HMENU hmenu;      HMENU hmenu;
511        int key_selected = 0;
512        int key_has_sec = 0;
513        int key_inv = 0;
514        int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
515                             ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
516        int i;
517            
518      /* Get some states */      /* Get some states */
519      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
# Line 492  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 512  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. */
549        if (listview_count_items (lv, 1) > 1) {
550            for (i=0; mult_resids[i] != 0; i++)
551                set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
552        }
553    }
554    
555    
556    /* Disable some context menu items when multiple keys are selected. */
557    static void
558    popup_multiple (HWND dlg, HMENU hm)
559    {
560        int resids[] = {
561            ID_KEYCTX_EDIT,
562            ID_KEYCTX_SIGN,
563            ID_KEYCTX_REV,
564            ID_KEYCTX_ENABLE,
565            ID_KEYCTX_DISABLE,
566            ID_KEYCTX_ADDKEY,
567            ID_KEYCTX_ADDPHOTO,
568            ID_KEYCTX_ADDUID,
569            ID_KEYCTX_ADDREV,
570            ID_KEYCTX_LISTSIGS,
571            ID_KEYCTX_MAXTRUST,
572            ID_KEYCTX_PROPS,
573            ID_KEYCTX_SENDMAIL,
574            0};
575        int i;
576        for (i=0; i < resids[i] != 0; i++)
577            set_menu_state (hm, resids[i], MF_GRAYED);
578  }  }
579    
580    
# Line 543  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 565  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 649  menu_gpg_readonly (HWND dlg, HMENU hm, i
649          ID_KEYMISC_EDITKEY,          ID_KEYMISC_EDITKEY,
650          0          0
651      };      };
652      int * resids;      int *resids;
653      int i;      int i;
654    
655            
# Line 575  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; break;
663      }      }
664    
665      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 582  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 606  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 626  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 641  setup_status_bar (HWND dlg, listview_ctr Line 729  setup_status_bar (HWND dlg, listview_ctr
729      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
730    
731      km_update_default_key_str (statbar);      km_update_default_key_str (statbar);
732      km_complete_status_bar (statbar, lv);      km_update_status_bar (statbar, lv);
733    
734      return statbar;      return statbar;
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 659  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;
     size_t size = 0;  
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 678  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  #ifndef LANG_DE          menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
775          SetWindowText( dlg, _("Key Manager") );          set_menu_text_bypos (menu, 0, _("File"));
776  #endif                  set_menu_text_bypos (menu, 1, _("Edit"));
777          menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );          set_menu_text_bypos (menu, 2, _("View"));
778  #ifndef LANG_DE          set_menu_text_bypos (menu, 3, _("Key"));
779            set_menu_text_bypos (menu, 4, _("Groups"));
780            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 */
783          set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));          set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
# Line 702  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 718  keymanager_dlg_proc (HWND dlg, UINT msg, Line 808  keymanager_dlg_proc (HWND dlg, UINT msg,
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  #endif          /* 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));  
         SetForegroundWindow (dlg);  
   
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);
846    
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"));
852            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
853                          (LPCTSTR)IDI_WINPT));
854            SetForegroundWindow (dlg);
855          return TRUE;          return TRUE;
856                    
857      case WM_DESTROY:      case WM_DESTROY:
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, NULL);      
        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 798  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 881  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 890  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);
983                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
984                  popup = GetSubMenu (hm, 0);                  popup = GetSubMenu (hm, 0);
985              #ifndef LANG_DE  
986                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
987                  set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));                  set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
988                  set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));                  set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
# Line 917  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    
1007                    set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
1008                    set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
1009                    set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
1010                    set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
1011    
1012                  /* change popup texts */                  /* change popup texts */
1013                  set_menu_text_bypos (popup, 0, _("Key Attributes"));                  set_menu_text_bypos (popup, 0, _("Key Attributes"));
1014                  set_menu_text_bypos (popup, 6, _("Add"));                  set_menu_text_bypos (popup, 6, _("Add"));
1015                  set_menu_text_bypos (popup, 19, _("Send to Keyserver"));                  set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
1016              #endif  
1017                  idx = listview_get_curr_pos (kmi->lv);                  if (km_check_for_seckey (kmi->lv, l_idx, &i))
                 if (km_check_for_seckey (kmi->lv, 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)
1053                        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 966  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 982  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 * p = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1082                  int sortby = 0;                  int sortby = 0;
1083                  switch (p->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 1006  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 1020  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 hm = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1130              set_menu_text_bypos (hm, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1131          }          }
1132          return FALSE;          return FALSE;
1133    
1134      case WM_COMMAND:      case WM_COMMAND:
1135          if( gnupg_access_keyring( 1 ) ) {          /* Allow at least 'Exit' in such a case. */
1136              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1137                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 1057  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 1077  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 t[128];                  char state[64];
1198                  listview_get_item_text( kmi->lv, idx, 5, t, sizeof t -1 );                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1199                  if( strchr( t, 'R' ) ) {                                          state, sizeof (state) -1);
1200                      msg_box( dlg, _("Key already revoked!"), _("Key Manager"), MB_INFO );                  if( strchr (state, 'R' )) {
1201                        msg_box (dlg, _("Key already revoked!"),
1202                                 _("Key Manager"), MB_INFO);
1203                      return TRUE;                      return TRUE;
1204                  }                  }
1205              }              }
# Line 1105  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 1131  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 t[256];                  char inf[256];
1281                  _snprintf( t, sizeof t -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, t, _("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);
1317                    keylist_sort (kmi->lv, KEY_SORT_USERID);
1318                }
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, NULL, _("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);
1343                    keylist_sort (kmi->lv, KEY_SORT_USERID);
1344                }
1345              return TRUE;              return TRUE;
1346                            
1347          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1348              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,              memset (&genkey, 0, sizeof (genkey));
1349                                keyserver_dlg_proc, NULL, _("Keyserver Access"),              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1350                                IDS_WINPT_KEYSERVER );                                keyserver_dlg_proc, (LPARAM)&genkey, _("Keyserver Access"),
1351                                  IDS_WINPT_KEYSERVER);
1352                if (genkey.newkey != NULL) {
1353                    keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1354                    keylist_sort (kmi->lv, KEY_SORT_USERID);
1355                }
1356              return TRUE;              return TRUE;
1357                            
1358          case ID_KEYMISC_GPGPREFS:          case ID_KEYMISC_GPGPREFS:
1359              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,
1360                                gpgprefs_dlg_proc, NULL, _("GnuPG Preferences"),                                gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),
1361                                IDS_WINPT_GPGPREFS );                                IDS_WINPT_GPGPREFS );
1362              return TRUE;              return TRUE;
1363                            
1364          case ID_KEYMISC_GPGOPT:          case ID_KEYMISC_GPGOPT:
1365              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1366                                gpgopt_dlg_proc, NULL, _("GnuPG Options" ),                                gpgopt_dlg_proc, 0, _("GnuPG Options" ),
1367                                IDS_WINPT_GPGOPT );                                IDS_WINPT_GPGOPT );
1368              return TRUE;              return TRUE;
1369                            
1370          case ID_KEYMISC_IMPORT:          case ID_KEYMISC_IMPORT:
1371              t = get_filename_dlg (dlg, FILE_OPEN, _("Choose Name of the Key File"), NULL, NULL);              t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"), NULL, NULL);
1372              if (t)              if (t)
1373                  km_file_import (dlg, t);                  km_file_import (dlg, t);
1374              return TRUE;              return TRUE;
# Line 1271  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_filename_dlg (dlg, FILE_SAVE, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1395              free_if_alloc (name);              free_if_alloc (name);
1396              if (t == NULL)              if (t == NULL)
1397                  return TRUE;                  return TRUE;
# Line 1290  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_filename_dlg (dlg, FILE_SAVE, _("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              break;              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, NULL, _("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 1333  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1441  keymanager_dlg_proc (HWND dlg, UINT msg,
1441    
1442          case ID_KEYMISC_OT:          case ID_KEYMISC_OT:
1443              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,
1444                                ownertrust_dlg_proc, NULL,                                ownertrust_dlg_proc, 0,
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 1366  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 1420  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 1486  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 1537  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.36  
changed lines
  Added in v.123

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26