1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim:expandtab:shiftwidth=4:tabstop=4:
3 */
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8 #include "mozilla/ModuleUtils.h"
9 #include "mozilla/WidgetUtils.h"
10 #include "NativeKeyBindings.h"
11 #include "nsWidgetsCID.h"
12 #include "nsAppShell.h"
13 #include "nsAppShellSingleton.h"
14 #include "nsBaseWidget.h"
15 #include "nsGtkKeyUtils.h"
16 #include "nsLookAndFeel.h"
17 #include "nsWindow.h"
18 #include "nsTransferable.h"
19 #include "nsHTMLFormatConverter.h"
20 #include "HeadlessClipboard.h"
21 #include "IMContextWrapper.h"
22 #ifdef MOZ_X11
23 #include "nsClipboardHelper.h"
24 #include "nsClipboard.h"
25 #include "nsDragService.h"
26 #endif
27 #ifdef MOZ_WIDGET_GTK
28 #include "nsApplicationChooser.h"
29 #endif
30 #include "nsColorPicker.h"
31 #include "nsFilePicker.h"
32 #include "nsSound.h"
33 #include "nsBidiKeyboard.h"
34 #include "nsGTKToolkit.h"
35 #include "WakeLockListener.h"
36
37 #ifdef NS_PRINTING
38 #include "nsPrintSettingsServiceGTK.h"
39 #include "nsPrintSession.h"
40 #include "nsDeviceContextSpecG.h"
41 #endif
42
43 #include "nsImageToPixbuf.h"
44 #include "nsPrintDialogGTK.h"
45
46 #if defined(MOZ_X11)
47 #include "nsIdleServiceGTK.h"
48 #include "GfxInfoX11.h"
49 #endif
50
51 #include "nsNativeThemeGTK.h"
52 #include "HeadlessThemeGTK.h"
53
54 #include "nsIComponentRegistrar.h"
55 #include "nsComponentManagerUtils.h"
56 #include "mozilla/gfx/2D.h"
57 #include "mozilla/widget/ScreenManager.h"
58 #include <gtk/gtk.h>
59
60 using namespace mozilla;
61 using namespace mozilla::widget;
62
63 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow)
64 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable)
65 NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard)
66 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter)
67 #ifdef MOZ_X11
68 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGTK,
69 nsIdleServiceGTK::GetInstance)
70 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper)
71 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsDragService,
72 nsDragService::GetInstance)
73 #endif
74 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsISound, nsSound::GetInstance)
75 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(ScreenManager,
76 ScreenManager::GetAddRefedSingleton)
77 NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf)
78
79 // from nsWindow.cpp
80 extern bool gDisableNativeTheme;
81
nsNativeThemeGTKConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)82 static nsresult nsNativeThemeGTKConstructor(nsISupports *aOuter, REFNSIID aIID,
83 void **aResult) {
84 nsresult rv;
85 nsCOMPtr<nsITheme> inst;
86
87 if (gDisableNativeTheme) return NS_ERROR_NO_INTERFACE;
88
89 *aResult = nullptr;
90 if (nullptr != aOuter) {
91 rv = NS_ERROR_NO_AGGREGATION;
92 return rv;
93 }
94 if (gfxPlatform::IsHeadless()) {
95 inst = new HeadlessThemeGTK();
96 } else {
97 inst = new nsNativeThemeGTK();
98 }
99 if (nullptr == inst) {
100 rv = NS_ERROR_OUT_OF_MEMORY;
101 return rv;
102 }
103 rv = inst->QueryInterface(aIID, aResult);
104
105 return rv;
106 }
107
108 #if defined(MOZ_X11)
109 namespace mozilla {
110 namespace widget {
111 // This constructor should really be shared with all platforms.
112 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init)
113 } // namespace widget
114 } // namespace mozilla
115 #endif
116
117 #ifdef NS_PRINTING
118 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSettingsServiceGTK,Init)119 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSettingsServiceGTK, Init)
120 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK)
121 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
122 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK, Init)
123 #endif
124
125 static nsresult nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
126 void **aResult) {
127 *aResult = nullptr;
128 if (aOuter != nullptr) {
129 return NS_ERROR_NO_AGGREGATION;
130 }
131
132 nsCOMPtr<nsIFilePicker> picker = new nsFilePicker;
133
134 return picker->QueryInterface(aIID, aResult);
135 }
136
137 #ifdef MOZ_WIDGET_GTK
nsApplicationChooserConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)138 static nsresult nsApplicationChooserConstructor(nsISupports *aOuter,
139 REFNSIID aIID, void **aResult) {
140 *aResult = nullptr;
141 if (aOuter != nullptr) {
142 return NS_ERROR_NO_AGGREGATION;
143 }
144 nsCOMPtr<nsIApplicationChooser> chooser = new nsApplicationChooser;
145
146 if (!chooser) {
147 return NS_ERROR_OUT_OF_MEMORY;
148 }
149
150 return chooser->QueryInterface(aIID, aResult);
151 }
152 #endif
153
nsColorPickerConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)154 static nsresult nsColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID,
155 void **aResult) {
156 *aResult = nullptr;
157 if (aOuter != nullptr) {
158 return NS_ERROR_NO_AGGREGATION;
159 }
160
161 nsCOMPtr<nsIColorPicker> picker = new nsColorPicker;
162
163 if (!picker) {
164 return NS_ERROR_OUT_OF_MEMORY;
165 }
166
167 return picker->QueryInterface(aIID, aResult);
168 }
169
nsClipboardConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)170 static nsresult nsClipboardConstructor(nsISupports *aOuter, REFNSIID aIID,
171 void **aResult) {
172 *aResult = nullptr;
173 if (aOuter != nullptr) {
174 return NS_ERROR_NO_AGGREGATION;
175 }
176
177 nsCOMPtr<nsIClipboard> inst;
178 if (gfxPlatform::IsHeadless()) {
179 inst = new HeadlessClipboard();
180 } else {
181 RefPtr<nsClipboard> clipboard = new nsClipboard();
182 nsresult rv = clipboard->Init();
183 NS_ENSURE_SUCCESS(rv, rv);
184 inst = clipboard;
185 }
186
187 return inst->QueryInterface(aIID, aResult);
188 }
189
190 NS_DEFINE_NAMED_CID(NS_WINDOW_CID);
191 NS_DEFINE_NAMED_CID(NS_CHILD_CID);
192 NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
193 NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID);
194 NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
195 #ifdef MOZ_WIDGET_GTK
196 NS_DEFINE_NAMED_CID(NS_APPLICATIONCHOOSER_CID);
197 #endif
198 NS_DEFINE_NAMED_CID(NS_SOUND_CID);
199 NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
200 #ifdef MOZ_X11
201 NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
202 NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
203 NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
204 #endif
205 NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
206 NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
207 NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
208 NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID);
209 #ifdef NS_PRINTING
210 NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
211 NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
212 NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
213 NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
214 NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID);
215 #endif
216 NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID);
217 #if defined(MOZ_X11)
218 NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
219 NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
220 #endif
221
222 static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
223 {&kNS_WINDOW_CID, false, nullptr, nsWindowConstructor},
224 {&kNS_CHILD_CID, false, nullptr, nsWindowConstructor},
225 {&kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor,
226 Module::ALLOW_IN_GPU_PROCESS},
227 {&kNS_COLORPICKER_CID, false, nullptr, nsColorPickerConstructor,
228 Module::MAIN_PROCESS_ONLY},
229 {&kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor,
230 Module::MAIN_PROCESS_ONLY},
231 #ifdef MOZ_WIDGET_GTK
232 {&kNS_APPLICATIONCHOOSER_CID, false, nullptr,
233 nsApplicationChooserConstructor, Module::MAIN_PROCESS_ONLY},
234 #endif
235 {&kNS_SOUND_CID, false, nullptr, nsISoundConstructor,
236 Module::MAIN_PROCESS_ONLY},
237 {&kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor},
238 #ifdef MOZ_X11
239 {&kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor,
240 Module::MAIN_PROCESS_ONLY},
241 {&kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor},
242 {&kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor,
243 Module::MAIN_PROCESS_ONLY},
244 #endif
245 {&kNS_HTMLFORMATCONVERTER_CID, false, nullptr,
246 nsHTMLFormatConverterConstructor},
247 {&kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor},
248 {&kNS_SCREENMANAGER_CID, false, nullptr, ScreenManagerConstructor,
249 Module::MAIN_PROCESS_ONLY},
250 {&kNS_THEMERENDERER_CID, false, nullptr, nsNativeThemeGTKConstructor},
251 #ifdef NS_PRINTING
252 {&kNS_PRINTSETTINGSSERVICE_CID, false, nullptr,
253 nsPrintSettingsServiceGTKConstructor},
254 {&kNS_PRINTER_ENUMERATOR_CID, false, nullptr,
255 nsPrinterEnumeratorGTKConstructor},
256 {&kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor},
257 {&kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr,
258 nsDeviceContextSpecGTKConstructor},
259 {&kNS_PRINTDIALOGSERVICE_CID, false, nullptr,
260 nsPrintDialogServiceGTKConstructor},
261 #endif
262 {&kNS_IMAGE_TO_PIXBUF_CID, false, nullptr, nsImageToPixbufConstructor},
263 #if defined(MOZ_X11)
264 {&kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceGTKConstructor},
265 {&kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor},
266 #endif
267 {nullptr}};
268
269 static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
270 {"@mozilla.org/widget/window/gtk;1", &kNS_WINDOW_CID},
271 {"@mozilla.org/widgets/child_window/gtk;1", &kNS_CHILD_CID},
272 {"@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID,
273 Module::ALLOW_IN_GPU_PROCESS},
274 {"@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID,
275 Module::MAIN_PROCESS_ONLY},
276 {"@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID,
277 Module::MAIN_PROCESS_ONLY},
278 #ifdef MOZ_WIDGET_GTK
279 {"@mozilla.org/applicationchooser;1", &kNS_APPLICATIONCHOOSER_CID,
280 Module::MAIN_PROCESS_ONLY},
281 #endif
282 {"@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY},
283 {"@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID},
284 #ifdef MOZ_X11
285 {"@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID,
286 Module::MAIN_PROCESS_ONLY},
287 {"@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID},
288 {"@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID,
289 Module::MAIN_PROCESS_ONLY},
290 #endif
291 {"@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID},
292 {"@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID,
293 Module::MAIN_PROCESS_ONLY},
294 {"@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID,
295 Module::MAIN_PROCESS_ONLY},
296 {"@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID},
297 #ifdef NS_PRINTING
298 {"@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID},
299 {"@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID},
300 {"@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID},
301 {"@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID},
302 {NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID},
303 #endif
304 {"@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID},
305 #if defined(MOZ_X11)
306 {"@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID},
307 {"@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID},
308 #endif
309 {nullptr}};
310
nsWidgetGtk2ModuleDtor()311 static void nsWidgetGtk2ModuleDtor() {
312 // Shutdown all XP level widget classes.
313 WidgetUtils::Shutdown();
314
315 NativeKeyBindings::Shutdown();
316 nsLookAndFeel::Shutdown();
317 nsFilePicker::Shutdown();
318 nsSound::Shutdown();
319 nsWindow::ReleaseGlobals();
320 IMContextWrapper::Shutdown();
321 KeymapWrapper::Shutdown();
322 nsGTKToolkit::Shutdown();
323 nsAppShellShutdown();
324 #ifdef MOZ_ENABLE_DBUS
325 WakeLockListener::Shutdown();
326 #endif
327 }
328
329 static const mozilla::Module kWidgetModule = {mozilla::Module::kVersion,
330 kWidgetCIDs,
331 kWidgetContracts,
332 nullptr,
333 nullptr,
334 nsAppShellInit,
335 nsWidgetGtk2ModuleDtor,
336 Module::ALLOW_IN_GPU_PROCESS};
337
338 NSMODULE_DEFN(nsWidgetGtk2Module) = &kWidgetModule;
339