|
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 |
|
7 #include "nsIFactory.h" |
|
8 #include "nsISupports.h" |
|
9 #include "nsdefs.h" |
|
10 #include "nsWidgetsCID.h" |
|
11 #include "nsAppShell.h" |
|
12 #include "nsAppShellSingleton.h" |
|
13 #include "mozilla/ModuleUtils.h" |
|
14 #include "nsIServiceManager.h" |
|
15 #include "nsIdleServiceWin.h" |
|
16 #include "nsLookAndFeel.h" |
|
17 #include "nsScreenManagerWin.h" |
|
18 #include "nsSound.h" |
|
19 #include "WinMouseScrollHandler.h" |
|
20 #include "KeyboardLayout.h" |
|
21 #include "GfxInfo.h" |
|
22 #include "nsToolkit.h" |
|
23 |
|
24 // Modules that switch out based on the environment |
|
25 #include "nsXULAppAPI.h" |
|
26 // Desktop |
|
27 #include "nsFilePicker.h" // needs to be included before other shobjidl.h includes |
|
28 #include "nsColorPicker.h" |
|
29 #include "nsNativeThemeWin.h" |
|
30 #include "nsWindow.h" |
|
31 // Content processes |
|
32 #include "nsFilePickerProxy.h" |
|
33 // Metro |
|
34 #ifdef MOZ_METRO |
|
35 #include "winrt/MetroAppShell.h" |
|
36 #include "winrt/MetroWidget.h" |
|
37 #include "winrt/nsMetroFilePicker.h" |
|
38 #include "winrt/nsWinMetroUtils.h" |
|
39 #endif |
|
40 |
|
41 // Drag & Drop, Clipboard |
|
42 #include "nsClipboardHelper.h" |
|
43 #include "nsClipboard.h" |
|
44 #include "nsBidiKeyboard.h" |
|
45 #include "nsDragService.h" |
|
46 #include "nsTransferable.h" |
|
47 #include "nsHTMLFormatConverter.h" |
|
48 |
|
49 #include "WinTaskbar.h" |
|
50 #include "JumpListBuilder.h" |
|
51 #include "JumpListItem.h" |
|
52 |
|
53 #ifdef NS_PRINTING |
|
54 #include "nsDeviceContextSpecWin.h" |
|
55 #include "nsPrintOptionsWin.h" |
|
56 #include "nsPrintSession.h" |
|
57 #endif |
|
58 |
|
59 #include "mozilla/Module.h" |
|
60 |
|
61 using namespace mozilla; |
|
62 using namespace mozilla::widget; |
|
63 |
|
64 static nsresult |
|
65 WindowConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
66 void **aResult) |
|
67 { |
|
68 *aResult = nullptr; |
|
69 if (aOuter != nullptr) { |
|
70 return NS_ERROR_NO_AGGREGATION; |
|
71 } |
|
72 nsCOMPtr<nsIWidget> widget; |
|
73 |
|
74 if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) { |
|
75 #ifdef MOZ_METRO |
|
76 widget = new MetroWidget; |
|
77 #else |
|
78 NS_RUNTIMEABORT("build does not support metro."); |
|
79 #endif |
|
80 } else { |
|
81 widget = new nsWindow; |
|
82 } |
|
83 |
|
84 return widget->QueryInterface(aIID, aResult); |
|
85 } |
|
86 |
|
87 static nsresult |
|
88 ChildWindowConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
89 void **aResult) |
|
90 { |
|
91 *aResult = nullptr; |
|
92 if (aOuter != nullptr) { |
|
93 return NS_ERROR_NO_AGGREGATION; |
|
94 } |
|
95 nsCOMPtr<nsIWidget> widget; |
|
96 |
|
97 if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) { |
|
98 return NS_NOINTERFACE; |
|
99 } else { |
|
100 widget = new ChildWindow; |
|
101 } |
|
102 |
|
103 return widget->QueryInterface(aIID, aResult); |
|
104 } |
|
105 |
|
106 static nsresult |
|
107 FilePickerConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
108 void **aResult) |
|
109 { |
|
110 *aResult = nullptr; |
|
111 if (aOuter != nullptr) { |
|
112 return NS_ERROR_NO_AGGREGATION; |
|
113 } |
|
114 nsCOMPtr<nsIFilePicker> picker; |
|
115 |
|
116 if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) { |
|
117 #ifdef MOZ_METRO |
|
118 picker = new nsMetroFilePicker; |
|
119 #else |
|
120 NS_RUNTIMEABORT("build does not support metro."); |
|
121 #endif |
|
122 } else { |
|
123 picker = new nsFilePicker; |
|
124 } |
|
125 return picker->QueryInterface(aIID, aResult); |
|
126 } |
|
127 |
|
128 static nsresult |
|
129 ColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
130 void **aResult) |
|
131 { |
|
132 *aResult = nullptr; |
|
133 if (aOuter != nullptr) { |
|
134 return NS_ERROR_NO_AGGREGATION; |
|
135 } |
|
136 nsCOMPtr<nsIColorPicker> picker; |
|
137 |
|
138 if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) { |
|
139 #ifdef MOZ_METRO |
|
140 // TODO |
|
141 // picker = new nsMetroColorPicker; |
|
142 NS_ERROR("metro color picker isn't implemented currently"); |
|
143 return NS_ERROR_NO_INTERFACE; |
|
144 #else |
|
145 NS_RUNTIMEABORT("build does not support metro."); |
|
146 #endif |
|
147 } else { |
|
148 picker = new nsColorPicker; |
|
149 } |
|
150 return picker->QueryInterface(aIID, aResult); |
|
151 } |
|
152 |
|
153 NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerWin) |
|
154 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceWin, nsIdleServiceWin::GetInstance) |
|
155 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboard) |
|
156 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper) |
|
157 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound) |
|
158 NS_GENERIC_FACTORY_CONSTRUCTOR(WinTaskbar) |
|
159 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListBuilder) |
|
160 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListItem) |
|
161 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListSeparator) |
|
162 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListLink) |
|
163 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListShortcut) |
|
164 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable) |
|
165 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter) |
|
166 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService) |
|
167 NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard) |
|
168 #ifdef MOZ_METRO |
|
169 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWinMetroUtils) |
|
170 #endif |
|
171 #ifdef NS_PRINTING |
|
172 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsWin, Init) |
|
173 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorWin) |
|
174 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init) |
|
175 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecWin) |
|
176 #endif |
|
177 |
|
178 namespace mozilla { |
|
179 namespace widget { |
|
180 // This constructor should really be shared with all platforms. |
|
181 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init) |
|
182 } |
|
183 } |
|
184 |
|
185 NS_DEFINE_NAMED_CID(NS_WINDOW_CID); |
|
186 NS_DEFINE_NAMED_CID(NS_CHILD_CID); |
|
187 NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID); |
|
188 NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID); |
|
189 NS_DEFINE_NAMED_CID(NS_APPSHELL_CID); |
|
190 NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID); |
|
191 NS_DEFINE_NAMED_CID(NS_GFXINFO_CID); |
|
192 NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID); |
|
193 NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID); |
|
194 NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID); |
|
195 NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID); |
|
196 NS_DEFINE_NAMED_CID(NS_SOUND_CID); |
|
197 NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID); |
|
198 NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID); |
|
199 NS_DEFINE_NAMED_CID(NS_WIN_TASKBAR_CID); |
|
200 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTBUILDER_CID); |
|
201 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTITEM_CID); |
|
202 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTSEPARATOR_CID); |
|
203 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTLINK_CID); |
|
204 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTSHORTCUT_CID); |
|
205 #ifdef MOZ_METRO |
|
206 NS_DEFINE_NAMED_CID(NS_WIN_METROUTILS_CID); |
|
207 #endif |
|
208 NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID); |
|
209 NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID); |
|
210 #ifdef NS_PRINTING |
|
211 NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID); |
|
212 NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID); |
|
213 NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID); |
|
214 NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID); |
|
215 #endif |
|
216 |
|
217 |
|
218 static const mozilla::Module::CIDEntry kWidgetCIDs[] = { |
|
219 { &kNS_WINDOW_CID, false, nullptr, WindowConstructor }, |
|
220 { &kNS_CHILD_CID, false, nullptr, ChildWindowConstructor }, |
|
221 { &kNS_FILEPICKER_CID, false, nullptr, FilePickerConstructor, Module::MAIN_PROCESS_ONLY }, |
|
222 { &kNS_COLORPICKER_CID, false, nullptr, ColorPickerConstructor, Module::MAIN_PROCESS_ONLY }, |
|
223 { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor }, |
|
224 { &kNS_SCREENMANAGER_CID, false, nullptr, nsScreenManagerWinConstructor }, |
|
225 { &kNS_GFXINFO_CID, false, nullptr, GfxInfoConstructor }, |
|
226 { &kNS_THEMERENDERER_CID, false, nullptr, NS_NewNativeTheme }, |
|
227 { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceWinConstructor }, |
|
228 { &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor, Module::MAIN_PROCESS_ONLY }, |
|
229 { &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor }, |
|
230 { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor, Module::MAIN_PROCESS_ONLY }, |
|
231 { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor }, |
|
232 { &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor }, |
|
233 { &kNS_WIN_TASKBAR_CID, false, nullptr, WinTaskbarConstructor }, |
|
234 { &kNS_WIN_JUMPLISTBUILDER_CID, false, nullptr, JumpListBuilderConstructor }, |
|
235 { &kNS_WIN_JUMPLISTITEM_CID, false, nullptr, JumpListItemConstructor }, |
|
236 { &kNS_WIN_JUMPLISTSEPARATOR_CID, false, nullptr, JumpListSeparatorConstructor }, |
|
237 { &kNS_WIN_JUMPLISTLINK_CID, false, nullptr, JumpListLinkConstructor }, |
|
238 { &kNS_WIN_JUMPLISTSHORTCUT_CID, false, nullptr, JumpListShortcutConstructor }, |
|
239 { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor, Module::MAIN_PROCESS_ONLY }, |
|
240 { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor }, |
|
241 #ifdef MOZ_METRO |
|
242 { &kNS_WIN_METROUTILS_CID, false, nullptr, nsWinMetroUtilsConstructor }, |
|
243 #endif |
|
244 #ifdef NS_PRINTING |
|
245 { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsWinConstructor }, |
|
246 { &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorWinConstructor, |
|
247 Module::MAIN_PROCESS_ONLY }, |
|
248 { &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor, |
|
249 Module::MAIN_PROCESS_ONLY }, |
|
250 { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecWinConstructor, |
|
251 Module::MAIN_PROCESS_ONLY }, |
|
252 #endif |
|
253 { nullptr } |
|
254 }; |
|
255 |
|
256 static const mozilla::Module::ContractIDEntry kWidgetContracts[] = { |
|
257 { "@mozilla.org/widgets/window/win;1", &kNS_WINDOW_CID }, |
|
258 { "@mozilla.org/widgets/child_window/win;1", &kNS_CHILD_CID }, |
|
259 { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY }, |
|
260 { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY }, |
|
261 { "@mozilla.org/widget/appshell/win;1", &kNS_APPSHELL_CID }, |
|
262 { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID }, |
|
263 { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID }, |
|
264 { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID }, |
|
265 { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID }, |
|
266 { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID, Module::MAIN_PROCESS_ONLY }, |
|
267 { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID }, |
|
268 { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY }, |
|
269 { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID }, |
|
270 { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID }, |
|
271 { "@mozilla.org/windows-taskbar;1", &kNS_WIN_TASKBAR_CID }, |
|
272 { "@mozilla.org/windows-jumplistbuilder;1", &kNS_WIN_JUMPLISTBUILDER_CID }, |
|
273 { "@mozilla.org/windows-jumplistitem;1", &kNS_WIN_JUMPLISTITEM_CID }, |
|
274 { "@mozilla.org/windows-jumplistseparator;1", &kNS_WIN_JUMPLISTSEPARATOR_CID }, |
|
275 { "@mozilla.org/windows-jumplistlink;1", &kNS_WIN_JUMPLISTLINK_CID }, |
|
276 { "@mozilla.org/windows-jumplistshortcut;1", &kNS_WIN_JUMPLISTSHORTCUT_CID }, |
|
277 { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID, Module::MAIN_PROCESS_ONLY }, |
|
278 { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID }, |
|
279 #ifdef MOZ_METRO |
|
280 { "@mozilla.org/windows-metroutils;1", &kNS_WIN_METROUTILS_CID }, |
|
281 #endif |
|
282 #ifdef NS_PRINTING |
|
283 { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID }, |
|
284 { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID, |
|
285 Module::MAIN_PROCESS_ONLY }, |
|
286 { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID, |
|
287 Module::MAIN_PROCESS_ONLY }, |
|
288 { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID, |
|
289 Module::MAIN_PROCESS_ONLY }, |
|
290 #endif |
|
291 { nullptr } |
|
292 }; |
|
293 |
|
294 static void |
|
295 nsWidgetWindowsModuleDtor() |
|
296 { |
|
297 KeyboardLayout::Shutdown(); |
|
298 MouseScrollHandler::Shutdown(); |
|
299 nsLookAndFeel::Shutdown(); |
|
300 nsToolkit::Shutdown(); |
|
301 nsAppShellShutdown(); |
|
302 } |
|
303 |
|
304 static const mozilla::Module kWidgetModule = { |
|
305 mozilla::Module::kVersion, |
|
306 kWidgetCIDs, |
|
307 kWidgetContracts, |
|
308 nullptr, |
|
309 nullptr, |
|
310 nsAppShellInit, |
|
311 nsWidgetWindowsModuleDtor |
|
312 }; |
|
313 |
|
314 NSMODULE_DEFN(nsWidgetModule) = &kWidgetModule; |