1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim:expandtab:shiftwidth=4:tabstop=4:
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/. */
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"
16 #include "nsTransferable.h"
17 #include "nsHTMLFormatConverter.h"
19 #include "nsClipboardHelper.h"
20 #include "nsClipboard.h"
21 #include "nsDragService.h"
23 #include "nsColorPicker.h"
24 #include "nsFilePicker.h"
26 #include "nsBidiKeyboard.h"
27 #include "nsScreenManagerGtk.h"
28 #include "nsGTKToolkit.h"
29 #include "WakeLockListener.h"
32 #include "nsPrintOptionsGTK.h"
33 #include "nsPrintSession.h"
34 #include "nsDeviceContextSpecG.h"
37 #include "mozilla/Preferences.h"
39 #include "nsImageToPixbuf.h"
40 #include "nsPrintDialogGTK.h"
43 #include "nsIdleServiceGTK.h"
44 #include "GfxInfoX11.h"
47 #include "nsNativeThemeGTK.h"
49 #include "nsIComponentRegistrar.h"
50 #include "nsComponentManagerUtils.h"
51 #include "nsAutoPtr.h"
52 #include "mozilla/gfx/2D.h"
55 using namespace mozilla
;
56 using namespace mozilla::widget
;
58 /* from nsFilePicker.js */
59 #define XULFILEPICKER_CID \
60 { 0x54ae32f8, 0x1dd2, 0x11b2, \
61 { 0xa2, 0x09, 0xdf, 0x7c, 0x50, 0x53, 0x70, 0xf8} }
62 static NS_DEFINE_CID(kXULFilePickerCID
, XULFILEPICKER_CID
);
64 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow
)
65 NS_GENERIC_FACTORY_CONSTRUCTOR(nsChildWindow
)
66 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable
)
67 NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard
)
68 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter
)
70 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGTK
, nsIdleServiceGTK::GetInstance
)
71 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper
)
72 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsClipboard
, Init
)
73 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService
)
75 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound
)
76 NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerGtk
)
77 NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf
)
81 extern bool gDisableNativeTheme
;
84 nsNativeThemeGTKConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
88 nsNativeThemeGTK
* inst
;
90 if (gDisableNativeTheme
)
91 return NS_ERROR_NO_INTERFACE
;
94 if (nullptr != aOuter
) {
95 rv
= NS_ERROR_NO_AGGREGATION
;
99 inst
= new nsNativeThemeGTK();
100 if (nullptr == inst
) {
101 rv
= NS_ERROR_OUT_OF_MEMORY
;
105 rv
= inst
->QueryInterface(aIID
, aResult
);
114 // This constructor should really be shared with all platforms.
115 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo
, Init
)
121 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK
)
122 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsGTK
, Init
)
123 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK
)
124 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession
, Init
)
125 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK
, Init
)
129 nsFilePickerConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
133 if (aOuter
!= nullptr) {
134 return NS_ERROR_NO_AGGREGATION
;
137 bool allowPlatformPicker
=
138 Preferences::GetBool("ui.allow_platform_file_picker", true);
140 nsCOMPtr
<nsIFilePicker
> picker
;
141 if (allowPlatformPicker
) {
142 picker
= new nsFilePicker
;
144 picker
= do_CreateInstance(kXULFilePickerCID
);
148 return NS_ERROR_OUT_OF_MEMORY
;
151 return picker
->QueryInterface(aIID
, aResult
);
155 nsColorPickerConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
159 if (aOuter
!= nullptr) {
160 return NS_ERROR_NO_AGGREGATION
;
163 nsCOMPtr
<nsIColorPicker
> picker
= new nsColorPicker
;
166 return NS_ERROR_OUT_OF_MEMORY
;
169 return picker
->QueryInterface(aIID
, aResult
);
172 NS_DEFINE_NAMED_CID(NS_WINDOW_CID
);
173 NS_DEFINE_NAMED_CID(NS_CHILD_CID
);
174 NS_DEFINE_NAMED_CID(NS_APPSHELL_CID
);
175 NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID
);
176 NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID
);
177 NS_DEFINE_NAMED_CID(NS_SOUND_CID
);
178 NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID
);
180 NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID
);
181 NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID
);
182 NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID
);
184 NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID
);
185 NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID
);
186 NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID
);
187 NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID
);
189 NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID
);
190 NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID
);
191 NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID
);
192 NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID
);
193 NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID
);
195 NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID
);
197 NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID
);
198 NS_DEFINE_NAMED_CID(NS_GFXINFO_CID
);
202 static const mozilla::Module::CIDEntry kWidgetCIDs
[] = {
203 { &kNS_WINDOW_CID
, false, nullptr, nsWindowConstructor
},
204 { &kNS_CHILD_CID
, false, nullptr, nsChildWindowConstructor
},
205 { &kNS_APPSHELL_CID
, false, nullptr, nsAppShellConstructor
},
206 { &kNS_COLORPICKER_CID
, false, nullptr, nsColorPickerConstructor
, Module::MAIN_PROCESS_ONLY
},
207 { &kNS_FILEPICKER_CID
, false, nullptr, nsFilePickerConstructor
, Module::MAIN_PROCESS_ONLY
},
208 { &kNS_SOUND_CID
, false, nullptr, nsSoundConstructor
, Module::MAIN_PROCESS_ONLY
},
209 { &kNS_TRANSFERABLE_CID
, false, nullptr, nsTransferableConstructor
},
211 { &kNS_CLIPBOARD_CID
, false, nullptr, nsClipboardConstructor
, Module::MAIN_PROCESS_ONLY
},
212 { &kNS_CLIPBOARDHELPER_CID
, false, nullptr, nsClipboardHelperConstructor
},
213 { &kNS_DRAGSERVICE_CID
, false, nullptr, nsDragServiceConstructor
, Module::MAIN_PROCESS_ONLY
},
215 { &kNS_HTMLFORMATCONVERTER_CID
, false, nullptr, nsHTMLFormatConverterConstructor
},
216 { &kNS_BIDIKEYBOARD_CID
, false, nullptr, nsBidiKeyboardConstructor
},
217 { &kNS_SCREENMANAGER_CID
, false, nullptr, nsScreenManagerGtkConstructor
,
218 Module::MAIN_PROCESS_ONLY
},
219 { &kNS_THEMERENDERER_CID
, false, nullptr, nsNativeThemeGTKConstructor
},
221 { &kNS_PRINTSETTINGSSERVICE_CID
, false, nullptr, nsPrintOptionsGTKConstructor
},
222 { &kNS_PRINTER_ENUMERATOR_CID
, false, nullptr, nsPrinterEnumeratorGTKConstructor
,
223 Module::MAIN_PROCESS_ONLY
},
224 { &kNS_PRINTSESSION_CID
, false, nullptr, nsPrintSessionConstructor
,
225 Module::MAIN_PROCESS_ONLY
},
226 { &kNS_DEVICE_CONTEXT_SPEC_CID
, false, nullptr, nsDeviceContextSpecGTKConstructor
,
227 Module::MAIN_PROCESS_ONLY
},
228 { &kNS_PRINTDIALOGSERVICE_CID
, false, nullptr, nsPrintDialogServiceGTKConstructor
,
229 Module::MAIN_PROCESS_ONLY
},
231 { &kNS_IMAGE_TO_PIXBUF_CID
, false, nullptr, nsImageToPixbufConstructor
},
233 { &kNS_IDLE_SERVICE_CID
, false, nullptr, nsIdleServiceGTKConstructor
},
234 { &kNS_GFXINFO_CID
, false, nullptr, mozilla::widget::GfxInfoConstructor
},
239 static const mozilla::Module::ContractIDEntry kWidgetContracts
[] = {
240 { "@mozilla.org/widget/window/gtk;1", &kNS_WINDOW_CID
},
241 { "@mozilla.org/widgets/child_window/gtk;1", &kNS_CHILD_CID
},
242 { "@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID
},
243 { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID
, Module::MAIN_PROCESS_ONLY
},
244 { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID
, Module::MAIN_PROCESS_ONLY
},
245 { "@mozilla.org/sound;1", &kNS_SOUND_CID
, Module::MAIN_PROCESS_ONLY
},
246 { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID
},
248 { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID
, Module::MAIN_PROCESS_ONLY
},
249 { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID
},
250 { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID
, Module::MAIN_PROCESS_ONLY
},
252 { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID
},
253 { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID
},
254 { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID
,
255 Module::MAIN_PROCESS_ONLY
},
256 { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID
},
258 { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID
},
259 { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID
,
260 Module::MAIN_PROCESS_ONLY
},
261 { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID
,
262 Module::MAIN_PROCESS_ONLY
},
263 { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID
,
264 Module::MAIN_PROCESS_ONLY
},
265 { NS_PRINTDIALOGSERVICE_CONTRACTID
, &kNS_PRINTDIALOGSERVICE_CID
,
266 Module::MAIN_PROCESS_ONLY
},
268 { "@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID
},
270 { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID
},
271 { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID
},
277 nsWidgetGtk2ModuleDtor()
279 NativeKeyBindings::Shutdown();
280 nsLookAndFeel::Shutdown();
281 nsFilePicker::Shutdown();
283 nsWindow::ReleaseGlobals();
284 nsGTKToolkit::Shutdown();
285 nsAppShellShutdown();
286 #ifdef MOZ_ENABLE_DBUS
287 WakeLockListener::Shutdown();
291 static const mozilla::Module kWidgetModule
= {
292 mozilla::Module::kVersion
,
298 nsWidgetGtk2ModuleDtor
301 NSMODULE_DEFN(nsWidgetGtk2Module
) = &kWidgetModule
;