1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/widget/gtk/nsWidgetFactory.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,295 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* vim:expandtab:shiftwidth=4:tabstop=4: 1.6 + */ 1.7 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.8 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.9 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.10 + 1.11 +#include "mozilla/ModuleUtils.h" 1.12 +#include "NativeKeyBindings.h" 1.13 +#include "nsWidgetsCID.h" 1.14 +#include "nsAppShell.h" 1.15 +#include "nsAppShellSingleton.h" 1.16 +#include "nsBaseWidget.h" 1.17 +#include "nsLookAndFeel.h" 1.18 +#include "nsWindow.h" 1.19 +#include "nsTransferable.h" 1.20 +#include "nsHTMLFormatConverter.h" 1.21 +#ifdef MOZ_X11 1.22 +#include "nsClipboardHelper.h" 1.23 +#include "nsClipboard.h" 1.24 +#include "nsDragService.h" 1.25 +#endif 1.26 +#include "nsColorPicker.h" 1.27 +#include "nsFilePicker.h" 1.28 +#include "nsSound.h" 1.29 +#include "nsBidiKeyboard.h" 1.30 +#include "nsScreenManagerGtk.h" 1.31 +#include "nsGTKToolkit.h" 1.32 + 1.33 +#ifdef NS_PRINTING 1.34 +#include "nsPrintOptionsGTK.h" 1.35 +#include "nsPrintSession.h" 1.36 +#include "nsDeviceContextSpecG.h" 1.37 +#endif 1.38 + 1.39 +#include "mozilla/Preferences.h" 1.40 + 1.41 +#include "nsImageToPixbuf.h" 1.42 +#include "nsPrintDialogGTK.h" 1.43 + 1.44 +#if defined(MOZ_X11) 1.45 +#include "nsIdleServiceGTK.h" 1.46 +#include "GfxInfoX11.h" 1.47 +#endif 1.48 + 1.49 +#include "nsNativeThemeGTK.h" 1.50 + 1.51 +#include "nsIComponentRegistrar.h" 1.52 +#include "nsComponentManagerUtils.h" 1.53 +#include "nsAutoPtr.h" 1.54 +#include "mozilla/gfx/2D.h" 1.55 +#include <gtk/gtk.h> 1.56 + 1.57 +using namespace mozilla; 1.58 +using namespace mozilla::widget; 1.59 + 1.60 +/* from nsFilePicker.js */ 1.61 +#define XULFILEPICKER_CID \ 1.62 + { 0x54ae32f8, 0x1dd2, 0x11b2, \ 1.63 + { 0xa2, 0x09, 0xdf, 0x7c, 0x50, 0x53, 0x70, 0xf8} } 1.64 +static NS_DEFINE_CID(kXULFilePickerCID, XULFILEPICKER_CID); 1.65 + 1.66 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow) 1.67 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsChildWindow) 1.68 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable) 1.69 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard) 1.70 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter) 1.71 +#ifdef MOZ_X11 1.72 +NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGTK, nsIdleServiceGTK::GetInstance) 1.73 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper) 1.74 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsClipboard, Init) 1.75 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService) 1.76 +#endif 1.77 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound) 1.78 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerGtk) 1.79 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf) 1.80 + 1.81 + 1.82 +// from nsWindow.cpp 1.83 +extern bool gDisableNativeTheme; 1.84 + 1.85 +static nsresult 1.86 +nsNativeThemeGTKConstructor(nsISupports *aOuter, REFNSIID aIID, 1.87 + void **aResult) 1.88 +{ 1.89 + nsresult rv; 1.90 + nsNativeThemeGTK * inst; 1.91 + 1.92 + if (gDisableNativeTheme) 1.93 + return NS_ERROR_NO_INTERFACE; 1.94 + 1.95 + *aResult = nullptr; 1.96 + if (nullptr != aOuter) { 1.97 + rv = NS_ERROR_NO_AGGREGATION; 1.98 + return rv; 1.99 + } 1.100 + 1.101 + inst = new nsNativeThemeGTK(); 1.102 + if (nullptr == inst) { 1.103 + rv = NS_ERROR_OUT_OF_MEMORY; 1.104 + return rv; 1.105 + } 1.106 + NS_ADDREF(inst); 1.107 + rv = inst->QueryInterface(aIID, aResult); 1.108 + NS_RELEASE(inst); 1.109 + 1.110 + return rv; 1.111 +} 1.112 + 1.113 +#if defined(MOZ_X11) 1.114 +namespace mozilla { 1.115 +namespace widget { 1.116 +// This constructor should really be shared with all platforms. 1.117 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init) 1.118 +} 1.119 +} 1.120 +#endif 1.121 + 1.122 +#ifdef NS_PRINTING 1.123 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK) 1.124 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsGTK, Init) 1.125 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK) 1.126 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init) 1.127 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK, Init) 1.128 +#endif 1.129 + 1.130 +static nsresult 1.131 +nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID, 1.132 + void **aResult) 1.133 +{ 1.134 + *aResult = nullptr; 1.135 + if (aOuter != nullptr) { 1.136 + return NS_ERROR_NO_AGGREGATION; 1.137 + } 1.138 + 1.139 + bool allowPlatformPicker = 1.140 + Preferences::GetBool("ui.allow_platform_file_picker", true); 1.141 + 1.142 + nsCOMPtr<nsIFilePicker> picker; 1.143 + if (allowPlatformPicker) { 1.144 + picker = new nsFilePicker; 1.145 + } else { 1.146 + picker = do_CreateInstance(kXULFilePickerCID); 1.147 + } 1.148 + 1.149 + if (!picker) { 1.150 + return NS_ERROR_OUT_OF_MEMORY; 1.151 + } 1.152 + 1.153 + return picker->QueryInterface(aIID, aResult); 1.154 +} 1.155 + 1.156 +static nsresult 1.157 +nsColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID, 1.158 + void **aResult) 1.159 +{ 1.160 + *aResult = nullptr; 1.161 + if (aOuter != nullptr) { 1.162 + return NS_ERROR_NO_AGGREGATION; 1.163 + } 1.164 + 1.165 + nsCOMPtr<nsIColorPicker> picker = new nsColorPicker; 1.166 + 1.167 + if (!picker) { 1.168 + return NS_ERROR_OUT_OF_MEMORY; 1.169 + } 1.170 + 1.171 + return picker->QueryInterface(aIID, aResult); 1.172 +} 1.173 + 1.174 +NS_DEFINE_NAMED_CID(NS_WINDOW_CID); 1.175 +NS_DEFINE_NAMED_CID(NS_CHILD_CID); 1.176 +NS_DEFINE_NAMED_CID(NS_APPSHELL_CID); 1.177 +NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID); 1.178 +NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID); 1.179 +NS_DEFINE_NAMED_CID(NS_SOUND_CID); 1.180 +NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID); 1.181 +#ifdef MOZ_X11 1.182 +NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID); 1.183 +NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID); 1.184 +NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID); 1.185 +#endif 1.186 +NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID); 1.187 +NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID); 1.188 +NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID); 1.189 +NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID); 1.190 +#ifdef NS_PRINTING 1.191 +NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID); 1.192 +NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID); 1.193 +NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID); 1.194 +NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID); 1.195 +NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID); 1.196 +#endif 1.197 +NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID); 1.198 +#if defined(MOZ_X11) 1.199 +NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID); 1.200 +NS_DEFINE_NAMED_CID(NS_GFXINFO_CID); 1.201 +#endif 1.202 + 1.203 + 1.204 +static const mozilla::Module::CIDEntry kWidgetCIDs[] = { 1.205 + { &kNS_WINDOW_CID, false, nullptr, nsWindowConstructor }, 1.206 + { &kNS_CHILD_CID, false, nullptr, nsChildWindowConstructor }, 1.207 + { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor }, 1.208 + { &kNS_COLORPICKER_CID, false, nullptr, nsColorPickerConstructor, Module::MAIN_PROCESS_ONLY }, 1.209 + { &kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor, Module::MAIN_PROCESS_ONLY }, 1.210 + { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor, Module::MAIN_PROCESS_ONLY }, 1.211 + { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor }, 1.212 +#ifdef MOZ_X11 1.213 + { &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor, Module::MAIN_PROCESS_ONLY }, 1.214 + { &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor }, 1.215 + { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor, Module::MAIN_PROCESS_ONLY }, 1.216 +#endif 1.217 + { &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor }, 1.218 + { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor }, 1.219 + { &kNS_SCREENMANAGER_CID, false, nullptr, nsScreenManagerGtkConstructor }, 1.220 + { &kNS_THEMERENDERER_CID, false, nullptr, nsNativeThemeGTKConstructor }, 1.221 +#ifdef NS_PRINTING 1.222 + { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsGTKConstructor }, 1.223 + { &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorGTKConstructor, 1.224 + Module::MAIN_PROCESS_ONLY }, 1.225 + { &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor, 1.226 + Module::MAIN_PROCESS_ONLY }, 1.227 + { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecGTKConstructor, 1.228 + Module::MAIN_PROCESS_ONLY }, 1.229 + { &kNS_PRINTDIALOGSERVICE_CID, false, nullptr, nsPrintDialogServiceGTKConstructor, 1.230 + Module::MAIN_PROCESS_ONLY }, 1.231 +#endif 1.232 + { &kNS_IMAGE_TO_PIXBUF_CID, false, nullptr, nsImageToPixbufConstructor }, 1.233 +#if defined(MOZ_X11) 1.234 + { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceGTKConstructor }, 1.235 + { &kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor }, 1.236 +#endif 1.237 + { nullptr } 1.238 +}; 1.239 + 1.240 +static const mozilla::Module::ContractIDEntry kWidgetContracts[] = { 1.241 + { "@mozilla.org/widget/window/gtk;1", &kNS_WINDOW_CID }, 1.242 + { "@mozilla.org/widgets/child_window/gtk;1", &kNS_CHILD_CID }, 1.243 + { "@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID }, 1.244 + { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY }, 1.245 + { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY }, 1.246 + { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY }, 1.247 + { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID }, 1.248 +#ifdef MOZ_X11 1.249 + { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID, Module::MAIN_PROCESS_ONLY }, 1.250 + { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID }, 1.251 + { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID, Module::MAIN_PROCESS_ONLY }, 1.252 +#endif 1.253 + { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID }, 1.254 + { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID }, 1.255 + { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID }, 1.256 + { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID }, 1.257 +#ifdef NS_PRINTING 1.258 + { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID }, 1.259 + { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID, 1.260 + Module::MAIN_PROCESS_ONLY }, 1.261 + { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID, 1.262 + Module::MAIN_PROCESS_ONLY }, 1.263 + { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID, 1.264 + Module::MAIN_PROCESS_ONLY }, 1.265 + { NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID, 1.266 + Module::MAIN_PROCESS_ONLY }, 1.267 +#endif 1.268 + { "@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID }, 1.269 +#if defined(MOZ_X11) 1.270 + { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID }, 1.271 + { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID }, 1.272 +#endif 1.273 + { nullptr } 1.274 +}; 1.275 + 1.276 +static void 1.277 +nsWidgetGtk2ModuleDtor() 1.278 +{ 1.279 + NativeKeyBindings::Shutdown(); 1.280 + nsLookAndFeel::Shutdown(); 1.281 + nsFilePicker::Shutdown(); 1.282 + nsSound::Shutdown(); 1.283 + nsWindow::ReleaseGlobals(); 1.284 + nsGTKToolkit::Shutdown(); 1.285 + nsAppShellShutdown(); 1.286 +} 1.287 + 1.288 +static const mozilla::Module kWidgetModule = { 1.289 + mozilla::Module::kVersion, 1.290 + kWidgetCIDs, 1.291 + kWidgetContracts, 1.292 + nullptr, 1.293 + nullptr, 1.294 + nsAppShellInit, 1.295 + nsWidgetGtk2ModuleDtor 1.296 +}; 1.297 + 1.298 +NSMODULE_DEFN(nsWidgetGtk2Module) = &kWidgetModule;