When including 'wine/port.h', include it first.
[wine] / dlls / user / thunk.c
1 /*
2  * USER 16-bit thunks
3  *
4  * Copyright 1996, 1997 Alexandre Julliard
5  * Copyright 1998       Ulrich Weigand
6  */
7
8 #include "windef.h"
9 #include "wingdi.h"
10 #include "wine/winuser16.h"
11 #include "win.h"
12 #include "callback.h"
13
14 /* ### start build ### */
15 extern WORD CALLBACK THUNK_CallTo16_word_wl   (FARPROC16,WORD,LONG);
16 extern WORD CALLBACK THUNK_CallTo16_word_wlw  (FARPROC16,WORD,LONG,WORD);
17 extern WORD CALLBACK THUNK_CallTo16_word_wlwww(FARPROC16,WORD,LONG,WORD,WORD,WORD);
18 /* ### stop build ### */
19
20
21 /*******************************************************************
22  *           EnumWindows   (USER.54)
23  */
24 BOOL16 WINAPI EnumWindows16( WNDENUMPROC16 func, LPARAM lParam )
25 {
26     DECL_THUNK( thunk, func, THUNK_CallTo16_word_wl );
27     return EnumWindows( (WNDENUMPROC)&thunk, lParam );
28 }
29
30
31 /**********************************************************************
32  *           EnumChildWindows   (USER.55)
33  */
34 BOOL16 WINAPI EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func, LPARAM lParam )
35 {
36     DECL_THUNK( thunk, func, THUNK_CallTo16_word_wl );
37     return EnumChildWindows( WIN_Handle32(parent), (WNDENUMPROC)&thunk, lParam );
38 }
39
40
41 /**********************************************************************
42  *           EnumTaskWindows   (USER.225)
43  */
44 BOOL16 WINAPI THUNK_EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
45                                        LPARAM lParam )
46 {
47     DECL_THUNK( thunk, func, THUNK_CallTo16_word_wl );
48     return EnumTaskWindows16( hTask, (WNDENUMPROC16)&thunk, lParam );
49 }
50
51
52 /***********************************************************************
53  *           EnumProps   (USER.27)
54  */
55 INT16 WINAPI THUNK_EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
56 {
57     DECL_THUNK( thunk, func, THUNK_CallTo16_word_wlw );
58     return EnumProps16( hwnd, (PROPENUMPROC16)&thunk );
59 }
60
61
62 /***********************************************************************
63  *           GrayString   (USER.185)
64  */
65 BOOL16 WINAPI THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr,
66                                   GRAYSTRINGPROC16 func, LPARAM lParam,
67                                   INT16 cch, INT16 x, INT16 y,
68                                   INT16 cx, INT16 cy )
69 {
70     DECL_THUNK( thunk, func, THUNK_CallTo16_word_wlw );
71     if (!func)
72         return GrayString16( hdc, hbr, NULL, lParam, cch, x, y, cx, cy );
73     else
74         return GrayString16( hdc, hbr, (GRAYSTRINGPROC16)&thunk, lParam, cch,
75                              x, y, cx, cy );
76 }
77
78
79 /**********************************************************************
80  *           DrawState    (USER.449)
81  */
82 BOOL16 WINAPI DrawState16( HDC16 hdc, HBRUSH16 hbr, DRAWSTATEPROC16 func, LPARAM ldata,
83                            WPARAM16 wdata, INT16 x, INT16 y, INT16 cx, INT16 cy, UINT16 flags )
84 {
85     UINT opcode = flags & 0xf;
86     DECL_THUNK( thunk, func, THUNK_CallTo16_word_wlwww );
87
88     if (opcode == DST_TEXT || opcode == DST_PREFIXTEXT)
89     {
90         /* make sure DrawStateA doesn't try to use ldata as a pointer */
91         if (!wdata) wdata = strlen( MapSL(ldata) );
92         if (!cx || !cy)
93         {
94             SIZE s;
95             if (!GetTextExtentPoint32A( hdc, MapSL(ldata), wdata, &s )) return FALSE;
96             if (!cx) cx = s.cx;
97             if (!cy) cy = s.cy;
98         }
99     }
100     return DrawStateA( hdc, hbr, (DRAWSTATEPROC)&thunk, ldata, wdata, x, y, cx, cy, flags );
101 }