Sync to trunk head (r42241)
[reactos.git] / reactos / dll / win32 / user32 / controls / regcontrol.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS User32
5 * PURPOSE: Built-in control registration
6 * FILE: lib/user32/controls/regcontrol.c
7 * PROGRAMER: Ge van Geldorp (ge@gse.nl)
8 * REVISION HISTORY: 2003/06/16 GvG Created
9 * NOTES: Adapted from Wine
10 */
11
12 #include <user32.h>
13
14 #include <wine/debug.h>
15
16 static PFNCLIENT pfnClientA;
17 static PFNCLIENT pfnClientW;
18 static PFNCLIENTWORKER pfnClientWorker;
19
20 static const struct
21 {
22 const struct builtin_class_descr *desc;
23 UINT ClsId;
24 } g_SysClasses[] =
25 {
26 { &DIALOG_builtin_class, FNID_DIALOG },
27 { &POPUPMENU_builtin_class, FNID_MENU },
28 { &COMBO_builtin_class, FNID_COMBOBOX },
29 { &COMBOLBOX_builtin_class, FNID_COMBOLBOX },
30 { &MDICLIENT_builtin_class, FNID_MDICLIENT },
31 #if 0
32 { &MENU_builtin_class, FNID_MENU },
33 #endif
34 { &SCROLL_builtin_class, FNID_SCROLLBAR },
35 { &BUTTON_builtin_class, FNID_BUTTON },
36 { &LISTBOX_builtin_class, FNID_LISTBOX },
37 { &EDIT_builtin_class, FNID_EDIT },
38 { &ICONTITLE_builtin_class, FNID_ICONTITLE },
39 { &STATIC_builtin_class, FNID_STATIC },
40 };
41
42 BOOL WINAPI RegisterSystemControls(VOID)
43 {
44 REGISTER_SYSCLASS cls[sizeof(g_SysClasses) / sizeof(g_SysClasses[0])];
45 UINT i;
46
47 ZeroMemory(cls, sizeof(cls));
48
49 for (i = 0; i != sizeof(cls) / sizeof(cls[0]); i++)
50 {
51 if (IS_ATOM(g_SysClasses[i].desc->name))
52 cls[i].ClassName.Buffer = (PWSTR)((ULONG_PTR)g_SysClasses[i].desc->name);
53 else
54 RtlInitUnicodeString(&cls[i].ClassName, g_SysClasses[i].desc->name);
55
56 cls[i].Style = g_SysClasses[i].desc->style;
57 cls[i].ProcW = g_SysClasses[i].desc->procW;
58 cls[i].ProcA = g_SysClasses[i].desc->procA;
59 cls[i].ExtraBytes = g_SysClasses[i].desc->extra;
60 cls[i].hCursor = LoadCursorW(NULL, g_SysClasses[i].desc->cursor);
61 cls[i].hBrush = g_SysClasses[i].desc->brush;
62 cls[i].ClassId = g_SysClasses[i].ClsId;
63 }
64
65 return NtUserRegisterSystemClasses(sizeof(cls) / sizeof(cls[0]), cls);
66 }
67
68 LRESULT
69 WINAPI
70 MsgWindowProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
71 {
72 if (message == WM_NCCREATE) return TRUE;
73 return 0;
74 }
75
76 LRESULT
77 WINAPI
78 DialogWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
79 {
80 if (unicode)
81 return DefDlgProcW( hwnd, uMsg, wParam, lParam);
82 return DefDlgProcA( hwnd, uMsg, wParam, lParam);
83 }
84
85 BOOL WINAPI RegisterClientPFN(VOID)
86 {
87 NTSTATUS Status;
88
89 pfnClientA.pfnScrollBarWndProc = ScrollBarWndProcA;
90 pfnClientW.pfnScrollBarWndProc = ScrollBarWndProcW;
91 pfnClientA.pfnTitleWndProc = IconTitleWndProc;
92 pfnClientW.pfnTitleWndProc = IconTitleWndProc;
93 pfnClientA.pfnMenuWndProc = PopupMenuWndProcA;
94 pfnClientW.pfnMenuWndProc = PopupMenuWndProcW;
95 pfnClientA.pfnDesktopWndProc = DesktopWndProc;
96 pfnClientW.pfnDesktopWndProc = DesktopWndProc;
97 pfnClientA.pfnDefWindowProc = DefWindowProcA;
98 pfnClientW.pfnDefWindowProc = DefWindowProcW;
99 pfnClientA.pfnMessageWindowProc = MsgWindowProc;
100 pfnClientW.pfnMessageWindowProc = MsgWindowProc;
101 pfnClientA.pfnSwitchWindowProc = DefWindowProcA;
102 pfnClientW.pfnSwitchWindowProc = DefWindowProcW;
103 pfnClientA.pfnButtonWndProc = ButtonWndProcA;
104 pfnClientW.pfnButtonWndProc = ButtonWndProcW;
105 pfnClientA.pfnComboBoxWndProc = ComboWndProcA;
106 pfnClientW.pfnComboBoxWndProc = ComboWndProcW;
107 pfnClientA.pfnComboListBoxProc = ListBoxWndProcA;
108 pfnClientW.pfnComboListBoxProc = ListBoxWndProcW;
109 pfnClientA.pfnDialogWndProc = DefDlgProcA;
110 pfnClientW.pfnDialogWndProc = DefDlgProcW;
111 pfnClientA.pfnEditWndProc = EditWndProcA;
112 pfnClientW.pfnEditWndProc = EditWndProcW;
113 pfnClientA.pfnListBoxWndProc = ListBoxWndProcA;
114 pfnClientW.pfnListBoxWndProc = ListBoxWndProcW;
115 pfnClientA.pfnMDIClientWndProc = MDIClientWndProcA;
116 pfnClientW.pfnMDIClientWndProc = MDIClientWndProcW;
117 pfnClientA.pfnStaticWndProc = StaticWndProcA;
118 pfnClientW.pfnStaticWndProc = StaticWndProcW;
119 pfnClientA.pfnImeWndProc = DefWindowProcA;
120 pfnClientW.pfnImeWndProc = DefWindowProcW;
121 pfnClientA.pfnGhostWndProc = DefWindowProcA;
122 pfnClientW.pfnGhostWndProc = DefWindowProcW;
123 pfnClientA.pfnHkINLPCWPSTRUCT = DefWindowProcA;
124 pfnClientW.pfnHkINLPCWPSTRUCT = DefWindowProcW;
125 pfnClientA.pfnHkINLPCWPRETSTRUCT = DefWindowProcA;
126 pfnClientW.pfnHkINLPCWPRETSTRUCT = DefWindowProcW;
127 pfnClientA.pfnDispatchHook = DefWindowProcA;
128 pfnClientW.pfnDispatchHook = DefWindowProcW;
129 pfnClientA.pfnDispatchDefWindowProc = DefWindowProcA;
130 pfnClientW.pfnDispatchDefWindowProc = DefWindowProcW;
131 pfnClientA.pfnDispatchMessage = DefWindowProcA;
132 pfnClientW.pfnDispatchMessage = DefWindowProcW;
133 pfnClientA.pfnMDIActivateDlgProc = DefWindowProcA;
134 pfnClientW.pfnMDIActivateDlgProc = DefWindowProcW;
135
136 pfnClientWorker.pfnButtonWndProc = ButtonWndProc_common;
137 pfnClientWorker.pfnComboBoxWndProc = ComboWndProc_common;
138 pfnClientWorker.pfnComboListBoxProc = ListBoxWndProc_common;
139 pfnClientWorker.pfnDialogWndProc = DialogWndProc_common;
140 pfnClientWorker.pfnEditWndProc = EditWndProc_common;
141 pfnClientWorker.pfnListBoxWndProc = ListBoxWndProc_common;
142 pfnClientWorker.pfnMDIClientWndProc = MDIClientWndProc_common;
143 pfnClientWorker.pfnStaticWndProc = StaticWndProc_common;
144 pfnClientWorker.pfnImeWndProc = User32DefWindowProc;
145 pfnClientWorker.pfnGhostWndProc = User32DefWindowProc;
146 pfnClientWorker.pfnCtfHookProc = User32DefWindowProc;
147
148 Status = NtUserInitializeClientPfnArrays( &pfnClientA,
149 &pfnClientW,
150 &pfnClientWorker,
151 User32Instance);
152
153 return NT_SUCCESS(Status) ? TRUE : FALSE;
154 }