Draw an additional white bit for each invert bit of a cursor.
[wine] / misc / spy.c
1 /*
2  * Message spying routines
3  *
4  * Copyright 1994, Bob Amstadt
5  *           1995, Alex Korobka  
6  */
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include "wine/winuser16.h"
11 #include "wine/winbase16.h"
12 #include "win.h"
13 #include "module.h"
14 #include "options.h"
15 #include "debugtools.h"
16 #include "spy.h"
17
18 DEFAULT_DEBUG_CHANNEL(message)
19
20 #define SPY_MAX_MSGNUM   WM_USER
21 #define SPY_INDENT_UNIT  4  /* 4 spaces */
22
23 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
24 {
25     "wm_null",                  /* 0x00 */
26     "WM_CREATE",        
27     "WM_DESTROY",    
28     "WM_MOVE",
29     "wm_sizewait",
30     "WM_SIZE",
31     "WM_ACTIVATE",
32     "WM_SETFOCUS",
33     "WM_KILLFOCUS",
34     "WM_SETVISIBLE",
35     "WM_ENABLE",
36     "WM_SETREDRAW",
37     "WM_SETTEXT",
38     "WM_GETTEXT",
39     "WM_GETTEXTLENGTH",
40     "WM_PAINT",
41     "WM_CLOSE",                 /* 0x10 */
42     "WM_QUERYENDSESSION",
43     "WM_QUIT",
44     "WM_QUERYOPEN",
45     "WM_ERASEBKGND",
46     "WM_SYSCOLORCHANGE",
47     "WM_ENDSESSION",
48     "wm_systemerror",
49     "WM_SHOWWINDOW",
50     "WM_CTLCOLOR",
51     "WM_WININICHANGE",
52     "WM_DEVMODECHANGE",
53     "WM_ACTIVATEAPP",
54     "WM_FONTCHANGE",
55     "WM_TIMECHANGE",
56     "WM_CANCELMODE",
57     "WM_SETCURSOR",             /* 0x20 */
58     "WM_MOUSEACTIVATE",
59     "WM_CHILDACTIVATE",
60     "WM_QUEUESYNC",
61     "WM_GETMINMAXINFO",
62     "wm_unused3",
63     "wm_painticon",
64     "WM_ICONERASEBKGND",
65     "WM_NEXTDLGCTL",
66     "wm_alttabactive",
67     "WM_SPOOLERSTATUS",
68     "WM_DRAWITEM",
69     "WM_MEASUREITEM",
70     "WM_DELETEITEM",
71     "WM_VKEYTOITEM",
72     "WM_CHARTOITEM",
73     "WM_SETFONT",               /* 0x30 */
74     "WM_GETFONT",
75     "WM_SETHOTKEY", 
76     "WM_GETHOTKEY", 
77     "wm_filesyschange", 
78     "wm_isactiveicon",
79     "wm_queryparkicon",
80     "WM_QUERYDRAGICON",
81     "wm_querysavestate",
82     "WM_COMPAREITEM", 
83     "wm_testing",
84     NULL, 
85     "wm_otherwindowcreated", 
86     "wm_otherwindowdestroyed", 
87     "wm_activateshellwindow",
88     NULL,
89
90     NULL,                       /* 0x40 */
91     "wm_compacting", NULL, NULL, 
92     "WM_COMMNOTIFY", NULL, 
93     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
94     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
95     "WM_POWER", NULL, 
96     "WM_COPYDATA", 
97     "WM_CANCELJOURNAL", NULL, NULL, 
98     "WM_NOTIFY", NULL,
99
100     /* 0x0050 */
101     "WM_INPUTLANGCHANGEREQUEST",
102     "WM_INPUTLANGCHANGE", 
103     "WM_TCARD", 
104     "WM_HELP", 
105     "WM_USERCHANGED", 
106     "WM_NOTIFYFORMAT", NULL, NULL, 
107     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
108
109     /* 0x0060 */
110     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
111     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
112
113     /* 0x0070 */
114     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
115     NULL, NULL, NULL, 
116     "WM_CONTEXTMENU", 
117     "WM_STYLECHANGING", 
118     "WM_STYLECHANGED", 
119     "WM_DISPLAYCHANGE", 
120     "WM_GETICON",
121
122     "WM_SETICON",               /* 0x0080 */
123     "WM_NCCREATE",              /* 0x0081 */
124     "WM_NCDESTROY",             /* 0x0082 */
125     "WM_NCCALCSIZE",            /* 0x0083 */
126     "WM_NCHITTEST",             /* 0x0084 */
127     "WM_NCPAINT",               /* 0x0085 */
128     "WM_NCACTIVATE",            /* 0x0086 */
129     "WM_GETDLGCODE",            /* 0x0087 */
130     "wm_syncpaint", 
131     "wm_synctask", NULL, NULL, NULL, NULL, NULL, NULL,
132
133     /* 0x0090 */
134     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
135     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
136
137     /* 0x00A0 */
138     "WM_NCMOUSEMOVE",           /* 0x00A0 */
139     "WM_NCLBUTTONDOWN",         /* 0x00A1 */
140     "WM_NCLBUTTONUP",           /* 0x00A2 */
141     "WM_NCLBUTTONDBLCLK",       /* 0x00A3 */
142     "WM_NCRBUTTONDOWN",         /* 0x00A4 */
143     "WM_NCRBUTTONUP",           /* 0x00A5 */
144     "WM_NCRBUTTONDBLCLK",       /* 0x00A6 */
145     "WM_NCMBUTTONDOWN",         /* 0x00A7 */
146     "WM_NCMBUTTONUP",           /* 0x00A8 */
147     "WM_NCMBUTTONDBLCLK",       /* 0x00A9 */
148     NULL, NULL, NULL, NULL, NULL, NULL,
149
150     /* 0x00B0 - Win32 Edit controls */
151     "EM_GETSEL32",              /* 0x00b0 */
152     "EM_SETSEL32",              /* 0x00b1 */
153     "EM_GETRECT32",             /* 0x00b2 */
154     "EM_SETRECT32",             /* 0x00b3 */
155     "EM_SETRECTNP32",           /* 0x00b4 */
156     "EM_SCROLL32",              /* 0x00b5 */
157     "EM_LINESCROLL32",          /* 0x00b6 */
158     "EM_SCROLLCARET32",         /* 0x00b7 */
159     "EM_GETMODIFY32",           /* 0x00b8 */
160     "EM_SETMODIFY32",           /* 0x00b9 */
161     "EM_GETLINECOUNT32",        /* 0x00ba */
162     "EM_LINEINDEX32",           /* 0x00bb */
163     "EM_SETHANDLE32",           /* 0x00bc */
164     "EM_GETHANDLE32",           /* 0x00bd */
165     "EM_GETTHUMB32",            /* 0x00be */
166     NULL,                       /* 0x00bf */
167
168     NULL,                       /* 0x00c0 */
169     "EM_LINELENGTH32",          /* 0x00c1 */
170     "EM_REPLACESEL32",          /* 0x00c2 */
171     NULL,                       /* 0x00c3 */
172     "EM_GETLINE32",             /* 0x00c4 */
173     "EM_LIMITTEXT32",           /* 0x00c5 */
174     "EM_CANUNDO32",             /* 0x00c6 */
175     "EM_UNDO32",                /* 0x00c7 */
176     "EM_FMTLINES32",            /* 0x00c8 */
177     "EM_LINEFROMCHAR32",        /* 0x00c9 */
178     NULL,                       /* 0x00ca */
179     "EM_SETTABSTOPS32",         /* 0x00cb */
180     "EM_SETPASSWORDCHAR32",     /* 0x00cc */
181     "EM_EMPTYUNDOBUFFER32",     /* 0x00cd */
182     "EM_GETFIRSTVISIBLELINE32", /* 0x00ce */
183     "EM_SETREADONLY32",         /* 0x00cf */
184
185     "EM_SETWORDBREAKPROC32",    /* 0x00d0 */
186     "EM_GETWORDBREAKPROC32",    /* 0x00d1 */
187     "EM_GETPASSWORDCHAR32",     /* 0x00d2 */
188     "EM_SETMARGINS32",          /* 0x00d3 */
189     "EM_GETMARGINS32",          /* 0x00d4 */
190     "EM_GETLIMITTEXT32",        /* 0x00d5 */
191     "EM_POSFROMCHAR32",         /* 0x00d6 */
192     "EM_CHARFROMPOS32",         /* 0x00d7 */
193     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
194
195     /* 0x00E0 - Win32 Scrollbars */
196     "SBM_SETPOS32",             /* 0x00e0 */
197     "SBM_GETPOS32",             /* 0x00e1 */
198     "SBM_SETRANGE32",           /* 0x00e2 */
199     "SBM_GETRANGE32",           /* 0x00e3 */
200     "SBM_ENABLE_ARROWS32",      /* 0x00e4 */
201     NULL,
202     "SBM_SETRANGEREDRAW32",     /* 0x00e6 */
203     NULL, NULL,
204     "SBM_SETSCROLLINFO32",      /* 0x00e9 */
205     "SBM_GETSCROLLINFO32",      /* 0x00ea */
206     NULL, NULL, NULL, NULL, NULL,
207
208     /* 0x00F0 - Win32 Buttons */
209     "BM_GETCHECK32",            /* 0x00f0 */
210     "BM_SETCHECK32",            /* 0x00f1 */
211     "BM_GETSTATE32",            /* 0x00f2 */
212     "BM_SETSTATE32",            /* 0x00f3 */
213     "BM_SETSTYLE32",            /* 0x00f4 */
214     "BM_CLICK32",               /* 0x00f5 */
215     "BM_GETIMAGE32",            /* 0x00f6 */
216     "BM_SETIMAGE32",            /* 0x00f7 */
217     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
218
219     "WM_KEYDOWN",               /* 0x0100 */
220     "WM_KEYUP",                 /* 0x0101 */
221     "WM_CHAR",                  /* 0x0102 */
222     "WM_DEADCHAR",              /* 0x0103 */
223     "WM_SYSKEYDOWN",            /* 0x0104 */
224     "WM_SYSKEYUP",              /* 0x0105 */
225     "WM_SYSCHAR",               /* 0x0106 */
226     "WM_SYSDEADCHAR",           /* 0x0107 */
227     "WM_KEYLAST",               /* 0x0108 */
228     NULL, 
229     "WM_CONVERTREQUEST",
230     "WM_CONVERTRESULT", 
231     "WM_INTERIM", NULL, NULL, NULL,
232
233     "WM_INITDIALOG",            /* 0x0110 */
234     "WM_COMMAND",               /* 0x0111 */
235     "WM_SYSCOMMAND",            /* 0x0112 */
236     "WM_TIMER",                 /* 0x0113 */
237     "WM_HSCROLL",               /* 0x0114 */
238     "WM_VSCROLL",               /* 0x0115 */
239     "WM_INITMENU",              /* 0x0116 */
240     "WM_INITMENUPOPUP",         /* 0x0117 */
241     "WM_SYSTIMER",              /* 0x0118 */
242     NULL, NULL, NULL, NULL, NULL, NULL,
243     "WM_MENUSELECT",            /* 0x011f */
244
245     "WM_MENUCHAR",              /* 0x0120 */
246     "WM_ENTERIDLE",             /* 0x0121 */
247     NULL, NULL, NULL, NULL, NULL, NULL,
248     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
249
250     /* 0x0130 */
251     NULL,
252     "wm_lbtrackpoint",          /* 0x0131 */
253     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
254     "WM_CTLCOLOREDIT",          /* 0x0133 */
255     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
256     "WM_CTLCOLORBTN",           /* 0x0135 */
257     "WM_CTLCOLORDLG",           /* 0x0136 */
258     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
259     "WM_CTLCOLORSTATIC",        /* 0x0138 */
260     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
261
262     /* 0x0140 - Win32 Comboboxes */
263     "CB_GETEDITSEL32",          /* 0x0140 */
264     "CB_LIMITTEXT32",           /* 0x0141 */
265     "CB_SETEDITSEL32",          /* 0x0142 */
266     "CB_ADDSTRING32",           /* 0x0143 */
267     "CB_DELETESTRING32",        /* 0x0144 */
268     "CB_DIR32",                 /* 0x0145 */
269     "CB_GETCOUNT32",            /* 0x0146 */
270     "CB_GETCURSEL32",           /* 0x0147 */
271     "CB_GETLBTEXT32",           /* 0x0148 */
272     "CB_GETLBTEXTLEN32",        /* 0x0149 */
273     "CB_INSERTSTRING32",        /* 0x014a */
274     "CB_RESETCONTENT32",        /* 0x014b */
275     "CB_FINDSTRING32",          /* 0x014c */
276     "CB_SELECTSTRING32",        /* 0x014d */
277     "CB_SETCURSEL32",           /* 0x014e */
278     "CB_SHOWDROPDOWN32",        /* 0x014f */
279
280     "CB_GETITEMDATA32",         /* 0x0150 */
281     "CB_SETITEMDATA32",         /* 0x0151 */
282     "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
283     "CB_SETITEMHEIGHT32",       /* 0x0153 */
284     "CB_GETITEMHEIGHT32",       /* 0x0154 */
285     "CB_SETEXTENDEDUI32",       /* 0x0155 */
286     "CB_GETEXTENDEDUI32",       /* 0x0156 */
287     "CB_GETDROPPEDSTATE32",     /* 0x0157 */
288     "CB_FINDSTRINGEXACT32",     /* 0x0158 */
289     "CB_SETLOCALE32",           /* 0x0159 */
290     "CB_GETLOCALE32",           /* 0x015a */
291     "CB_GETTOPINDEX32",         /* 0x015b */
292     "CB_SETTOPINDEX32",         /* 0x015c */
293     "CB_GETHORIZONTALEXTENT32", /* 0x015d */
294     "CB_SETHORIZONTALEXTENT32", /* 0x015e */
295     "CB_GETDROPPEDWIDTH32",     /* 0x015f */
296
297     "CB_SETDROPPEDWIDTH32",     /* 0x0160 */
298     "CB_INITSTORAGE32",         /* 0x0161 */
299     NULL, NULL, NULL, NULL, NULL, NULL,
300     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
301
302     /* 0x0170 - Win32 Static controls */
303     "STM_SETICON32",            /* 0x0170 */
304     "STM_GETICON32",            /* 0x0171 */
305     "STM_SETIMAGE32",           /* 0x0172 */
306     "STM_GETIMAGE32",           /* 0x0173 */
307     NULL, NULL, NULL, NULL, 
308     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
309
310     /* 0x0180 - Win32 Listboxes */
311     "LB_ADDSTRING32",           /* 0x0180 */
312     "LB_INSERTSTRING32",        /* 0x0181 */
313     "LB_DELETESTRING32",        /* 0x0182 */
314     "LB_SELITEMRANGEEX32",      /* 0x0183 */
315     "LB_RESETCONTENT32",        /* 0x0184 */
316     "LB_SETSEL32",              /* 0x0185 */
317     "LB_SETCURSEL32",           /* 0x0186 */
318     "LB_GETSEL32",              /* 0x0187 */
319     "LB_GETCURSEL32",           /* 0x0188 */
320     "LB_GETTEXT32",             /* 0x0189 */
321     "LB_GETTEXTLEN32",          /* 0x018a */
322     "LB_GETCOUNT32",            /* 0x018b */
323     "LB_SELECTSTRING32",        /* 0x018c */
324     "LB_DIR32",                 /* 0x018d */
325     "LB_GETTOPINDEX32",         /* 0x018e */
326     "LB_FINDSTRING32",          /* 0x018f */
327
328     "LB_GETSELCOUNT32",         /* 0x0190 */
329     "LB_GETSELITEMS32",         /* 0x0191 */
330     "LB_SETTABSTOPS32",         /* 0x0192 */
331     "LB_GETHORIZONTALEXTENT32", /* 0x0193 */
332     "LB_SETHORIZONTALEXTENT32", /* 0x0194 */
333     "LB_SETCOLUMNWIDTH32",      /* 0x0195 */
334     "LB_ADDFILE32",             /* 0x0196 */
335     "LB_SETTOPINDEX32",         /* 0x0197 */
336     "LB_GETITEMRECT32",         /* 0x0198 */
337     "LB_GETITEMDATA32",         /* 0x0199 */
338     "LB_SETITEMDATA32",         /* 0x019a */
339     "LB_SELITEMRANGE32",        /* 0x019b */
340     "LB_SETANCHORINDEX32",      /* 0x019c */
341     "LB_GETANCHORINDEX32",      /* 0x019d */
342     "LB_SETCARETINDEX32",       /* 0x019e */
343     "LB_GETCARETINDEX32",       /* 0x019f */
344
345     "LB_SETITEMHEIGHT32",       /* 0x01a0 */
346     "LB_GETITEMHEIGHT32",       /* 0x01a1 */
347     "LB_FINDSTRINGEXACT32",     /* 0x01a2 */
348     "LB_CARETON32",             /* 0x01a3 */
349     "LB_CARETOFF32",            /* 0x01a4 */
350     "LB_SETLOCALE32",           /* 0x01a5 */
351     "LB_GETLOCALE32",           /* 0x01a6 */
352     "LB_SETCOUNT32",            /* 0x01a7 */
353     "LB_INITSTORAGE32",         /* 0x01a8 */
354     "LB_ITEMFROMPOINT32",       /* 0x01a9 */
355     NULL, NULL, NULL, NULL, NULL, NULL,
356
357     /* 0x01B0 */
358     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
359     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
360
361     /* 0x01C0 */
362     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
363     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
364
365     /* 0x01D0 */
366     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
367     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
368
369     /* 0x01E0 */
370     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
371     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
372
373     /* 0x01F0 */
374     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
375     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
376
377     "WM_MOUSEMOVE",             /* 0x0200 */
378     "WM_LBUTTONDOWN",           /* 0x0201 */
379     "WM_LBUTTONUP",             /* 0x0202 */
380     "WM_LBUTTONDBLCLK",         /* 0x0203 */
381     "WM_RBUTTONDOWN",           /* 0x0204 */
382     "WM_RBUTTONUP",             /* 0x0205 */
383     "WM_RBUTTONDBLCLK",         /* 0x0206 */
384     "WM_MBUTTONDOWN",           /* 0x0207 */
385     "WM_MBUTTONUP",             /* 0x0208 */
386     "WM_MBUTTONDBLCLK",         /* 0x0209 */
387     NULL, NULL, NULL, NULL, NULL, NULL,
388
389     "WM_PARENTNOTIFY",          /* 0x0210 */
390     "WM_ENTERMENULOOP",         /* 0x0211 */
391     "WM_EXITMENULOOP",          /* 0x0212 */
392     "wm_nextmenu",              /* 0x0213 */
393     "WM_SIZING", 
394     "WM_CAPTURECHANGED",
395     "WM_MOVING", NULL,
396     "WM_POWERBROADCAST", 
397     "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
398
399     "WM_MDICREATE",             /* 0x0220 */
400     "WM_MDIDESTROY",            /* 0x0221 */
401     "WM_MDIACTIVATE",           /* 0x0222 */
402     "WM_MDIRESTORE",            /* 0x0223 */
403     "WM_MDINEXT",               /* 0x0224 */
404     "WM_MDIMAXIMIZE",           /* 0x0225 */
405     "WM_MDITILE",               /* 0x0226 */
406     "WM_MDICASCADE",            /* 0x0227 */
407     "WM_MDIICONARRANGE",        /* 0x0228 */
408     "WM_MDIGETACTIVE",          /* 0x0229 */
409
410     "wm_dropobject", 
411     "wm_querydropobject", 
412     "wm_begindrag",
413     "wm_dragloop",
414     "wn_dragselect",
415     "wm_dragmove",
416      
417     /* 0x0230*/
418     "WM_MDISETMENU",            /* 0x0230 */
419     "WM_ENTERSIZEMOVE",         /* 0x0231 */
420     "WM_EXITSIZEMOVE",          /* 0x0232 */
421     "WM_DROPFILES",             /* 0x0233 */
422     "WM_MDIREFRESHMENU", NULL, NULL, NULL, 
423     /* 0x0238*/
424     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
425     
426     /* 0x0240 */
427     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
428     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
429
430     /* 0x0250 */
431     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
432     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
433     
434     /* 0x0260 */
435     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
436     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
437     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
438     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
439
440     /* 0x0280 */
441     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
442     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
443     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
444     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
445
446     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
447     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
448     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
449     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
450
451     /* 0x02c0 */
452     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
453     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
454     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
455     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
456
457     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
458     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
459     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
460     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
461
462     "WM_CUT",                   /* 0x0300 */
463     "WM_COPY", 
464     "WM_PASTE", 
465     "WM_CLEAR", 
466     "WM_UNDO", 
467     "WM_RENDERFORMAT", 
468     "WM_RENDERALLFORMATS", 
469     "WM_DESTROYCLIPBOARD",
470     "WM_DRAWCLIPBOARD", 
471     "WM_PAINTCLIPBOARD", 
472     "WM_VSCROLLCLIPBOARD", 
473     "WM_SIZECLIPBOARD", 
474     "WM_ASKCBFORMATNAME", 
475     "WM_CHANGECBCHAIN",
476     "WM_HSCROLLCLIPBOARD",
477     "WM_QUERYNEWPALETTE",       /* 0x030f*/
478
479     "WM_PALETTEISCHANGING",
480     "WM_PALETTECHANGED",
481     "WM_HOTKEY",                /* 0x0312 */
482           NULL, NULL, NULL, NULL, 
483     "WM_PRINT", 
484     "WM_PRINTCLIENT", 
485     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
486
487     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
488     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
489     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
490     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
491
492     /* 0x0340 */
493     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
494     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
495     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
496     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
497
498     "WM_QUERYAFXWNDPROC",   /*  0x0360 */
499     "WM_SIZEPARENT",        /*  0x0361 */
500     "WM_SETMESSAGESTRING",  /*  0x0362 */
501     "WM_IDLEUPDATECMDUI",   /*  0x0363 */
502     "WM_INITIALUPDATE",     /*  0x0364 */
503     "WM_COMMANDHELP",       /*  0x0365 */
504     "WM_HELPHITTEST",       /*  0x0366 */
505     "WM_EXITHELPMODE",      /*  0x0367 */
506     "WM_RECALCPARENT",      /*  0x0368 */
507     "WM_SIZECHILD",         /*  0x0369 */
508     "WM_KICKIDLE",          /*  0x036A */
509     "WM_QUERYCENTERWND",    /*  0x036B */
510     "WM_DISABLEMODAL",      /*  0x036C */
511     "WM_FLOATSTATUS",       /*  0x036D */
512     "WM_ACTIVATETOPLEVEL",  /*  0x036E */
513     "WM_QUERY3DCONTROLS",   /*  0x036F */
514     NULL,NULL,NULL,
515     "WM_SOCKET_NOTIFY",     /*  0x0373 */
516     "WM_SOCKET_DEAD",       /*  0x0374 */
517     "WM_POPMESSAGESTRING",  /*  0x0375 */
518     "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
519     "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
520     "WM_OCC_INITNEW",            /* 0x0378 */
521     "WM_QUEUE_SENTINEL",         /* 0x0379 */
522     "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
523     "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
524
525     NULL,NULL,NULL,NULL,
526
527     /* 0x0380 */
528     "WM_PENWINFIRST", 
529     "WM_RCRESULT", 
530     "WM_HOOKRCRESULT", 
531     "WM_GLOBALRCCHANGE", 
532     "WM_SKB", 
533     "WM_HEDITCTL", 
534                                         NULL, NULL,
535     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
536
537     "WM_COALESCE_FIRST", 
538           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
539     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
540     "WM_COALESCE_LAST", 
541     
542     /* 0x03a0 */
543     "MM_JOY1MOVE", 
544     "MM_JOY2MOVE", 
545     "MM_JOY1ZMOVE", 
546     "MM_JOY2ZMOVE", 
547                             NULL, NULL, NULL, NULL,
548     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
549
550     /* 0x03b0 */
551     NULL, NULL, NULL, NULL, NULL, 
552     "MM_JOY1BUTTONDOWN", 
553     "MM_JOY2BUTTONDOWN", 
554     "MM_JOY1BUTTONUP",
555     "MM_JOY2BUTTONUP",
556     "MM_MCINOTIFY",
557                 NULL, 
558     "MM_WOM_OPEN",
559     "MM_WOM_CLOSE",
560     "MM_WOM_DONE",
561     "MM_WIM_OPEN",
562     "MM_WIM_CLOSE",
563
564     /* 0x03c0 */
565     "MM_WIM_DATA",
566     "MM_MIM_OPEN",
567     "MM_MIM_CLOSE",
568     "MM_MIM_DATA",
569     "MM_MIM_LONGDATA",
570     "MM_MIM_ERROR",
571     "MM_MIM_LONGERROR",
572     "MM_MOM_OPEN",
573     "MM_MOM_CLOSE",
574     "MM_MOM_DONE",
575                 NULL, NULL, NULL, NULL, NULL, NULL,
576     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
577     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
578
579     /* 0x03e0 */
580     "WM_DDE_INITIATE",  /* 0x3E0 */
581     "WM_DDE_TERMINATE", /* 0x3E1 */
582     "WM_DDE_ADVISE",    /* 0x3E2 */
583     "WM_DDE_UNADVISE",  /* 0x3E3 */
584     "WM_DDE_ACK",       /* 0x3E4 */
585     "WM_DDE_DATA",      /* 0x3E5 */
586     "WM_DDE_REQUEST",   /* 0x3E6 */
587     "WM_DDE_POKE",      /* 0x3E7 */
588     "WM_DDE_EXECUTE",   /* 0x3E8 */
589     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
590
591     
592     /* 0x03f0 */
593     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
594     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
595
596     "WM_USER"
597 };
598
599
600 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
601 static BOOL16 SPY_ExcludeDWP = 0;
602 static int SPY_IndentLevel  = 0;
603
604 #define SPY_EXCLUDE(msg) \
605     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
606
607 /***********************************************************************
608  *           SPY_GetMsgName
609  */
610 const char *SPY_GetMsgName( UINT msg )
611 {
612     static char msg_buffer[20];
613
614     if (msg <= SPY_MAX_MSGNUM)
615     {
616         if (!MessageTypeNames[msg]) return "???";
617         return MessageTypeNames[msg];
618     }
619     sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
620     return msg_buffer;
621 }
622
623 /***********************************************************************
624  *           SPY_GetWndName
625  */
626 const char *SPY_GetWndName( HWND hwnd )
627 {
628     static char wnd_buffer[16];
629
630     WND* pWnd = WIN_FindWndPtr( hwnd );
631     if( pWnd )
632     {
633         INT n = sizeof(wnd_buffer) - 6;
634         LPSTR p = wnd_buffer;
635         LPSTR src;
636         
637         char  postfix;
638         
639         if( pWnd->text && pWnd->text[0] != '\0' )
640         {
641             src = pWnd->text;
642             *(p++) = postfix = '\"';
643             while ((n-- > 1) && *src) *p++ = *src++;
644         }
645         else /* get class name */
646         {
647             INT len;
648
649             *(p++)='{';
650             GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM), p, n + 1);
651             src = p += (len = lstrlenA(p));
652             if( len >= n ) src = wnd_buffer;    /* something nonzero */
653             postfix = '}';
654         }
655         if( *src ) for( n = 0; n < 3; n++ ) *(p++)='.';
656         *(p++) = postfix;
657         *(p++) = '\0';
658         WIN_ReleaseWndPtr(pWnd);
659
660     }
661     else lstrcpyA( wnd_buffer, "\"NULL\"" );
662     return wnd_buffer;
663 }
664 /***********************************************************************
665  *           SPY_DumpStructure
666  */
667 void SPY_DumpStructure (UINT msg, LPARAM structure)
668 {
669         switch (msg)
670         {
671             case WM_DRAWITEM:
672                 {   DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) structure;
673                     TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpdis->CtlType, lpdis->CtlID);
674                     TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", lpdis->itemID, lpdis->itemAction, lpdis->itemState);
675                     TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
676                     lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom, lpdis->itemData);
677                 }
678                 break;
679             case WM_MEASUREITEM:
680                 {   MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) structure;
681                     TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpmis->CtlType, lpmis->CtlID);
682                     TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
683                     TRACE("itemData=0x%08lx\n", lpmis->itemData);
684                 }
685                 break;
686             case WM_NOTIFY:
687                 {   NMHDR * pnmh = (NMHDR*) structure;
688                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n", pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
689                 }
690             default:
691                 break;
692         }
693         
694 }
695 /***********************************************************************
696  *           SPY_EnterMessage
697  */
698 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
699                        WPARAM wParam, LPARAM lParam )
700 {
701     LPCSTR pname;
702
703     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
704
705     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
706     switch(iFlag)
707     {
708     case SPY_DISPATCHMESSAGE16:
709         pname = SPY_GetWndName(hWnd);
710         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
711                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
712                         wParam, lParam);
713         break;
714
715     case SPY_DISPATCHMESSAGE:
716         pname = SPY_GetWndName(hWnd);
717         TRACE("%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
718                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
719                         wParam, lParam);
720         break;
721
722     case SPY_SENDMESSAGE16:
723     case SPY_SENDMESSAGE:
724         {
725             char taskName[30];
726             HTASK16 hTask = GetWindowTask16(hWnd);
727
728             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
729             else if (!hTask) strcpy( taskName, "Wine" );
730             else
731             {
732                 sprintf( taskName, "task %04x ???", hTask );
733                 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
734             }
735             pname = SPY_GetWndName(hWnd);
736
737             if (iFlag == SPY_SENDMESSAGE16)
738                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
739                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
740                              taskName, wParam, lParam );
741             else
742             {   TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
743                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
744                              taskName, wParam, lParam );
745                 SPY_DumpStructure(msg, lParam);
746             }
747         }
748         break;   
749
750     case SPY_DEFWNDPROC16:
751         if( SPY_ExcludeDWP ) return;
752         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
753                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
754                         msg, wParam, lParam );
755         break;
756
757     case SPY_DEFWNDPROC:
758         if( SPY_ExcludeDWP ) return;
759         TRACE("%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
760                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
761                         msg, wParam, lParam );
762         break;
763     }  
764     SPY_IndentLevel += SPY_INDENT_UNIT;
765 }
766
767
768 /***********************************************************************
769  *           SPY_ExitMessage
770  */
771 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn )
772 {
773     LPCSTR pname;
774
775     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
776         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
777         return;
778
779     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
780
781     switch(iFlag)
782     {
783     case SPY_RESULT_DEFWND16:
784         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
785                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
786         break;
787
788     case SPY_RESULT_DEFWND:
789         TRACE(" %*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
790                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
791         break;
792
793     case SPY_RESULT_OK16:
794         pname = SPY_GetWndName(hWnd);
795         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
796                         SPY_IndentLevel, "", hWnd, pname, msg,
797                         SPY_GetMsgName( msg ), lReturn );
798         break;
799
800     case SPY_RESULT_OK:
801         pname = SPY_GetWndName(hWnd);
802         TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
803                         SPY_IndentLevel, "", hWnd, pname, msg,
804                         SPY_GetMsgName( msg ), lReturn );
805         break; 
806
807     case SPY_RESULT_INVALIDHWND16:
808         pname = SPY_GetWndName(hWnd);
809         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
810                         SPY_IndentLevel, "", hWnd, pname, msg,
811                         SPY_GetMsgName( msg ) );
812         break;
813
814     case SPY_RESULT_INVALIDHWND:
815         pname = SPY_GetWndName(hWnd);
816         WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
817                         SPY_IndentLevel, "", hWnd, pname, msg,
818                         SPY_GetMsgName( msg ) );
819         break;
820    }
821 }
822
823
824 /***********************************************************************
825  *           SPY_Init
826  */
827 int SPY_Init(void)
828 {
829     int i;
830     char buffer[1024];
831
832     if (!TRACE_ON(message)) return TRUE;
833
834     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
835     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
836     {
837         TRACE("Include=%s\n", buffer );
838         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
839             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
840     }
841
842     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
843     if (buffer[0])
844     {
845         TRACE("Exclude=%s\n", buffer );
846         if (!strcmp( buffer, "EXCLUDEALL" ))
847             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
848         else
849             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
850                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
851     }
852
853     SPY_ExcludeDWP = PROFILE_GetWineIniInt( "Spy", "ExcludeDWP", 0 );
854
855     return 1;
856 }