Add missing fiels for W32.
[gnupg.git] / agent / w32main.c
1 /* w32main.c - W32 main entry pint and taskbar support for the GnuPG Agent
2  * Copyright (C) 2007 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  * USA.
20  */
21
22 #include <config.h>
23 #ifndef HAVE_W32_SYSTEM
24 #error This module is only useful for the W32 version of gpg-agent
25 #endif
26
27 #include <stdlib.h>
28 #include <string.h>
29 #include <assert.h>
30 #include <windows.h>
31
32 #include "util.h"
33 #include "w32main.h"
34
35 /* The instance handle has received by WinMain.  */
36 static HINSTANCE glob_hinst;
37 static HWND glob_hwnd;
38
39
40 /* Our window message processing function.  */
41 static LRESULT CALLBACK 
42 wndw_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
43 {               
44
45   switch (msg)
46     {
47     case WM_USER:
48       fprintf (stderr,"%s: received WM_%s\n", __func__, "USER" );
49       break;
50
51     }
52
53   return DefWindowProc (hwnd, msg, wparam, lparam);
54 }
55
56
57 /* This function is called to do some fast event polling and
58    processing.  */
59 void
60 w32_poll_events (void)
61 {
62 /*   MSG msg; */
63
64 /*   fprintf (stderr,"%s: enter\n", __func__); */
65 /*   while (PeekMessage (&msg, glob_hwnd,  0, 0, PM_REMOVE))  */
66 /*     {  */
67 /*       DispatchMessage (&msg); */
68 /*     } */
69 /*   fprintf (stderr,"%s: leave\n", __func__); */
70 }
71
72
73
74 static void *
75 handle_taskbar (void *ctx)
76 {
77   WNDCLASS wndwclass = {0, wndw_proc, 0, 0, glob_hinst,
78                         0, 0, 0, 0, "gpg-agent"};
79   NOTIFYICONDATA nid;
80   HWND hwnd;
81   MSG msg;
82   int rc;
83
84   if (!RegisterClass (&wndwclass))
85     {
86       log_error ("error registering window class\n");
87       ExitThread (0);
88     }
89   hwnd = CreateWindow ("gpg-agent", "gpg-agent",
90                        0, 0, 0, 0, 0,
91                        NULL, NULL, glob_hinst, NULL);
92   if (!hwnd)
93     {
94       log_error ("error creating main window\n");
95       ExitThread (0);
96     }
97   glob_hwnd = hwnd;
98   UpdateWindow (hwnd);
99
100   memset (&nid, 0, sizeof nid);
101   nid.cbSize = sizeof (nid);
102   nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
103   nid.uCallbackMessage = WM_USER;
104   nid.hWnd = glob_hwnd;
105   nid.uID = 1;
106   nid.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (1));
107   mem2str (nid.szTip, "GnuPG Agent version "PACKAGE_VERSION,
108            sizeof nid.szTip);
109   Shell_NotifyIcon (NIM_ADD, &nid);
110   DestroyIcon (nid.hIcon);
111
112   fprintf (stderr, "%s: enter\n", __func__);
113   while ( (rc=GetMessage (&msg, hwnd,  0, 0)) ) 
114     { 
115       if (rc == -1)
116         {
117           log_error ("getMessage failed: %s\n", w32_strerror (-1));
118           break;
119         }
120       TranslateMessage (&msg);
121       DispatchMessage (&msg);
122     }
123   fprintf (stderr,"%s: leave\n", __func__);
124   ExitThread (0);
125   return NULL;
126 }
127
128
129
130 /* This function initializes the Window system and sets up the taskbar
131    icon.  We only have very limited GUI support just to give the
132    taskbar icon a little bit of life.  This fucntion is called once to
133    fire up the icon.  */
134 int
135 w32_setup_taskbar (void)
136 {
137   SECURITY_ATTRIBUTES sa;
138   DWORD tid;
139   HANDLE th;
140
141   memset (&sa, 0, sizeof sa);
142   sa.nLength = sizeof sa;
143   sa.bInheritHandle = FALSE;
144
145   fprintf (stderr,"creating thread for the taskbar_event_loop...\n");
146   th = CreateThread (&sa, 128*1024,
147                      (LPTHREAD_START_ROUTINE)handle_taskbar,
148                      NULL, 0, &tid);
149   fprintf (stderr,"created thread %p tid=%d\n", th, (int)tid);
150
151   CloseHandle (th);
152
153   return 0;
154 }
155
156
157 /* The main entry point for the Windows version.  We save away all GUI
158    related stuff, parse the commandline and finally call the real
159    main.  */
160 int WINAPI
161 WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
162 {
163   /* Fixme: We need a parser for the command line.  Should be
164      available in some CRT code - need to see whether we can find a
165      GNU version.  For nopw we call gpg-agent with a couple of fixed arguments 
166    */
167   char *argv[] = { "gpg-agent.exe", "--daemon", "-v", "--debug-all", NULL };
168
169
170   glob_hinst = hinst;
171
172   return w32_main (DIM(argv)-1, argv);
173 }
174
175
176
177
178