|
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 "NativeKeyBindings.h" |
|
10 #include "nsWidgetsCID.h" |
|
11 #include "nsAppShell.h" |
|
12 #include "nsAppShellSingleton.h" |
|
13 #include "nsBaseWidget.h" |
|
14 #include "nsLookAndFeel.h" |
|
15 #include "nsWindow.h" |
|
16 #include "nsTransferable.h" |
|
17 #include "nsHTMLFormatConverter.h" |
|
18 #ifdef MOZ_X11 |
|
19 #include "nsClipboardHelper.h" |
|
20 #include "nsClipboard.h" |
|
21 #include "nsDragService.h" |
|
22 #endif |
|
23 #include "nsColorPicker.h" |
|
24 #include "nsFilePicker.h" |
|
25 #include "nsSound.h" |
|
26 #include "nsBidiKeyboard.h" |
|
27 #include "nsScreenManagerGtk.h" |
|
28 #include "nsGTKToolkit.h" |
|
29 |
|
30 #ifdef NS_PRINTING |
|
31 #include "nsPrintOptionsGTK.h" |
|
32 #include "nsPrintSession.h" |
|
33 #include "nsDeviceContextSpecG.h" |
|
34 #endif |
|
35 |
|
36 #include "mozilla/Preferences.h" |
|
37 |
|
38 #include "nsImageToPixbuf.h" |
|
39 #include "nsPrintDialogGTK.h" |
|
40 |
|
41 #if defined(MOZ_X11) |
|
42 #include "nsIdleServiceGTK.h" |
|
43 #include "GfxInfoX11.h" |
|
44 #endif |
|
45 |
|
46 #include "nsNativeThemeGTK.h" |
|
47 |
|
48 #include "nsIComponentRegistrar.h" |
|
49 #include "nsComponentManagerUtils.h" |
|
50 #include "nsAutoPtr.h" |
|
51 #include "mozilla/gfx/2D.h" |
|
52 #include <gtk/gtk.h> |
|
53 |
|
54 using namespace mozilla; |
|
55 using namespace mozilla::widget; |
|
56 |
|
57 /* from nsFilePicker.js */ |
|
58 #define XULFILEPICKER_CID \ |
|
59 { 0x54ae32f8, 0x1dd2, 0x11b2, \ |
|
60 { 0xa2, 0x09, 0xdf, 0x7c, 0x50, 0x53, 0x70, 0xf8} } |
|
61 static NS_DEFINE_CID(kXULFilePickerCID, XULFILEPICKER_CID); |
|
62 |
|
63 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow) |
|
64 NS_GENERIC_FACTORY_CONSTRUCTOR(nsChildWindow) |
|
65 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable) |
|
66 NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard) |
|
67 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter) |
|
68 #ifdef MOZ_X11 |
|
69 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGTK, nsIdleServiceGTK::GetInstance) |
|
70 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper) |
|
71 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsClipboard, Init) |
|
72 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService) |
|
73 #endif |
|
74 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound) |
|
75 NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerGtk) |
|
76 NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf) |
|
77 |
|
78 |
|
79 // from nsWindow.cpp |
|
80 extern bool gDisableNativeTheme; |
|
81 |
|
82 static nsresult |
|
83 nsNativeThemeGTKConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
84 void **aResult) |
|
85 { |
|
86 nsresult rv; |
|
87 nsNativeThemeGTK * inst; |
|
88 |
|
89 if (gDisableNativeTheme) |
|
90 return NS_ERROR_NO_INTERFACE; |
|
91 |
|
92 *aResult = nullptr; |
|
93 if (nullptr != aOuter) { |
|
94 rv = NS_ERROR_NO_AGGREGATION; |
|
95 return rv; |
|
96 } |
|
97 |
|
98 inst = new nsNativeThemeGTK(); |
|
99 if (nullptr == inst) { |
|
100 rv = NS_ERROR_OUT_OF_MEMORY; |
|
101 return rv; |
|
102 } |
|
103 NS_ADDREF(inst); |
|
104 rv = inst->QueryInterface(aIID, aResult); |
|
105 NS_RELEASE(inst); |
|
106 |
|
107 return rv; |
|
108 } |
|
109 |
|
110 #if defined(MOZ_X11) |
|
111 namespace mozilla { |
|
112 namespace widget { |
|
113 // This constructor should really be shared with all platforms. |
|
114 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init) |
|
115 } |
|
116 } |
|
117 #endif |
|
118 |
|
119 #ifdef NS_PRINTING |
|
120 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK) |
|
121 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsGTK, Init) |
|
122 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK) |
|
123 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init) |
|
124 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK, Init) |
|
125 #endif |
|
126 |
|
127 static nsresult |
|
128 nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
129 void **aResult) |
|
130 { |
|
131 *aResult = nullptr; |
|
132 if (aOuter != nullptr) { |
|
133 return NS_ERROR_NO_AGGREGATION; |
|
134 } |
|
135 |
|
136 bool allowPlatformPicker = |
|
137 Preferences::GetBool("ui.allow_platform_file_picker", true); |
|
138 |
|
139 nsCOMPtr<nsIFilePicker> picker; |
|
140 if (allowPlatformPicker) { |
|
141 picker = new nsFilePicker; |
|
142 } else { |
|
143 picker = do_CreateInstance(kXULFilePickerCID); |
|
144 } |
|
145 |
|
146 if (!picker) { |
|
147 return NS_ERROR_OUT_OF_MEMORY; |
|
148 } |
|
149 |
|
150 return picker->QueryInterface(aIID, aResult); |
|
151 } |
|
152 |
|
153 static nsresult |
|
154 nsColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID, |
|
155 void **aResult) |
|
156 { |
|
157 *aResult = nullptr; |
|
158 if (aOuter != nullptr) { |
|
159 return NS_ERROR_NO_AGGREGATION; |
|
160 } |
|
161 |
|
162 nsCOMPtr<nsIColorPicker> picker = new nsColorPicker; |
|
163 |
|
164 if (!picker) { |
|
165 return NS_ERROR_OUT_OF_MEMORY; |
|
166 } |
|
167 |
|
168 return picker->QueryInterface(aIID, aResult); |
|
169 } |
|
170 |
|
171 NS_DEFINE_NAMED_CID(NS_WINDOW_CID); |
|
172 NS_DEFINE_NAMED_CID(NS_CHILD_CID); |
|
173 NS_DEFINE_NAMED_CID(NS_APPSHELL_CID); |
|
174 NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID); |
|
175 NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID); |
|
176 NS_DEFINE_NAMED_CID(NS_SOUND_CID); |
|
177 NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID); |
|
178 #ifdef MOZ_X11 |
|
179 NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID); |
|
180 NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID); |
|
181 NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID); |
|
182 #endif |
|
183 NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID); |
|
184 NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID); |
|
185 NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID); |
|
186 NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID); |
|
187 #ifdef NS_PRINTING |
|
188 NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID); |
|
189 NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID); |
|
190 NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID); |
|
191 NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID); |
|
192 NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID); |
|
193 #endif |
|
194 NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID); |
|
195 #if defined(MOZ_X11) |
|
196 NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID); |
|
197 NS_DEFINE_NAMED_CID(NS_GFXINFO_CID); |
|
198 #endif |
|
199 |
|
200 |
|
201 static const mozilla::Module::CIDEntry kWidgetCIDs[] = { |
|
202 { &kNS_WINDOW_CID, false, nullptr, nsWindowConstructor }, |
|
203 { &kNS_CHILD_CID, false, nullptr, nsChildWindowConstructor }, |
|
204 { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor }, |
|
205 { &kNS_COLORPICKER_CID, false, nullptr, nsColorPickerConstructor, Module::MAIN_PROCESS_ONLY }, |
|
206 { &kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor, Module::MAIN_PROCESS_ONLY }, |
|
207 { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor, Module::MAIN_PROCESS_ONLY }, |
|
208 { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor }, |
|
209 #ifdef MOZ_X11 |
|
210 { &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor, Module::MAIN_PROCESS_ONLY }, |
|
211 { &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor }, |
|
212 { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor, Module::MAIN_PROCESS_ONLY }, |
|
213 #endif |
|
214 { &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor }, |
|
215 { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor }, |
|
216 { &kNS_SCREENMANAGER_CID, false, nullptr, nsScreenManagerGtkConstructor }, |
|
217 { &kNS_THEMERENDERER_CID, false, nullptr, nsNativeThemeGTKConstructor }, |
|
218 #ifdef NS_PRINTING |
|
219 { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsGTKConstructor }, |
|
220 { &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorGTKConstructor, |
|
221 Module::MAIN_PROCESS_ONLY }, |
|
222 { &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor, |
|
223 Module::MAIN_PROCESS_ONLY }, |
|
224 { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecGTKConstructor, |
|
225 Module::MAIN_PROCESS_ONLY }, |
|
226 { &kNS_PRINTDIALOGSERVICE_CID, false, nullptr, nsPrintDialogServiceGTKConstructor, |
|
227 Module::MAIN_PROCESS_ONLY }, |
|
228 #endif |
|
229 { &kNS_IMAGE_TO_PIXBUF_CID, false, nullptr, nsImageToPixbufConstructor }, |
|
230 #if defined(MOZ_X11) |
|
231 { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceGTKConstructor }, |
|
232 { &kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor }, |
|
233 #endif |
|
234 { nullptr } |
|
235 }; |
|
236 |
|
237 static const mozilla::Module::ContractIDEntry kWidgetContracts[] = { |
|
238 { "@mozilla.org/widget/window/gtk;1", &kNS_WINDOW_CID }, |
|
239 { "@mozilla.org/widgets/child_window/gtk;1", &kNS_CHILD_CID }, |
|
240 { "@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID }, |
|
241 { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY }, |
|
242 { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY }, |
|
243 { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY }, |
|
244 { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID }, |
|
245 #ifdef MOZ_X11 |
|
246 { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID, Module::MAIN_PROCESS_ONLY }, |
|
247 { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID }, |
|
248 { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID, Module::MAIN_PROCESS_ONLY }, |
|
249 #endif |
|
250 { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID }, |
|
251 { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID }, |
|
252 { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID }, |
|
253 { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID }, |
|
254 #ifdef NS_PRINTING |
|
255 { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID }, |
|
256 { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID, |
|
257 Module::MAIN_PROCESS_ONLY }, |
|
258 { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID, |
|
259 Module::MAIN_PROCESS_ONLY }, |
|
260 { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID, |
|
261 Module::MAIN_PROCESS_ONLY }, |
|
262 { NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID, |
|
263 Module::MAIN_PROCESS_ONLY }, |
|
264 #endif |
|
265 { "@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID }, |
|
266 #if defined(MOZ_X11) |
|
267 { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID }, |
|
268 { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID }, |
|
269 #endif |
|
270 { nullptr } |
|
271 }; |
|
272 |
|
273 static void |
|
274 nsWidgetGtk2ModuleDtor() |
|
275 { |
|
276 NativeKeyBindings::Shutdown(); |
|
277 nsLookAndFeel::Shutdown(); |
|
278 nsFilePicker::Shutdown(); |
|
279 nsSound::Shutdown(); |
|
280 nsWindow::ReleaseGlobals(); |
|
281 nsGTKToolkit::Shutdown(); |
|
282 nsAppShellShutdown(); |
|
283 } |
|
284 |
|
285 static const mozilla::Module kWidgetModule = { |
|
286 mozilla::Module::kVersion, |
|
287 kWidgetCIDs, |
|
288 kWidgetContracts, |
|
289 nullptr, |
|
290 nullptr, |
|
291 nsAppShellInit, |
|
292 nsWidgetGtk2ModuleDtor |
|
293 }; |
|
294 |
|
295 NSMODULE_DEFN(nsWidgetGtk2Module) = &kWidgetModule; |