mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
05fe36a0da
--HG-- rename : widget/public/LookAndFeel.h => widget/LookAndFeel.h rename : widget/public/WidgetTraceEvent.h => widget/WidgetTraceEvent.h rename : widget/src/android/AndroidBridge.cpp => widget/android/AndroidBridge.cpp rename : widget/src/android/AndroidBridge.h => widget/android/AndroidBridge.h rename : widget/src/android/AndroidDirectTexture.cpp => widget/android/AndroidDirectTexture.cpp rename : widget/src/android/AndroidDirectTexture.h => widget/android/AndroidDirectTexture.h rename : widget/src/android/AndroidGraphicBuffer.cpp => widget/android/AndroidGraphicBuffer.cpp rename : widget/src/android/AndroidGraphicBuffer.h => widget/android/AndroidGraphicBuffer.h rename : widget/src/android/AndroidJNI.cpp => widget/android/AndroidJNI.cpp rename : widget/src/android/AndroidJavaWrappers.cpp => widget/android/AndroidJavaWrappers.cpp rename : widget/src/android/AndroidJavaWrappers.h => widget/android/AndroidJavaWrappers.h rename : widget/src/android/GfxInfo.cpp => widget/android/GfxInfo.cpp rename : widget/src/android/GfxInfo.h => widget/android/GfxInfo.h rename : widget/src/android/Makefile.in => widget/android/Makefile.in rename : widget/src/android/nsAppShell.cpp => widget/android/nsAppShell.cpp rename : widget/src/android/nsAppShell.h => widget/android/nsAppShell.h rename : widget/src/android/nsClipboard.cpp => widget/android/nsClipboard.cpp rename : widget/src/android/nsClipboard.h => widget/android/nsClipboard.h rename : widget/src/android/nsDeviceContextAndroid.cpp => widget/android/nsDeviceContextAndroid.cpp rename : widget/src/android/nsDeviceContextAndroid.h => widget/android/nsDeviceContextAndroid.h rename : widget/src/android/nsFilePicker.cpp => widget/android/nsFilePicker.cpp rename : widget/src/android/nsFilePicker.h => widget/android/nsFilePicker.h rename : widget/src/android/nsIAndroidBridge.idl => widget/android/nsIAndroidBridge.idl rename : widget/src/android/nsIMEPicker.cpp => widget/android/nsIMEPicker.cpp rename : widget/src/android/nsIMEPicker.h => widget/android/nsIMEPicker.h rename : widget/src/android/nsIdleServiceAndroid.cpp => widget/android/nsIdleServiceAndroid.cpp rename : widget/src/android/nsIdleServiceAndroid.h => widget/android/nsIdleServiceAndroid.h rename : widget/src/android/nsLookAndFeel.cpp => widget/android/nsLookAndFeel.cpp rename : widget/src/android/nsLookAndFeel.h => widget/android/nsLookAndFeel.h rename : widget/src/android/nsPrintOptionsAndroid.cpp => widget/android/nsPrintOptionsAndroid.cpp rename : widget/src/android/nsPrintOptionsAndroid.h => widget/android/nsPrintOptionsAndroid.h rename : widget/src/android/nsScreenManagerAndroid.cpp => widget/android/nsScreenManagerAndroid.cpp rename : widget/src/android/nsScreenManagerAndroid.h => widget/android/nsScreenManagerAndroid.h rename : widget/src/android/nsWidgetFactory.cpp => widget/android/nsWidgetFactory.cpp rename : widget/src/android/nsWindow.cpp => widget/android/nsWindow.cpp rename : widget/src/android/nsWindow.h => widget/android/nsWindow.h rename : widget/src/build/Makefile.in => widget/build/Makefile.in rename : widget/src/build/nsWinWidgetFactory.cpp => widget/build/nsWinWidgetFactory.cpp rename : widget/src/build/res/aliasb.cur => widget/build/res/aliasb.cur rename : widget/src/build/res/cell.cur => widget/build/res/cell.cur rename : widget/src/build/res/col_resize.cur => widget/build/res/col_resize.cur rename : widget/src/build/res/copy.cur => widget/build/res/copy.cur rename : widget/src/build/res/grab.cur => widget/build/res/grab.cur rename : widget/src/build/res/grabbing.cur => widget/build/res/grabbing.cur rename : widget/src/build/res/none.cur => widget/build/res/none.cur rename : widget/src/build/res/row_resize.cur => widget/build/res/row_resize.cur rename : widget/src/build/res/select.cur => widget/build/res/select.cur rename : widget/src/build/res/vertical_text.cur => widget/build/res/vertical_text.cur rename : widget/src/build/res/zoom_in.cur => widget/build/res/zoom_in.cur rename : widget/src/build/res/zoom_out.cur => widget/build/res/zoom_out.cur rename : widget/src/build/widget.rc => widget/build/widget.rc rename : widget/src/cocoa/ComplexTextInputPanel.h => widget/cocoa/ComplexTextInputPanel.h rename : widget/src/cocoa/ComplexTextInputPanel.mm => widget/cocoa/ComplexTextInputPanel.mm rename : widget/src/cocoa/CustomCocoaEvents.h => widget/cocoa/CustomCocoaEvents.h rename : widget/src/cocoa/GfxInfo.h => widget/cocoa/GfxInfo.h rename : widget/src/cocoa/GfxInfo.mm => widget/cocoa/GfxInfo.mm rename : widget/src/cocoa/Makefile.in => widget/cocoa/Makefile.in rename : widget/src/cocoa/TextInputHandler.h => widget/cocoa/TextInputHandler.h rename : widget/src/cocoa/TextInputHandler.mm => widget/cocoa/TextInputHandler.mm rename : widget/src/cocoa/WidgetTraceEvent.mm => widget/cocoa/WidgetTraceEvent.mm rename : widget/src/cocoa/crashtests/373122-1-inner.html => widget/cocoa/crashtests/373122-1-inner.html rename : widget/src/cocoa/crashtests/373122-1.html => widget/cocoa/crashtests/373122-1.html rename : widget/src/cocoa/crashtests/397209-1.html => widget/cocoa/crashtests/397209-1.html rename : widget/src/cocoa/crashtests/403296-1.xhtml => widget/cocoa/crashtests/403296-1.xhtml rename : widget/src/cocoa/crashtests/419737-1.html => widget/cocoa/crashtests/419737-1.html rename : widget/src/cocoa/crashtests/435223-1.html => widget/cocoa/crashtests/435223-1.html rename : widget/src/cocoa/crashtests/444260-1.xul => widget/cocoa/crashtests/444260-1.xul rename : widget/src/cocoa/crashtests/444864-1.html => widget/cocoa/crashtests/444864-1.html rename : widget/src/cocoa/crashtests/449111-1.html => widget/cocoa/crashtests/449111-1.html rename : widget/src/cocoa/crashtests/460349-1.xhtml => widget/cocoa/crashtests/460349-1.xhtml rename : widget/src/cocoa/crashtests/460387-1.html => widget/cocoa/crashtests/460387-1.html rename : widget/src/cocoa/crashtests/464589-1.html => widget/cocoa/crashtests/464589-1.html rename : widget/src/cocoa/crashtests/crashtests.list => widget/cocoa/crashtests/crashtests.list rename : widget/src/cocoa/cursors/arrowN.tiff => widget/cocoa/cursors/arrowN.tiff rename : widget/src/cocoa/cursors/arrowS.tiff => widget/cocoa/cursors/arrowS.tiff rename : widget/src/cocoa/cursors/colResize.tiff => widget/cocoa/cursors/colResize.tiff rename : widget/src/cocoa/cursors/help.tiff => widget/cocoa/cursors/help.tiff rename : widget/src/cocoa/cursors/rowResize.tiff => widget/cocoa/cursors/rowResize.tiff rename : widget/src/cocoa/cursors/sizeNE.tiff => widget/cocoa/cursors/sizeNE.tiff rename : widget/src/cocoa/cursors/sizeNESW.tiff => widget/cocoa/cursors/sizeNESW.tiff rename : widget/src/cocoa/cursors/sizeNS.tiff => widget/cocoa/cursors/sizeNS.tiff rename : widget/src/cocoa/cursors/sizeNW.tiff => widget/cocoa/cursors/sizeNW.tiff rename : widget/src/cocoa/cursors/sizeNWSE.tiff => widget/cocoa/cursors/sizeNWSE.tiff rename : widget/src/cocoa/cursors/sizeSE.tiff => widget/cocoa/cursors/sizeSE.tiff rename : widget/src/cocoa/cursors/sizeSW.tiff => widget/cocoa/cursors/sizeSW.tiff rename : widget/src/cocoa/cursors/spin1.tiff => widget/cocoa/cursors/spin1.tiff rename : widget/src/cocoa/cursors/spin2.tiff => widget/cocoa/cursors/spin2.tiff rename : widget/src/cocoa/cursors/spin3.tiff => widget/cocoa/cursors/spin3.tiff rename : widget/src/cocoa/cursors/spin4.tiff => widget/cocoa/cursors/spin4.tiff rename : widget/src/cocoa/cursors/vtIBeam.tiff => widget/cocoa/cursors/vtIBeam.tiff rename : widget/src/cocoa/cursors/zoomIn.tiff => widget/cocoa/cursors/zoomIn.tiff rename : widget/src/cocoa/cursors/zoomOut.tiff => widget/cocoa/cursors/zoomOut.tiff rename : widget/src/cocoa/mozView.h => widget/cocoa/mozView.h rename : widget/src/cocoa/nsAppShell.h => widget/cocoa/nsAppShell.h rename : widget/src/cocoa/nsAppShell.mm => widget/cocoa/nsAppShell.mm rename : widget/src/cocoa/nsBidiKeyboard.h => widget/cocoa/nsBidiKeyboard.h rename : widget/src/cocoa/nsBidiKeyboard.mm => widget/cocoa/nsBidiKeyboard.mm rename : widget/src/cocoa/nsChangeObserver.h => widget/cocoa/nsChangeObserver.h rename : widget/src/cocoa/nsChildView.h => widget/cocoa/nsChildView.h rename : widget/src/cocoa/nsChildView.mm => widget/cocoa/nsChildView.mm rename : widget/src/cocoa/nsClipboard.h => widget/cocoa/nsClipboard.h rename : widget/src/cocoa/nsClipboard.mm => widget/cocoa/nsClipboard.mm rename : widget/src/cocoa/nsCocoaFeatures.h => widget/cocoa/nsCocoaFeatures.h rename : widget/src/cocoa/nsCocoaFeatures.mm => widget/cocoa/nsCocoaFeatures.mm rename : widget/src/cocoa/nsCocoaUtils.h => widget/cocoa/nsCocoaUtils.h rename : widget/src/cocoa/nsCocoaUtils.mm => widget/cocoa/nsCocoaUtils.mm rename : widget/src/cocoa/nsCocoaWindow.h => widget/cocoa/nsCocoaWindow.h rename : widget/src/cocoa/nsCocoaWindow.mm => widget/cocoa/nsCocoaWindow.mm rename : widget/src/cocoa/nsCursorManager.h => widget/cocoa/nsCursorManager.h rename : widget/src/cocoa/nsCursorManager.mm => widget/cocoa/nsCursorManager.mm rename : widget/src/cocoa/nsDeviceContextSpecX.h => widget/cocoa/nsDeviceContextSpecX.h rename : widget/src/cocoa/nsDeviceContextSpecX.mm => widget/cocoa/nsDeviceContextSpecX.mm rename : widget/src/cocoa/nsDragService.h => widget/cocoa/nsDragService.h rename : widget/src/cocoa/nsDragService.mm => widget/cocoa/nsDragService.mm rename : widget/src/cocoa/nsFilePicker.h => widget/cocoa/nsFilePicker.h rename : widget/src/cocoa/nsFilePicker.mm => widget/cocoa/nsFilePicker.mm rename : widget/src/cocoa/nsIdleServiceX.h => widget/cocoa/nsIdleServiceX.h rename : widget/src/cocoa/nsIdleServiceX.mm => widget/cocoa/nsIdleServiceX.mm rename : widget/src/cocoa/nsLookAndFeel.h => widget/cocoa/nsLookAndFeel.h rename : widget/src/cocoa/nsLookAndFeel.mm => widget/cocoa/nsLookAndFeel.mm rename : widget/src/cocoa/nsMacCursor.h => widget/cocoa/nsMacCursor.h rename : widget/src/cocoa/nsMacCursor.mm => widget/cocoa/nsMacCursor.mm rename : widget/src/cocoa/nsMacDockSupport.h => widget/cocoa/nsMacDockSupport.h rename : widget/src/cocoa/nsMacDockSupport.mm => widget/cocoa/nsMacDockSupport.mm rename : widget/src/cocoa/nsMenuBarX.h => widget/cocoa/nsMenuBarX.h rename : widget/src/cocoa/nsMenuBarX.mm => widget/cocoa/nsMenuBarX.mm rename : widget/src/cocoa/nsMenuBaseX.h => widget/cocoa/nsMenuBaseX.h rename : widget/src/cocoa/nsMenuGroupOwnerX.h => widget/cocoa/nsMenuGroupOwnerX.h rename : widget/src/cocoa/nsMenuGroupOwnerX.mm => widget/cocoa/nsMenuGroupOwnerX.mm rename : widget/src/cocoa/nsMenuItemIconX.h => widget/cocoa/nsMenuItemIconX.h rename : widget/src/cocoa/nsMenuItemIconX.mm => widget/cocoa/nsMenuItemIconX.mm rename : widget/src/cocoa/nsMenuItemX.h => widget/cocoa/nsMenuItemX.h rename : widget/src/cocoa/nsMenuItemX.mm => widget/cocoa/nsMenuItemX.mm rename : widget/src/cocoa/nsMenuUtilsX.h => widget/cocoa/nsMenuUtilsX.h rename : widget/src/cocoa/nsMenuUtilsX.mm => widget/cocoa/nsMenuUtilsX.mm rename : widget/src/cocoa/nsMenuX.h => widget/cocoa/nsMenuX.h rename : widget/src/cocoa/nsMenuX.mm => widget/cocoa/nsMenuX.mm rename : widget/src/cocoa/nsNativeThemeCocoa.h => widget/cocoa/nsNativeThemeCocoa.h rename : widget/src/cocoa/nsNativeThemeCocoa.mm => widget/cocoa/nsNativeThemeCocoa.mm rename : widget/src/cocoa/nsNativeThemeColors.h => widget/cocoa/nsNativeThemeColors.h rename : widget/src/cocoa/nsPIWidgetCocoa.idl => widget/cocoa/nsPIWidgetCocoa.idl rename : widget/src/cocoa/nsPrintDialogX.h => widget/cocoa/nsPrintDialogX.h rename : widget/src/cocoa/nsPrintDialogX.mm => widget/cocoa/nsPrintDialogX.mm rename : widget/src/cocoa/nsPrintOptionsX.h => widget/cocoa/nsPrintOptionsX.h rename : widget/src/cocoa/nsPrintOptionsX.mm => widget/cocoa/nsPrintOptionsX.mm rename : widget/src/cocoa/nsPrintSettingsX.h => widget/cocoa/nsPrintSettingsX.h rename : widget/src/cocoa/nsPrintSettingsX.mm => widget/cocoa/nsPrintSettingsX.mm rename : widget/src/cocoa/nsScreenCocoa.h => widget/cocoa/nsScreenCocoa.h rename : widget/src/cocoa/nsScreenCocoa.mm => widget/cocoa/nsScreenCocoa.mm rename : widget/src/cocoa/nsScreenManagerCocoa.h => widget/cocoa/nsScreenManagerCocoa.h rename : widget/src/cocoa/nsScreenManagerCocoa.mm => widget/cocoa/nsScreenManagerCocoa.mm rename : widget/src/cocoa/nsSound.h => widget/cocoa/nsSound.h rename : widget/src/cocoa/nsSound.mm => widget/cocoa/nsSound.mm rename : widget/src/cocoa/nsStandaloneNativeMenu.h => widget/cocoa/nsStandaloneNativeMenu.h rename : widget/src/cocoa/nsStandaloneNativeMenu.mm => widget/cocoa/nsStandaloneNativeMenu.mm rename : widget/src/cocoa/nsToolkit.h => widget/cocoa/nsToolkit.h rename : widget/src/cocoa/nsToolkit.mm => widget/cocoa/nsToolkit.mm rename : widget/src/cocoa/nsWidgetFactory.mm => widget/cocoa/nsWidgetFactory.mm rename : widget/src/cocoa/nsWindowMap.h => widget/cocoa/nsWindowMap.h rename : widget/src/cocoa/nsWindowMap.mm => widget/cocoa/nsWindowMap.mm rename : widget/src/cocoa/resources/MainMenu.nib/classes.nib => widget/cocoa/resources/MainMenu.nib/classes.nib rename : widget/src/cocoa/resources/MainMenu.nib/info.nib => widget/cocoa/resources/MainMenu.nib/info.nib rename : widget/src/cocoa/resources/MainMenu.nib/keyedobjects.nib => widget/cocoa/resources/MainMenu.nib/keyedobjects.nib rename : widget/src/crashtests/303901-1.html => widget/crashtests/303901-1.html rename : widget/src/crashtests/303901-2.html => widget/crashtests/303901-2.html rename : widget/src/crashtests/380359-1.xhtml => widget/crashtests/380359-1.xhtml rename : widget/src/crashtests/crashtests.list => widget/crashtests/crashtests.list rename : widget/src/gonk/Framebuffer.cpp => widget/gonk/Framebuffer.cpp rename : widget/src/gonk/Framebuffer.h => widget/gonk/Framebuffer.h rename : widget/src/gonk/Makefile.in => widget/gonk/Makefile.in rename : widget/src/gonk/nsAppShell.cpp => widget/gonk/nsAppShell.cpp rename : widget/src/gonk/nsAppShell.h => widget/gonk/nsAppShell.h rename : widget/src/gonk/nsLookAndFeel.cpp => widget/gonk/nsLookAndFeel.cpp rename : widget/src/gonk/nsLookAndFeel.h => widget/gonk/nsLookAndFeel.h rename : widget/src/gonk/nsScreenManagerGonk.cpp => widget/gonk/nsScreenManagerGonk.cpp rename : widget/src/gonk/nsScreenManagerGonk.h => widget/gonk/nsScreenManagerGonk.h rename : widget/src/gonk/nsWidgetFactory.cpp => widget/gonk/nsWidgetFactory.cpp rename : widget/src/gonk/nsWindow.cpp => widget/gonk/nsWindow.cpp rename : widget/src/gonk/nsWindow.h => widget/gonk/nsWindow.h rename : widget/src/gtk2/Makefile.in => widget/gtk2/Makefile.in rename : widget/src/gtk2/WidgetTraceEvent.cpp => widget/gtk2/WidgetTraceEvent.cpp rename : widget/src/gtk2/crashtests/673390-1.html => widget/gtk2/crashtests/673390-1.html rename : widget/src/gtk2/crashtests/crashtests.list => widget/gtk2/crashtests/crashtests.list rename : widget/src/gtk2/gtk2compat.h => widget/gtk2/gtk2compat.h rename : widget/src/gtk2/gtk2drawing.c => widget/gtk2/gtk2drawing.c rename : widget/src/gtk2/gtkdrawing.h => widget/gtk2/gtkdrawing.h rename : widget/src/gtk2/maiRedundantObjectFactory.c => widget/gtk2/maiRedundantObjectFactory.c rename : widget/src/gtk2/maiRedundantObjectFactory.h => widget/gtk2/maiRedundantObjectFactory.h rename : widget/src/gtk2/mozcontainer.c => widget/gtk2/mozcontainer.c rename : widget/src/gtk2/mozcontainer.h => widget/gtk2/mozcontainer.h rename : widget/src/gtk2/nsAppShell.cpp => widget/gtk2/nsAppShell.cpp rename : widget/src/gtk2/nsAppShell.h => widget/gtk2/nsAppShell.h rename : widget/src/gtk2/nsBidiKeyboard.cpp => widget/gtk2/nsBidiKeyboard.cpp rename : widget/src/gtk2/nsBidiKeyboard.h => widget/gtk2/nsBidiKeyboard.h rename : widget/src/gtk2/nsCUPSShim.cpp => widget/gtk2/nsCUPSShim.cpp rename : widget/src/gtk2/nsCUPSShim.h => widget/gtk2/nsCUPSShim.h rename : widget/src/gtk2/nsClipboard.cpp => widget/gtk2/nsClipboard.cpp rename : widget/src/gtk2/nsClipboard.h => widget/gtk2/nsClipboard.h rename : widget/src/gtk2/nsDeviceContextSpecG.cpp => widget/gtk2/nsDeviceContextSpecG.cpp rename : widget/src/gtk2/nsDeviceContextSpecG.h => widget/gtk2/nsDeviceContextSpecG.h rename : widget/src/gtk2/nsDragService.cpp => widget/gtk2/nsDragService.cpp rename : widget/src/gtk2/nsDragService.h => widget/gtk2/nsDragService.h rename : widget/src/gtk2/nsFilePicker.cpp => widget/gtk2/nsFilePicker.cpp rename : widget/src/gtk2/nsFilePicker.h => widget/gtk2/nsFilePicker.h rename : widget/src/gtk2/nsGTKToolkit.h => widget/gtk2/nsGTKToolkit.h rename : widget/src/gtk2/nsGtkCursors.h => widget/gtk2/nsGtkCursors.h rename : widget/src/gtk2/nsGtkIMModule.cpp => widget/gtk2/nsGtkIMModule.cpp rename : widget/src/gtk2/nsGtkIMModule.h => widget/gtk2/nsGtkIMModule.h rename : widget/src/gtk2/nsGtkKeyUtils.cpp => widget/gtk2/nsGtkKeyUtils.cpp rename : widget/src/gtk2/nsGtkKeyUtils.h => widget/gtk2/nsGtkKeyUtils.h rename : widget/src/gtk2/nsIImageToPixbuf.h => widget/gtk2/nsIImageToPixbuf.h rename : widget/src/gtk2/nsIdleServiceGTK.cpp => widget/gtk2/nsIdleServiceGTK.cpp rename : widget/src/gtk2/nsIdleServiceGTK.h => widget/gtk2/nsIdleServiceGTK.h rename : widget/src/gtk2/nsImageToPixbuf.cpp => widget/gtk2/nsImageToPixbuf.cpp rename : widget/src/gtk2/nsImageToPixbuf.h => widget/gtk2/nsImageToPixbuf.h rename : widget/src/gtk2/nsLookAndFeel.cpp => widget/gtk2/nsLookAndFeel.cpp rename : widget/src/gtk2/nsLookAndFeel.h => widget/gtk2/nsLookAndFeel.h rename : widget/src/gtk2/nsNativeKeyBindings.cpp => widget/gtk2/nsNativeKeyBindings.cpp rename : widget/src/gtk2/nsNativeKeyBindings.h => widget/gtk2/nsNativeKeyBindings.h rename : widget/src/gtk2/nsNativeThemeGTK.cpp => widget/gtk2/nsNativeThemeGTK.cpp rename : widget/src/gtk2/nsNativeThemeGTK.h => widget/gtk2/nsNativeThemeGTK.h rename : widget/src/gtk2/nsPSPrinters.cpp => widget/gtk2/nsPSPrinters.cpp rename : widget/src/gtk2/nsPSPrinters.h => widget/gtk2/nsPSPrinters.h rename : widget/src/gtk2/nsPaperPS.cpp => widget/gtk2/nsPaperPS.cpp rename : widget/src/gtk2/nsPaperPS.h => widget/gtk2/nsPaperPS.h rename : widget/src/gtk2/nsPrintDialogGTK.cpp => widget/gtk2/nsPrintDialogGTK.cpp rename : widget/src/gtk2/nsPrintDialogGTK.h => widget/gtk2/nsPrintDialogGTK.h rename : widget/src/gtk2/nsPrintOptionsGTK.cpp => widget/gtk2/nsPrintOptionsGTK.cpp rename : widget/src/gtk2/nsPrintOptionsGTK.h => widget/gtk2/nsPrintOptionsGTK.h rename : widget/src/gtk2/nsPrintSettingsGTK.cpp => widget/gtk2/nsPrintSettingsGTK.cpp rename : widget/src/gtk2/nsPrintSettingsGTK.h => widget/gtk2/nsPrintSettingsGTK.h rename : widget/src/gtk2/nsScreenGtk.cpp => widget/gtk2/nsScreenGtk.cpp rename : widget/src/gtk2/nsScreenGtk.h => widget/gtk2/nsScreenGtk.h rename : widget/src/gtk2/nsScreenManagerGtk.cpp => widget/gtk2/nsScreenManagerGtk.cpp rename : widget/src/gtk2/nsScreenManagerGtk.h => widget/gtk2/nsScreenManagerGtk.h rename : widget/src/gtk2/nsSound.cpp => widget/gtk2/nsSound.cpp rename : widget/src/gtk2/nsSound.h => widget/gtk2/nsSound.h rename : widget/src/gtk2/nsToolkit.cpp => widget/gtk2/nsToolkit.cpp rename : widget/src/gtk2/nsWidgetFactory.cpp => widget/gtk2/nsWidgetFactory.cpp rename : widget/src/gtk2/nsWindow.cpp => widget/gtk2/nsWindow.cpp rename : widget/src/gtk2/nsWindow.h => widget/gtk2/nsWindow.h rename : widget/src/gtkxtbin/Makefile.in => widget/gtkxtbin/Makefile.in rename : widget/src/gtkxtbin/gtk2xtbin.c => widget/gtkxtbin/gtk2xtbin.c rename : widget/src/gtkxtbin/gtk2xtbin.h => widget/gtkxtbin/gtk2xtbin.h rename : widget/src/gtkxtbin/xembed.h => widget/gtkxtbin/xembed.h rename : widget/public/nsEvent.h => widget/nsEvent.h rename : widget/public/nsGUIEvent.h => widget/nsGUIEvent.h rename : widget/public/nsGUIEventIPC.h => widget/nsGUIEventIPC.h rename : widget/public/nsIAppShell.idl => widget/nsIAppShell.idl rename : widget/public/nsIBaseWindow.idl => widget/nsIBaseWindow.idl rename : widget/public/nsIBidiKeyboard.idl => widget/nsIBidiKeyboard.idl rename : widget/public/nsIClipboard.idl => widget/nsIClipboard.idl rename : widget/public/nsIClipboardDragDropHookList.idl => widget/nsIClipboardDragDropHookList.idl rename : widget/public/nsIClipboardDragDropHooks.idl => widget/nsIClipboardDragDropHooks.idl rename : widget/public/nsIClipboardHelper.idl => widget/nsIClipboardHelper.idl rename : widget/public/nsIClipboardOwner.idl => widget/nsIClipboardOwner.idl rename : widget/public/nsIDeviceContextSpec.h => widget/nsIDeviceContextSpec.h rename : widget/public/nsIDragService.idl => widget/nsIDragService.idl rename : widget/public/nsIDragSession.idl => widget/nsIDragSession.idl rename : widget/public/nsIDragSessionGTK.h => widget/nsIDragSessionGTK.h rename : widget/public/nsIDragSessionOS2.h => widget/nsIDragSessionOS2.h rename : widget/public/nsIFilePicker.idl => widget/nsIFilePicker.idl rename : widget/public/nsIFormatConverter.idl => widget/nsIFormatConverter.idl rename : widget/public/nsIGfxInfo.idl => widget/nsIGfxInfo.idl rename : widget/public/nsIGfxInfoDebug.idl => widget/nsIGfxInfoDebug.idl rename : widget/public/nsIIMEPicker.idl => widget/nsIIMEPicker.idl rename : widget/public/nsIIdleService.idl => widget/nsIIdleService.idl rename : widget/public/nsIJumpListBuilder.idl => widget/nsIJumpListBuilder.idl rename : widget/public/nsIJumpListItem.idl => widget/nsIJumpListItem.idl rename : widget/public/nsIMacDockSupport.idl => widget/nsIMacDockSupport.idl rename : widget/public/nsINativeKeyBindings.h => widget/nsINativeKeyBindings.h rename : widget/public/nsINativeMenuService.h => widget/nsINativeMenuService.h rename : widget/public/nsIPluginWidget.h => widget/nsIPluginWidget.h rename : widget/public/nsIPrintDialogService.h => widget/nsIPrintDialogService.h rename : widget/public/nsIPrintOptions.idl => widget/nsIPrintOptions.idl rename : widget/public/nsIPrintSession.idl => widget/nsIPrintSession.idl rename : widget/public/nsIPrintSettings.idl => widget/nsIPrintSettings.idl rename : widget/public/nsIPrintSettingsService.idl => widget/nsIPrintSettingsService.idl rename : widget/public/nsIPrintSettingsWin.idl => widget/nsIPrintSettingsWin.idl rename : widget/public/nsIRollupListener.h => widget/nsIRollupListener.h rename : widget/public/nsIRwsService.idl => widget/nsIRwsService.idl rename : widget/public/nsIScreen.idl => widget/nsIScreen.idl rename : widget/public/nsIScreenManager.idl => widget/nsIScreenManager.idl rename : widget/public/nsISound.idl => widget/nsISound.idl rename : widget/public/nsIStandaloneNativeMenu.idl => widget/nsIStandaloneNativeMenu.idl rename : widget/public/nsITaskbarOverlayIconController.idl => widget/nsITaskbarOverlayIconController.idl rename : widget/public/nsITaskbarPreview.idl => widget/nsITaskbarPreview.idl rename : widget/public/nsITaskbarPreviewButton.idl => widget/nsITaskbarPreviewButton.idl rename : widget/public/nsITaskbarPreviewController.idl => widget/nsITaskbarPreviewController.idl rename : widget/public/nsITaskbarProgress.idl => widget/nsITaskbarProgress.idl rename : widget/public/nsITaskbarTabPreview.idl => widget/nsITaskbarTabPreview.idl rename : widget/public/nsITaskbarWindowPreview.idl => widget/nsITaskbarWindowPreview.idl rename : widget/public/nsITransferable.idl => widget/nsITransferable.idl rename : widget/public/nsIWidget.h => widget/nsIWidget.h rename : widget/public/nsIWinTaskbar.idl => widget/nsIWinTaskbar.idl rename : widget/public/nsNativeWidget.h => widget/nsNativeWidget.h rename : widget/public/nsWidgetInitData.h => widget/nsWidgetInitData.h rename : widget/public/nsWidgetsCID.h => widget/nsWidgetsCID.h rename : widget/src/os2/Makefile.in => widget/os2/Makefile.in rename : widget/src/os2/MozSounds.cmd => widget/os2/MozSounds.cmd rename : widget/src/os2/README.firefox => widget/os2/README.firefox rename : widget/src/os2/README.seamonkey => widget/os2/README.seamonkey rename : widget/src/os2/README.thunderbird => widget/os2/README.thunderbird rename : widget/src/os2/nsAppShell.cpp => widget/os2/nsAppShell.cpp rename : widget/src/os2/nsAppShell.h => widget/os2/nsAppShell.h rename : widget/src/os2/nsBidiKeyboard.cpp => widget/os2/nsBidiKeyboard.cpp rename : widget/src/os2/nsBidiKeyboard.h => widget/os2/nsBidiKeyboard.h rename : widget/src/os2/nsClipboard.cpp => widget/os2/nsClipboard.cpp rename : widget/src/os2/nsClipboard.h => widget/os2/nsClipboard.h rename : widget/src/os2/nsDeviceContextSpecOS2.cpp => widget/os2/nsDeviceContextSpecOS2.cpp rename : widget/src/os2/nsDeviceContextSpecOS2.h => widget/os2/nsDeviceContextSpecOS2.h rename : widget/src/os2/nsDragService.cpp => widget/os2/nsDragService.cpp rename : widget/src/os2/nsDragService.h => widget/os2/nsDragService.h rename : widget/src/os2/nsFilePicker.cpp => widget/os2/nsFilePicker.cpp rename : widget/src/os2/nsFilePicker.h => widget/os2/nsFilePicker.h rename : widget/src/os2/nsGfxDefs.h => widget/os2/nsGfxDefs.h rename : widget/src/os2/nsIdleServiceOS2.cpp => widget/os2/nsIdleServiceOS2.cpp rename : widget/src/os2/nsIdleServiceOS2.h => widget/os2/nsIdleServiceOS2.h rename : widget/src/os2/nsLookAndFeel.cpp => widget/os2/nsLookAndFeel.cpp rename : widget/src/os2/nsLookAndFeel.h => widget/os2/nsLookAndFeel.h rename : widget/src/os2/nsOS2Uni.cpp => widget/os2/nsOS2Uni.cpp rename : widget/src/os2/nsOS2Uni.h => widget/os2/nsOS2Uni.h rename : widget/src/os2/nsPrintOS2.cpp => widget/os2/nsPrintOS2.cpp rename : widget/src/os2/nsPrintOS2.h => widget/os2/nsPrintOS2.h rename : widget/src/os2/nsPrintOptionsOS2.cpp => widget/os2/nsPrintOptionsOS2.cpp rename : widget/src/os2/nsPrintOptionsOS2.h => widget/os2/nsPrintOptionsOS2.h rename : widget/src/os2/nsPrintdOS2.h => widget/os2/nsPrintdOS2.h rename : widget/src/os2/nsRwsService.cpp => widget/os2/nsRwsService.cpp rename : widget/src/os2/nsRwsService.h => widget/os2/nsRwsService.h rename : widget/src/os2/nsScreenManagerOS2.cpp => widget/os2/nsScreenManagerOS2.cpp rename : widget/src/os2/nsScreenManagerOS2.h => widget/os2/nsScreenManagerOS2.h rename : widget/src/os2/nsScreenOS2.cpp => widget/os2/nsScreenOS2.cpp rename : widget/src/os2/nsScreenOS2.h => widget/os2/nsScreenOS2.h rename : widget/src/os2/nsSound.cpp => widget/os2/nsSound.cpp rename : widget/src/os2/nsSound.h => widget/os2/nsSound.h rename : widget/src/os2/nsWidgetFactory.cpp => widget/os2/nsWidgetFactory.cpp rename : widget/src/os2/nsWindow.cpp => widget/os2/nsWindow.cpp rename : widget/src/os2/nsWindow.h => widget/os2/nsWindow.h rename : widget/src/os2/os2FrameWindow.cpp => widget/os2/os2FrameWindow.cpp rename : widget/src/os2/os2FrameWindow.h => widget/os2/os2FrameWindow.h rename : widget/src/os2/res/aliasb.ptr => widget/os2/res/aliasb.ptr rename : widget/src/os2/res/arrow_wait.ptr => widget/os2/res/arrow_wait.ptr rename : widget/src/os2/res/cell.ptr => widget/os2/res/cell.ptr rename : widget/src/os2/res/col_resize.ptr => widget/os2/res/col_resize.ptr rename : widget/src/os2/res/copy.ptr => widget/os2/res/copy.ptr rename : widget/src/os2/res/crosshair.ptr => widget/os2/res/crosshair.ptr rename : widget/src/os2/res/dndtext.ico => widget/os2/res/dndtext.ico rename : widget/src/os2/res/dndurl.ico => widget/os2/res/dndurl.ico rename : widget/src/os2/res/grab.ptr => widget/os2/res/grab.ptr rename : widget/src/os2/res/grabbing.ptr => widget/os2/res/grabbing.ptr rename : widget/src/os2/res/help.ptr => widget/os2/res/help.ptr rename : widget/src/os2/res/none.ptr => widget/os2/res/none.ptr rename : widget/src/os2/res/row_resize.ptr => widget/os2/res/row_resize.ptr rename : widget/src/os2/res/select.ptr => widget/os2/res/select.ptr rename : widget/src/os2/res/vertical_text.ptr => widget/os2/res/vertical_text.ptr rename : widget/src/os2/res/zoom_in.ptr => widget/os2/res/zoom_in.ptr rename : widget/src/os2/res/zoom_out.ptr => widget/os2/res/zoom_out.ptr rename : widget/src/os2/rws.h => widget/os2/rws.h rename : widget/src/os2/rwserr.h => widget/os2/rwserr.h rename : widget/src/os2/wdgtos2rc.h => widget/os2/wdgtos2rc.h rename : widget/src/os2/widget.rc => widget/os2/widget.rc rename : widget/src/qt/Makefile.in => widget/qt/Makefile.in rename : widget/src/qt/faststartupqt/Makefile.in => widget/qt/faststartupqt/Makefile.in rename : widget/src/qt/faststartupqt/mozqwidgetfast.cpp => widget/qt/faststartupqt/mozqwidgetfast.cpp rename : widget/src/qt/faststartupqt/mozqwidgetfast.h => widget/qt/faststartupqt/mozqwidgetfast.h rename : widget/src/qt/faststartupqt/nsFastStartupQt.cpp => widget/qt/faststartupqt/nsFastStartupQt.cpp rename : widget/src/qt/faststartupqt/nsFastStartupQt.h => widget/qt/faststartupqt/nsFastStartupQt.h rename : widget/src/qt/mozSwipeGesture.cpp => widget/qt/mozSwipeGesture.cpp rename : widget/src/qt/mozSwipeGesture.h => widget/qt/mozSwipeGesture.h rename : widget/src/qt/moziqwidget.h => widget/qt/moziqwidget.h rename : widget/src/qt/mozqorientationsensorfilter.cpp => widget/qt/mozqorientationsensorfilter.cpp rename : widget/src/qt/mozqorientationsensorfilter.h => widget/qt/mozqorientationsensorfilter.h rename : widget/src/qt/mozqwidget.cpp => widget/qt/mozqwidget.cpp rename : widget/src/qt/mozqwidget.h => widget/qt/mozqwidget.h rename : widget/src/qt/nsAppShell.cpp => widget/qt/nsAppShell.cpp rename : widget/src/qt/nsAppShell.h => widget/qt/nsAppShell.h rename : widget/src/qt/nsBidiKeyboard.cpp => widget/qt/nsBidiKeyboard.cpp rename : widget/src/qt/nsBidiKeyboard.h => widget/qt/nsBidiKeyboard.h rename : widget/src/qt/nsClipboard.cpp => widget/qt/nsClipboard.cpp rename : widget/src/qt/nsClipboard.h => widget/qt/nsClipboard.h rename : widget/src/qt/nsCommonWidget.cpp => widget/qt/nsCommonWidget.cpp rename : widget/src/qt/nsCommonWidget.h => widget/qt/nsCommonWidget.h rename : widget/src/qt/nsDeviceContextSpecQt.cpp => widget/qt/nsDeviceContextSpecQt.cpp rename : widget/src/qt/nsDeviceContextSpecQt.h => widget/qt/nsDeviceContextSpecQt.h rename : widget/src/qt/nsDragService.cpp => widget/qt/nsDragService.cpp rename : widget/src/qt/nsDragService.h => widget/qt/nsDragService.h rename : widget/src/qt/nsFilePicker.cpp => widget/qt/nsFilePicker.cpp rename : widget/src/qt/nsFilePicker.h => widget/qt/nsFilePicker.h rename : widget/src/qt/nsIdleServiceQt.cpp => widget/qt/nsIdleServiceQt.cpp rename : widget/src/qt/nsIdleServiceQt.h => widget/qt/nsIdleServiceQt.h rename : widget/src/qt/nsLookAndFeel.cpp => widget/qt/nsLookAndFeel.cpp rename : widget/src/qt/nsLookAndFeel.h => widget/qt/nsLookAndFeel.h rename : widget/src/qt/nsMFilePicker.cpp => widget/qt/nsMFilePicker.cpp rename : widget/src/qt/nsMFilePicker.h => widget/qt/nsMFilePicker.h rename : widget/src/qt/nsNativeThemeQt.cpp => widget/qt/nsNativeThemeQt.cpp rename : widget/src/qt/nsNativeThemeQt.h => widget/qt/nsNativeThemeQt.h rename : widget/src/qt/nsPrintDialogQt.cpp => widget/qt/nsPrintDialogQt.cpp rename : widget/src/qt/nsPrintDialogQt.h => widget/qt/nsPrintDialogQt.h rename : widget/src/qt/nsPrintOptionsQt.cpp => widget/qt/nsPrintOptionsQt.cpp rename : widget/src/qt/nsPrintOptionsQt.h => widget/qt/nsPrintOptionsQt.h rename : widget/src/qt/nsPrintSettingsQt.cpp => widget/qt/nsPrintSettingsQt.cpp rename : widget/src/qt/nsPrintSettingsQt.h => widget/qt/nsPrintSettingsQt.h rename : widget/src/qt/nsQtKeyUtils.cpp => widget/qt/nsQtKeyUtils.cpp rename : widget/src/qt/nsQtKeyUtils.h => widget/qt/nsQtKeyUtils.h rename : widget/src/qt/nsScreenManagerQt.cpp => widget/qt/nsScreenManagerQt.cpp rename : widget/src/qt/nsScreenManagerQt.h => widget/qt/nsScreenManagerQt.h rename : widget/src/qt/nsScreenQt.cpp => widget/qt/nsScreenQt.cpp rename : widget/src/qt/nsScreenQt.h => widget/qt/nsScreenQt.h rename : widget/src/qt/nsSound.cpp => widget/qt/nsSound.cpp rename : widget/src/qt/nsSound.h => widget/qt/nsSound.h rename : widget/src/qt/nsWidgetFactory.cpp => widget/qt/nsWidgetFactory.cpp rename : widget/src/qt/nsWindow.cpp => widget/qt/nsWindow.cpp rename : widget/src/qt/nsWindow.h => widget/qt/nsWindow.h rename : widget/src/shared/Makefile.in => widget/shared/Makefile.in rename : widget/src/shared/WidgetUtils.cpp => widget/shared/WidgetUtils.cpp rename : widget/src/shared/WidgetUtils.h => widget/shared/WidgetUtils.h rename : widget/src/shared/nsShmImage.cpp => widget/shared/nsShmImage.cpp rename : widget/src/shared/nsShmImage.h => widget/shared/nsShmImage.h rename : widget/src/shared/x11/Makefile.in => widget/shared/x11/Makefile.in rename : widget/src/shared/x11/keysym2ucs.c => widget/shared/x11/keysym2ucs.c rename : widget/src/shared/x11/keysym2ucs.h => widget/shared/x11/keysym2ucs.h rename : widget/src/windows/AudioSession.cpp => widget/windows/AudioSession.cpp rename : widget/src/windows/AudioSession.h => widget/windows/AudioSession.h rename : widget/src/windows/GfxInfo.cpp => widget/windows/GfxInfo.cpp rename : widget/src/windows/GfxInfo.h => widget/windows/GfxInfo.h rename : widget/src/windows/IEnumFE.cpp => widget/windows/IEnumFE.cpp rename : widget/src/windows/IEnumFE.h => widget/windows/IEnumFE.h rename : widget/src/windows/JumpListBuilder.cpp => widget/windows/JumpListBuilder.cpp rename : widget/src/windows/JumpListBuilder.h => widget/windows/JumpListBuilder.h rename : widget/src/windows/JumpListItem.cpp => widget/windows/JumpListItem.cpp rename : widget/src/windows/JumpListItem.h => widget/windows/JumpListItem.h rename : widget/src/windows/KeyboardLayout.cpp => widget/windows/KeyboardLayout.cpp rename : widget/src/windows/KeyboardLayout.h => widget/windows/KeyboardLayout.h rename : widget/src/windows/LSPAnnotator.cpp => widget/windows/LSPAnnotator.cpp rename : widget/src/windows/Makefile.in => widget/windows/Makefile.in rename : widget/src/windows/TaskbarPreview.cpp => widget/windows/TaskbarPreview.cpp rename : widget/src/windows/TaskbarPreview.h => widget/windows/TaskbarPreview.h rename : widget/src/windows/TaskbarPreviewButton.cpp => widget/windows/TaskbarPreviewButton.cpp rename : widget/src/windows/TaskbarPreviewButton.h => widget/windows/TaskbarPreviewButton.h rename : widget/src/windows/TaskbarTabPreview.cpp => widget/windows/TaskbarTabPreview.cpp rename : widget/src/windows/TaskbarTabPreview.h => widget/windows/TaskbarTabPreview.h rename : widget/src/windows/TaskbarWindowPreview.cpp => widget/windows/TaskbarWindowPreview.cpp rename : widget/src/windows/TaskbarWindowPreview.h => widget/windows/TaskbarWindowPreview.h rename : widget/src/windows/WidgetTraceEvent.cpp => widget/windows/WidgetTraceEvent.cpp rename : widget/src/windows/WinTaskbar.cpp => widget/windows/WinTaskbar.cpp rename : widget/src/windows/WinTaskbar.h => widget/windows/WinTaskbar.h rename : widget/src/windows/WindowHook.cpp => widget/windows/WindowHook.cpp rename : widget/src/windows/WindowHook.h => widget/windows/WindowHook.h rename : widget/src/windows/nsAppShell.cpp => widget/windows/nsAppShell.cpp rename : widget/src/windows/nsAppShell.h => widget/windows/nsAppShell.h rename : widget/src/windows/nsBidiKeyboard.cpp => widget/windows/nsBidiKeyboard.cpp rename : widget/src/windows/nsBidiKeyboard.h => widget/windows/nsBidiKeyboard.h rename : widget/src/windows/nsClipboard.cpp => widget/windows/nsClipboard.cpp rename : widget/src/windows/nsClipboard.h => widget/windows/nsClipboard.h rename : widget/src/windows/nsDataObj.cpp => widget/windows/nsDataObj.cpp rename : widget/src/windows/nsDataObj.h => widget/windows/nsDataObj.h rename : widget/src/windows/nsDataObjCollection.cpp => widget/windows/nsDataObjCollection.cpp rename : widget/src/windows/nsDataObjCollection.h => widget/windows/nsDataObjCollection.h rename : widget/src/windows/nsDeviceContextSpecWin.cpp => widget/windows/nsDeviceContextSpecWin.cpp rename : widget/src/windows/nsDeviceContextSpecWin.h => widget/windows/nsDeviceContextSpecWin.h rename : widget/src/windows/nsDragService.cpp => widget/windows/nsDragService.cpp rename : widget/src/windows/nsDragService.h => widget/windows/nsDragService.h rename : widget/src/windows/nsFilePicker.cpp => widget/windows/nsFilePicker.cpp rename : widget/src/windows/nsFilePicker.h => widget/windows/nsFilePicker.h rename : widget/src/windows/nsIMM32Handler.cpp => widget/windows/nsIMM32Handler.cpp rename : widget/src/windows/nsIMM32Handler.h => widget/windows/nsIMM32Handler.h rename : widget/src/windows/nsIdleServiceWin.cpp => widget/windows/nsIdleServiceWin.cpp rename : widget/src/windows/nsIdleServiceWin.h => widget/windows/nsIdleServiceWin.h rename : widget/src/windows/nsImageClipboard.cpp => widget/windows/nsImageClipboard.cpp rename : widget/src/windows/nsImageClipboard.h => widget/windows/nsImageClipboard.h rename : widget/src/windows/nsLookAndFeel.cpp => widget/windows/nsLookAndFeel.cpp rename : widget/src/windows/nsLookAndFeel.h => widget/windows/nsLookAndFeel.h rename : widget/src/windows/nsNativeDragSource.cpp => widget/windows/nsNativeDragSource.cpp rename : widget/src/windows/nsNativeDragSource.h => widget/windows/nsNativeDragSource.h rename : widget/src/windows/nsNativeDragTarget.cpp => widget/windows/nsNativeDragTarget.cpp rename : widget/src/windows/nsNativeDragTarget.h => widget/windows/nsNativeDragTarget.h rename : widget/src/windows/nsNativeThemeWin.cpp => widget/windows/nsNativeThemeWin.cpp rename : widget/src/windows/nsNativeThemeWin.h => widget/windows/nsNativeThemeWin.h rename : widget/src/windows/nsPrintOptionsWin.cpp => widget/windows/nsPrintOptionsWin.cpp rename : widget/src/windows/nsPrintOptionsWin.h => widget/windows/nsPrintOptionsWin.h rename : widget/src/windows/nsPrintSettingsWin.cpp => widget/windows/nsPrintSettingsWin.cpp rename : widget/src/windows/nsPrintSettingsWin.h => widget/windows/nsPrintSettingsWin.h rename : widget/src/windows/nsScreenManagerWin.cpp => widget/windows/nsScreenManagerWin.cpp rename : widget/src/windows/nsScreenManagerWin.h => widget/windows/nsScreenManagerWin.h rename : widget/src/windows/nsScreenWin.cpp => widget/windows/nsScreenWin.cpp rename : widget/src/windows/nsScreenWin.h => widget/windows/nsScreenWin.h rename : widget/src/windows/nsSound.cpp => widget/windows/nsSound.cpp rename : widget/src/windows/nsSound.h => widget/windows/nsSound.h rename : widget/src/windows/nsTextStore.cpp => widget/windows/nsTextStore.cpp rename : widget/src/windows/nsTextStore.h => widget/windows/nsTextStore.h rename : widget/src/windows/nsToolkit.cpp => widget/windows/nsToolkit.cpp rename : widget/src/windows/nsToolkit.h => widget/windows/nsToolkit.h rename : widget/src/windows/nsUXThemeConstants.h => widget/windows/nsUXThemeConstants.h rename : widget/src/windows/nsUXThemeData.cpp => widget/windows/nsUXThemeData.cpp rename : widget/src/windows/nsUXThemeData.h => widget/windows/nsUXThemeData.h rename : widget/src/windows/nsWinGesture.cpp => widget/windows/nsWinGesture.cpp rename : widget/src/windows/nsWinGesture.h => widget/windows/nsWinGesture.h rename : widget/src/windows/nsWindow.cpp => widget/windows/nsWindow.cpp rename : widget/src/windows/nsWindow.h => widget/windows/nsWindow.h rename : widget/src/windows/nsWindowDbg.cpp => widget/windows/nsWindowDbg.cpp rename : widget/src/windows/nsWindowDbg.h => widget/windows/nsWindowDbg.h rename : widget/src/windows/nsWindowDefs.h => widget/windows/nsWindowDefs.h rename : widget/src/windows/nsWindowGfx.cpp => widget/windows/nsWindowGfx.cpp rename : widget/src/windows/nsWindowGfx.h => widget/windows/nsWindowGfx.h rename : widget/src/windows/nsdefs.h => widget/windows/nsdefs.h rename : widget/src/windows/resource.h => widget/windows/resource.h rename : widget/src/windows/tests/Makefile.in => widget/windows/tests/Makefile.in rename : widget/src/windows/tests/TestWinDND.cpp => widget/windows/tests/TestWinDND.cpp rename : widget/src/xpwidgets/GfxDriverInfo.cpp => widget/xpwidgets/GfxDriverInfo.cpp rename : widget/src/xpwidgets/GfxDriverInfo.h => widget/xpwidgets/GfxDriverInfo.h rename : widget/src/xpwidgets/GfxInfoBase.cpp => widget/xpwidgets/GfxInfoBase.cpp rename : widget/src/xpwidgets/GfxInfoBase.h => widget/xpwidgets/GfxInfoBase.h rename : widget/src/xpwidgets/GfxInfoCollector.h => widget/xpwidgets/GfxInfoCollector.h rename : widget/src/xpwidgets/GfxInfoWebGL.cpp => widget/xpwidgets/GfxInfoWebGL.cpp rename : widget/src/xpwidgets/GfxInfoWebGL.h => widget/xpwidgets/GfxInfoWebGL.h rename : widget/src/xpwidgets/GfxInfoX11.cpp => widget/xpwidgets/GfxInfoX11.cpp rename : widget/src/xpwidgets/GfxInfoX11.h => widget/xpwidgets/GfxInfoX11.h rename : widget/src/xpwidgets/Makefile.in => widget/xpwidgets/Makefile.in rename : widget/src/xpwidgets/PuppetWidget.cpp => widget/xpwidgets/PuppetWidget.cpp rename : widget/src/xpwidgets/PuppetWidget.h => widget/xpwidgets/PuppetWidget.h rename : widget/src/xpwidgets/nsAppShellSingleton.h => widget/xpwidgets/nsAppShellSingleton.h rename : widget/src/xpwidgets/nsBaseAppShell.cpp => widget/xpwidgets/nsBaseAppShell.cpp rename : widget/src/xpwidgets/nsBaseAppShell.h => widget/xpwidgets/nsBaseAppShell.h rename : widget/src/xpwidgets/nsBaseClipboard.cpp => widget/xpwidgets/nsBaseClipboard.cpp rename : widget/src/xpwidgets/nsBaseClipboard.h => widget/xpwidgets/nsBaseClipboard.h rename : widget/src/xpwidgets/nsBaseDragService.cpp => widget/xpwidgets/nsBaseDragService.cpp rename : widget/src/xpwidgets/nsBaseDragService.h => widget/xpwidgets/nsBaseDragService.h rename : widget/src/xpwidgets/nsBaseFilePicker.cpp => widget/xpwidgets/nsBaseFilePicker.cpp rename : widget/src/xpwidgets/nsBaseFilePicker.h => widget/xpwidgets/nsBaseFilePicker.h rename : widget/src/xpwidgets/nsBaseWidget.cpp => widget/xpwidgets/nsBaseWidget.cpp rename : widget/src/xpwidgets/nsBaseWidget.h => widget/xpwidgets/nsBaseWidget.h rename : widget/src/xpwidgets/nsClipboardHelper.cpp => widget/xpwidgets/nsClipboardHelper.cpp rename : widget/src/xpwidgets/nsClipboardHelper.h => widget/xpwidgets/nsClipboardHelper.h rename : widget/src/xpwidgets/nsClipboardPrivacyHandler.cpp => widget/xpwidgets/nsClipboardPrivacyHandler.cpp rename : widget/src/xpwidgets/nsClipboardPrivacyHandler.h => widget/xpwidgets/nsClipboardPrivacyHandler.h rename : widget/src/xpwidgets/nsFilePickerProxy.cpp => widget/xpwidgets/nsFilePickerProxy.cpp rename : widget/src/xpwidgets/nsFilePickerProxy.h => widget/xpwidgets/nsFilePickerProxy.h rename : widget/src/xpwidgets/nsHTMLFormatConverter.cpp => widget/xpwidgets/nsHTMLFormatConverter.cpp rename : widget/src/xpwidgets/nsHTMLFormatConverter.h => widget/xpwidgets/nsHTMLFormatConverter.h rename : widget/src/xpwidgets/nsIdleService.cpp => widget/xpwidgets/nsIdleService.cpp rename : widget/src/xpwidgets/nsIdleService.h => widget/xpwidgets/nsIdleService.h rename : widget/src/xpwidgets/nsNativeTheme.cpp => widget/xpwidgets/nsNativeTheme.cpp rename : widget/src/xpwidgets/nsNativeTheme.h => widget/xpwidgets/nsNativeTheme.h rename : widget/src/xpwidgets/nsPrimitiveHelpers.cpp => widget/xpwidgets/nsPrimitiveHelpers.cpp rename : widget/src/xpwidgets/nsPrimitiveHelpers.h => widget/xpwidgets/nsPrimitiveHelpers.h rename : widget/src/xpwidgets/nsPrintOptionsImpl.cpp => widget/xpwidgets/nsPrintOptionsImpl.cpp rename : widget/src/xpwidgets/nsPrintOptionsImpl.h => widget/xpwidgets/nsPrintOptionsImpl.h rename : widget/src/xpwidgets/nsPrintSession.cpp => widget/xpwidgets/nsPrintSession.cpp rename : widget/src/xpwidgets/nsPrintSession.h => widget/xpwidgets/nsPrintSession.h rename : widget/src/xpwidgets/nsPrintSettingsImpl.cpp => widget/xpwidgets/nsPrintSettingsImpl.cpp rename : widget/src/xpwidgets/nsPrintSettingsImpl.h => widget/xpwidgets/nsPrintSettingsImpl.h rename : widget/src/xpwidgets/nsTransferable.cpp => widget/xpwidgets/nsTransferable.cpp rename : widget/src/xpwidgets/nsTransferable.h => widget/xpwidgets/nsTransferable.h rename : widget/src/xpwidgets/nsXPLookAndFeel.cpp => widget/xpwidgets/nsXPLookAndFeel.cpp rename : widget/src/xpwidgets/nsXPLookAndFeel.h => widget/xpwidgets/nsXPLookAndFeel.h rename : widget/src/xremoteclient/Makefile.in => widget/xremoteclient/Makefile.in rename : widget/src/xremoteclient/XRemoteClient.cpp => widget/xremoteclient/XRemoteClient.cpp rename : widget/src/xremoteclient/XRemoteClient.h => widget/xremoteclient/XRemoteClient.h rename : widget/src/xremoteclient/XRemoteClientFactory.cpp => widget/xremoteclient/XRemoteClientFactory.cpp rename : widget/src/xremoteclient/mozilla-xremote-client.cpp => widget/xremoteclient/mozilla-xremote-client.cpp rename : widget/src/xremoteclient/nsRemoteClient.h => widget/xremoteclient/nsRemoteClient.h
1722 lines
56 KiB
C++
1722 lines
56 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Ningjie Chen <chenn@email.uc.edu>
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
#include <olectl.h>
|
|
|
|
#include "nscore.h"
|
|
#include "nsTextStore.h"
|
|
#include "nsWindow.h"
|
|
#include "prlog.h"
|
|
#include "nsPrintfCString.h"
|
|
#include "mozilla/Preferences.h"
|
|
|
|
using namespace mozilla;
|
|
using namespace mozilla::widget;
|
|
|
|
/******************************************************************/
|
|
/* nsTextStore */
|
|
/******************************************************************/
|
|
|
|
ITfThreadMgr* nsTextStore::sTsfThreadMgr = NULL;
|
|
ITfDisplayAttributeMgr* nsTextStore::sDisplayAttrMgr = NULL;
|
|
ITfCategoryMgr* nsTextStore::sCategoryMgr = NULL;
|
|
DWORD nsTextStore::sTsfClientId = 0;
|
|
nsTextStore* nsTextStore::sTsfTextStore = NULL;
|
|
|
|
UINT nsTextStore::sFlushTIPInputMessage = 0;
|
|
|
|
#ifdef PR_LOGGING
|
|
PRLogModuleInfo* sTextStoreLog = nsnull;
|
|
#endif
|
|
|
|
nsTextStore::nsTextStore()
|
|
{
|
|
mRefCnt = 1;
|
|
mEditCookie = 0;
|
|
mSinkMask = 0;
|
|
mWindow = nsnull;
|
|
mLock = 0;
|
|
mLockQueued = 0;
|
|
mTextChange.acpStart = PR_INT32_MAX;
|
|
mTextChange.acpOldEnd = mTextChange.acpNewEnd = 0;
|
|
mLastDispatchedTextEvent = nsnull;
|
|
}
|
|
|
|
nsTextStore::~nsTextStore()
|
|
{
|
|
if (mCompositionTimer) {
|
|
mCompositionTimer->Cancel();
|
|
mCompositionTimer = nsnull;
|
|
}
|
|
SaveTextEvent(nsnull);
|
|
}
|
|
|
|
bool
|
|
nsTextStore::Create(nsWindow* aWindow,
|
|
IMEState::Enabled aIMEEnabled)
|
|
{
|
|
if (!mDocumentMgr) {
|
|
// Create document manager
|
|
HRESULT hr = sTsfThreadMgr->CreateDocumentMgr(
|
|
getter_AddRefs(mDocumentMgr));
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), false);
|
|
mWindow = aWindow;
|
|
// Create context and add it to document manager
|
|
hr = mDocumentMgr->CreateContext(sTsfClientId, 0,
|
|
static_cast<ITextStoreACP*>(this),
|
|
getter_AddRefs(mContext), &mEditCookie);
|
|
if (SUCCEEDED(hr)) {
|
|
SetInputContextInternal(aIMEEnabled);
|
|
hr = mDocumentMgr->Push(mContext);
|
|
}
|
|
if (SUCCEEDED(hr)) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: Created, window=%08x\n", aWindow));
|
|
return true;
|
|
}
|
|
mContext = NULL;
|
|
mDocumentMgr = NULL;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
nsTextStore::Destroy(void)
|
|
{
|
|
if (mWindow) {
|
|
// When blurred, Tablet Input Panel posts "blur" messages
|
|
// and try to insert text when the message is retrieved later.
|
|
// But by that time the text store is already destroyed,
|
|
// so try to get the message early
|
|
MSG msg;
|
|
if (::PeekMessageW(&msg, mWindow->GetWindowHandle(),
|
|
sFlushTIPInputMessage, sFlushTIPInputMessage,
|
|
PM_REMOVE)) {
|
|
::DispatchMessageW(&msg);
|
|
}
|
|
}
|
|
mContext = NULL;
|
|
if (mDocumentMgr) {
|
|
mDocumentMgr->Pop(TF_POPF_ALL);
|
|
mDocumentMgr = NULL;
|
|
}
|
|
mSink = NULL;
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: Destroyed, window=%08x\n", mWindow));
|
|
mWindow = NULL;
|
|
return true;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::QueryInterface(REFIID riid,
|
|
void** ppv)
|
|
{
|
|
*ppv=NULL;
|
|
if ( (IID_IUnknown == riid) || (IID_ITextStoreACP == riid) ) {
|
|
*ppv = static_cast<ITextStoreACP*>(this);
|
|
} else if (IID_ITfContextOwnerCompositionSink == riid) {
|
|
*ppv = static_cast<ITfContextOwnerCompositionSink*>(this);
|
|
}
|
|
if (*ppv) {
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) nsTextStore::AddRef()
|
|
{
|
|
return ++mRefCnt;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) nsTextStore::Release()
|
|
{
|
|
--mRefCnt;
|
|
if (0 != mRefCnt)
|
|
return mRefCnt;
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::AdviseSink(REFIID riid,
|
|
IUnknown *punk,
|
|
DWORD dwMask)
|
|
{
|
|
NS_ENSURE_TRUE(punk && IID_ITextStoreACPSink == riid, E_INVALIDARG);
|
|
if (!mSink) {
|
|
// Install sink
|
|
punk->QueryInterface(IID_ITextStoreACPSink, getter_AddRefs(mSink));
|
|
NS_ENSURE_TRUE(mSink, E_UNEXPECTED);
|
|
} else {
|
|
// If sink is already installed we check to see if they are the same
|
|
// Get IUnknown from both sides for comparison
|
|
nsRefPtr<IUnknown> comparison1, comparison2;
|
|
punk->QueryInterface(IID_IUnknown, getter_AddRefs(comparison1));
|
|
mSink->QueryInterface(IID_IUnknown, getter_AddRefs(comparison2));
|
|
if (comparison1 != comparison2)
|
|
return CONNECT_E_ADVISELIMIT;
|
|
}
|
|
// Update mask either for a new sink or an existing sink
|
|
mSinkMask = dwMask;
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: Sink installed, punk=%08x\n", punk));
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::UnadviseSink(IUnknown *punk)
|
|
{
|
|
NS_ENSURE_TRUE(punk, E_INVALIDARG);
|
|
NS_ENSURE_TRUE(mSink, CONNECT_E_NOCONNECTION);
|
|
// Get IUnknown from both sides for comparison
|
|
nsRefPtr<IUnknown> comparison1, comparison2;
|
|
punk->QueryInterface(IID_IUnknown, getter_AddRefs(comparison1));
|
|
mSink->QueryInterface(IID_IUnknown, getter_AddRefs(comparison2));
|
|
// Unadvise only if sinks are the same
|
|
NS_ENSURE_TRUE(comparison1 == comparison2, CONNECT_E_NOCONNECTION);
|
|
mSink = NULL;
|
|
mSinkMask = 0;
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: Sink removed, punk=%08x\n", punk));
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::RequestLock(DWORD dwLockFlags,
|
|
HRESULT *phrSession)
|
|
{
|
|
NS_ENSURE_TRUE(mSink, E_FAIL);
|
|
NS_ENSURE_TRUE(phrSession, E_INVALIDARG);
|
|
if (mLock) {
|
|
// only time when reentrant lock is allowed is when caller holds a
|
|
// read-only lock and is requesting an async write lock
|
|
if (TS_LF_READ == (mLock & TS_LF_READWRITE) &&
|
|
TS_LF_READWRITE == (dwLockFlags & TS_LF_READWRITE) &&
|
|
!(dwLockFlags & TS_LF_SYNC)) {
|
|
*phrSession = TS_S_ASYNC;
|
|
mLockQueued = dwLockFlags & (~TS_LF_SYNC);
|
|
} else {
|
|
// no more locks allowed
|
|
*phrSession = TS_E_SYNCHRONOUS;
|
|
return E_FAIL;
|
|
}
|
|
} else {
|
|
// put on lock
|
|
mLock = dwLockFlags & (~TS_LF_SYNC);
|
|
*phrSession = mSink->OnLockGranted(mLock);
|
|
while (mLockQueued) {
|
|
mLock = mLockQueued;
|
|
mLockQueued = 0;
|
|
mSink->OnLockGranted(mLock);
|
|
}
|
|
mLock = 0;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetStatus(TS_STATUS *pdcs)
|
|
{
|
|
NS_ENSURE_TRUE(pdcs, E_INVALIDARG);
|
|
pdcs->dwDynamicFlags = 0;
|
|
// we use a "flat" text model for TSF support so no hidden text
|
|
pdcs->dwStaticFlags = TS_SS_NOHIDDENTEXT;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::QueryInsert(LONG acpTestStart,
|
|
LONG acpTestEnd,
|
|
ULONG cch,
|
|
LONG *pacpResultStart,
|
|
LONG *pacpResultEnd)
|
|
{
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: QueryInsert, start=%ld end=%ld cch=%lu\n",
|
|
acpTestStart, acpTestEnd, cch));
|
|
// We don't test to see if these positions are
|
|
// after the end of document for performance reasons
|
|
NS_ENSURE_TRUE(0 <= acpTestStart && acpTestStart <= acpTestEnd &&
|
|
pacpResultStart && pacpResultEnd, E_INVALIDARG);
|
|
|
|
// XXX need to adjust to cluster boundary
|
|
// Assume we are given good offsets for now
|
|
*pacpResultStart = acpTestStart;
|
|
*pacpResultEnd = acpTestStart + cch;
|
|
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: QueryInsert SUCCEEDED\n"));
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetSelection(ULONG ulIndex,
|
|
ULONG ulCount,
|
|
TS_SELECTION_ACP *pSelection,
|
|
ULONG *pcFetched)
|
|
{
|
|
NS_ENSURE_TRUE(TS_LF_READ == (mLock & TS_LF_READ), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(ulCount && pSelection && pcFetched, E_INVALIDARG);
|
|
|
|
*pcFetched = 0;
|
|
NS_ENSURE_TRUE((ULONG)TS_DEFAULT_SELECTION == ulIndex || 0 == ulIndex,
|
|
TS_E_NOSELECTION);
|
|
if (mCompositionView) {
|
|
// Emulate selection during compositions
|
|
*pSelection = mCompositionSelection;
|
|
} else {
|
|
// Construct and initialize an event to get selection info
|
|
nsQueryContentEvent event(true, NS_QUERY_SELECTED_TEXT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
NS_ENSURE_TRUE(event.mSucceeded, E_FAIL);
|
|
// Usually the selection anchor (beginning) position corresponds to the
|
|
// TSF start and the selection focus (ending) position corresponds to
|
|
// the TSF end, but if selection is reversed the focus now corresponds
|
|
// to the TSF start and the anchor now corresponds to the TSF end
|
|
pSelection->acpStart = event.mReply.mOffset;
|
|
pSelection->acpEnd = pSelection->acpStart + event.mReply.mString.Length();
|
|
pSelection->style.ase = event.mReply.mString.Length() &&
|
|
event.mReply.mReversed ? TS_AE_START : TS_AE_END;
|
|
// No support for interim character
|
|
pSelection->style.fInterimChar = 0;
|
|
}
|
|
*pcFetched = 1;
|
|
return S_OK;
|
|
}
|
|
|
|
static HRESULT
|
|
GetRangeExtent(ITfRange* aRange, LONG* aStart, LONG* aLength)
|
|
{
|
|
nsRefPtr<ITfRangeACP> rangeACP;
|
|
aRange->QueryInterface(IID_ITfRangeACP, getter_AddRefs(rangeACP));
|
|
NS_ENSURE_TRUE(rangeACP, E_FAIL);
|
|
return rangeACP->GetExtent(aStart, aLength);
|
|
}
|
|
|
|
static PRUint32
|
|
GetGeckoSelectionValue(TF_DISPLAYATTRIBUTE &aDisplayAttr)
|
|
{
|
|
PRUint32 result;
|
|
switch (aDisplayAttr.bAttr) {
|
|
case TF_ATTR_TARGET_CONVERTED:
|
|
result = NS_TEXTRANGE_SELECTEDCONVERTEDTEXT;
|
|
break;
|
|
case TF_ATTR_CONVERTED:
|
|
result = NS_TEXTRANGE_CONVERTEDTEXT;
|
|
break;
|
|
case TF_ATTR_TARGET_NOTCONVERTED:
|
|
result = NS_TEXTRANGE_SELECTEDRAWTEXT;
|
|
break;
|
|
default:
|
|
result = NS_TEXTRANGE_RAWINPUT;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
#ifdef PR_LOGGING
|
|
static void
|
|
GetLogTextFor(const TF_DA_COLOR &aColor, nsACString &aText)
|
|
{
|
|
aText = "type: ";
|
|
switch (aColor.type) {
|
|
case TF_CT_NONE:
|
|
aText += "TF_CT_NONE";
|
|
break;
|
|
case TF_CT_SYSCOLOR: {
|
|
nsPrintfCString tmp("TF_CT_SYSCOLOR, nIndex:0x%08X",
|
|
PRInt32(aColor.nIndex));
|
|
aText += tmp;
|
|
break;
|
|
}
|
|
case TF_CT_COLORREF: {
|
|
nsPrintfCString tmp("TF_CT_COLORREF, cr:0x%08X", PRInt32(aColor.cr));
|
|
aText += tmp;
|
|
break;
|
|
}
|
|
default: {
|
|
nsPrintfCString tmp("Unknown(%08X)", PRInt32(aColor.type));
|
|
aText += tmp;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
GetLogTextFor(TF_DA_LINESTYLE aLineStyle, nsACString &aText)
|
|
{
|
|
switch (aLineStyle) {
|
|
case TF_LS_NONE:
|
|
aText = "TF_LS_NONE";
|
|
break;
|
|
case TF_LS_SOLID:
|
|
aText = "TF_LS_SOLID";
|
|
break;
|
|
case TF_LS_DOT:
|
|
aText = "TF_LS_DOT";
|
|
break;
|
|
case TF_LS_DASH:
|
|
aText = "TF_LS_DASH";
|
|
break;
|
|
case TF_LS_SQUIGGLE:
|
|
aText = "TF_LS_SQUIGGLE";
|
|
break;
|
|
default: {
|
|
nsPrintfCString tmp("Unknown(%08X)", PRInt32(aLineStyle));
|
|
aText = tmp;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
GetLogTextFor(TF_DA_ATTR_INFO aAttr, nsACString &aText)
|
|
{
|
|
switch (aAttr) {
|
|
case TF_ATTR_INPUT:
|
|
aText = "TF_ATTR_INPUT";
|
|
break;
|
|
case TF_ATTR_TARGET_CONVERTED:
|
|
aText = "TF_ATTR_TARGET_CONVERTED";
|
|
break;
|
|
case TF_ATTR_CONVERTED:
|
|
aText = "TF_ATTR_CONVERTED";
|
|
break;
|
|
case TF_ATTR_TARGET_NOTCONVERTED:
|
|
aText = "TF_ATTR_TARGET_NOTCONVERTED";
|
|
break;
|
|
case TF_ATTR_INPUT_ERROR:
|
|
aText = "TF_ATTR_INPUT_ERROR";
|
|
break;
|
|
case TF_ATTR_FIXEDCONVERTED:
|
|
aText = "TF_ATTR_FIXEDCONVERTED";
|
|
break;
|
|
case TF_ATTR_OTHER:
|
|
aText = "TF_ATTR_OTHER";
|
|
break;
|
|
default: {
|
|
nsPrintfCString tmp("Unknown(%08X)", PRInt32(aAttr));
|
|
aText = tmp;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static nsCString
|
|
GetLogTextFor(const TF_DISPLAYATTRIBUTE &aDispAttr)
|
|
{
|
|
nsCAutoString str, tmp;
|
|
str = "crText:{ ";
|
|
GetLogTextFor(aDispAttr.crText, tmp);
|
|
str += tmp;
|
|
str += " }, crBk:{ ";
|
|
GetLogTextFor(aDispAttr.crBk, tmp);
|
|
str += tmp;
|
|
str += " }, lsStyle: ";
|
|
GetLogTextFor(aDispAttr.lsStyle, tmp);
|
|
str += tmp;
|
|
str += ", fBoldLine: ";
|
|
str += aDispAttr.fBoldLine ? "TRUE" : "FALSE";
|
|
str += ", crLine:{ ";
|
|
GetLogTextFor(aDispAttr.crLine, tmp);
|
|
str += tmp;
|
|
str += " }, bAttr: ";
|
|
GetLogTextFor(aDispAttr.bAttr, tmp);
|
|
str += tmp;
|
|
return str;
|
|
}
|
|
#endif // PR_LOGGING
|
|
|
|
HRESULT
|
|
nsTextStore::GetDisplayAttribute(ITfProperty* aAttrProperty,
|
|
ITfRange* aRange,
|
|
TF_DISPLAYATTRIBUTE* aResult)
|
|
{
|
|
NS_ENSURE_TRUE(aAttrProperty, E_FAIL);
|
|
NS_ENSURE_TRUE(aRange, E_FAIL);
|
|
NS_ENSURE_TRUE(aResult, E_FAIL);
|
|
|
|
HRESULT hr;
|
|
|
|
#ifdef PR_LOGGING
|
|
LONG start = 0, length = 0;
|
|
hr = GetRangeExtent(aRange, &start, &length);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: GetDisplayAttribute range=%ld-%ld\n",
|
|
start - mCompositionStart, start - mCompositionStart + length));
|
|
#endif
|
|
|
|
VARIANT propValue;
|
|
::VariantInit(&propValue);
|
|
hr = aAttrProperty->GetValue(TfEditCookie(mEditCookie), aRange, &propValue);
|
|
if (FAILED(hr)) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
(" ITfProperty::GetValue Failed\n"));
|
|
return hr;
|
|
}
|
|
if (VT_I4 != propValue.vt) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
(" ITfProperty::GetValue returns non-VT_I4 value\n"));
|
|
::VariantClear(&propValue);
|
|
return E_FAIL;
|
|
}
|
|
|
|
NS_ENSURE_TRUE(sCategoryMgr, E_FAIL);
|
|
GUID guid;
|
|
hr = sCategoryMgr->GetGUID(DWORD(propValue.lVal), &guid);
|
|
::VariantClear(&propValue);
|
|
if (FAILED(hr)) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
(" ITfCategoryMgr::GetGUID Failed\n"));
|
|
return hr;
|
|
}
|
|
|
|
NS_ENSURE_TRUE(sDisplayAttrMgr, E_FAIL);
|
|
nsRefPtr<ITfDisplayAttributeInfo> info;
|
|
hr = sDisplayAttrMgr->GetDisplayAttributeInfo(guid, getter_AddRefs(info),
|
|
NULL);
|
|
if (FAILED(hr) || !info) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
(" ITfDisplayAttributeMgr::GetDisplayAttributeInfo Failed\n"));
|
|
return hr;
|
|
}
|
|
|
|
hr = info->GetAttributeInfo(aResult);
|
|
if (FAILED(hr)) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
(" ITfDisplayAttributeInfo::GetAttributeInfo Failed\n"));
|
|
return hr;
|
|
}
|
|
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: GetDisplayAttribute Result={ %s }\n",
|
|
GetLogTextFor(*aResult).get()));
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
nsTextStore::SaveTextEvent(const nsTextEvent* aEvent)
|
|
{
|
|
if (mLastDispatchedTextEvent) {
|
|
if (mLastDispatchedTextEvent->rangeArray)
|
|
delete [] mLastDispatchedTextEvent->rangeArray;
|
|
delete mLastDispatchedTextEvent;
|
|
mLastDispatchedTextEvent = nsnull;
|
|
}
|
|
if (!aEvent)
|
|
return S_OK;
|
|
|
|
mLastDispatchedTextEvent = new nsTextEvent(true, NS_TEXT_TEXT, nsnull);
|
|
if (!mLastDispatchedTextEvent)
|
|
return E_OUTOFMEMORY;
|
|
mLastDispatchedTextEvent->rangeCount = aEvent->rangeCount;
|
|
mLastDispatchedTextEvent->theText = aEvent->theText;
|
|
mLastDispatchedTextEvent->rangeArray = nsnull;
|
|
|
|
if (aEvent->rangeCount == 0)
|
|
return S_OK;
|
|
|
|
NS_ENSURE_TRUE(aEvent->rangeArray, E_FAIL);
|
|
|
|
mLastDispatchedTextEvent->rangeArray = new nsTextRange[aEvent->rangeCount];
|
|
if (!mLastDispatchedTextEvent->rangeArray) {
|
|
delete mLastDispatchedTextEvent;
|
|
mLastDispatchedTextEvent = nsnull;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
memcpy(mLastDispatchedTextEvent->rangeArray, aEvent->rangeArray,
|
|
sizeof(nsTextRange) * aEvent->rangeCount);
|
|
return S_OK;
|
|
}
|
|
|
|
static bool
|
|
IsSameTextEvent(const nsTextEvent* aEvent1, const nsTextEvent* aEvent2)
|
|
{
|
|
NS_PRECONDITION(aEvent1 || aEvent2, "both events are null");
|
|
NS_PRECONDITION(aEvent2 && (aEvent1 != aEvent2),
|
|
"both events are same instance");
|
|
|
|
return (aEvent1 && aEvent2 &&
|
|
aEvent1->rangeCount == aEvent2->rangeCount &&
|
|
aEvent1->theText == aEvent2->theText &&
|
|
(aEvent1->rangeCount == 0 ||
|
|
((aEvent1->rangeArray && aEvent2->rangeArray) &&
|
|
!memcmp(aEvent1->rangeArray, aEvent2->rangeArray,
|
|
sizeof(nsTextRange) * aEvent1->rangeCount))));
|
|
}
|
|
|
|
HRESULT
|
|
nsTextStore::UpdateCompositionExtent(ITfRange* aRangeNew)
|
|
{
|
|
NS_ENSURE_TRUE(mCompositionView, E_FAIL);
|
|
|
|
HRESULT hr;
|
|
nsRefPtr<ITfCompositionView> pComposition(mCompositionView);
|
|
nsRefPtr<ITfRange> composingRange(aRangeNew);
|
|
if (!composingRange) {
|
|
hr = pComposition->GetRange(getter_AddRefs(composingRange));
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
}
|
|
|
|
// Get starting offset of the composition
|
|
LONG compStart = 0, compLength = 0;
|
|
hr = GetRangeExtent(composingRange, &compStart, &compLength);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
if (mCompositionStart != compStart ||
|
|
mCompositionString.Length() != (ULONG)compLength) {
|
|
// If the queried composition length is different from the length
|
|
// of our composition string, OnUpdateComposition is being called
|
|
// because a part of the original composition was committed.
|
|
// Reflect that by committing existing composition and starting
|
|
// a new one. OnEndComposition followed by OnStartComposition
|
|
// will accomplish this automagically.
|
|
OnEndComposition(pComposition);
|
|
OnStartCompositionInternal(pComposition, composingRange, true);
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: UpdateCompositionExtent, (reset) range=%ld-%ld\n",
|
|
compStart, compStart + compLength));
|
|
} else {
|
|
mCompositionLength = compLength;
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: UpdateCompositionExtent, range=%ld-%ld\n",
|
|
compStart, compStart + compLength));
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
static bool
|
|
GetColor(const TF_DA_COLOR &aTSFColor, nscolor &aResult)
|
|
{
|
|
switch (aTSFColor.type) {
|
|
case TF_CT_SYSCOLOR: {
|
|
DWORD sysColor = ::GetSysColor(aTSFColor.nIndex);
|
|
aResult = NS_RGB(GetRValue(sysColor), GetGValue(sysColor),
|
|
GetBValue(sysColor));
|
|
return true;
|
|
}
|
|
case TF_CT_COLORREF:
|
|
aResult = NS_RGB(GetRValue(aTSFColor.cr), GetGValue(aTSFColor.cr),
|
|
GetBValue(aTSFColor.cr));
|
|
return true;
|
|
case TF_CT_NONE:
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static bool
|
|
GetLineStyle(TF_DA_LINESTYLE aTSFLineStyle, PRUint8 &aTextRangeLineStyle)
|
|
{
|
|
switch (aTSFLineStyle) {
|
|
case TF_LS_NONE:
|
|
aTextRangeLineStyle = nsTextRangeStyle::LINESTYLE_NONE;
|
|
return true;
|
|
case TF_LS_SOLID:
|
|
aTextRangeLineStyle = nsTextRangeStyle::LINESTYLE_SOLID;
|
|
return true;
|
|
case TF_LS_DOT:
|
|
aTextRangeLineStyle = nsTextRangeStyle::LINESTYLE_DOTTED;
|
|
return true;
|
|
case TF_LS_DASH:
|
|
aTextRangeLineStyle = nsTextRangeStyle::LINESTYLE_DASHED;
|
|
return true;
|
|
case TF_LS_SQUIGGLE:
|
|
aTextRangeLineStyle = nsTextRangeStyle::LINESTYLE_WAVY;
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
HRESULT
|
|
nsTextStore::SendTextEventForCompositionString()
|
|
{
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SendTextEventForCompositionString\n"));
|
|
|
|
NS_ENSURE_TRUE(mCompositionView, E_FAIL);
|
|
|
|
// Getting display attributes is *really* complicated!
|
|
// We first get the context and the property objects to query for
|
|
// attributes, but since a big range can have a variety of values for
|
|
// the attribute, we have to find out all the ranges that have distinct
|
|
// attribute values. Then we query for what the value represents through
|
|
// the display attribute manager and translate that to nsTextRange to be
|
|
// sent in NS_TEXT_TEXT
|
|
|
|
nsRefPtr<ITfProperty> attrPropetry;
|
|
HRESULT hr = mContext->GetProperty(GUID_PROP_ATTRIBUTE,
|
|
getter_AddRefs(attrPropetry));
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr) && attrPropetry, hr);
|
|
|
|
// Use NS_TEXT_TEXT to set composition string
|
|
nsTextEvent event(true, NS_TEXT_TEXT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
|
|
nsRefPtr<ITfRange> composingRange;
|
|
hr = mCompositionView->GetRange(getter_AddRefs(composingRange));
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
|
|
nsRefPtr<IEnumTfRanges> enumRanges;
|
|
hr = attrPropetry->EnumRanges(TfEditCookie(mEditCookie),
|
|
getter_AddRefs(enumRanges), composingRange);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr) && enumRanges, hr);
|
|
|
|
nsAutoTArray<nsTextRange, 4> textRanges;
|
|
nsTextRange newRange;
|
|
// No matter if we have display attribute info or not,
|
|
// we always pass in at least one range to NS_TEXT_TEXT
|
|
newRange.mStartOffset = 0;
|
|
newRange.mEndOffset = mCompositionString.Length();
|
|
newRange.mRangeType = NS_TEXTRANGE_RAWINPUT;
|
|
textRanges.AppendElement(newRange);
|
|
|
|
nsRefPtr<ITfRange> range;
|
|
while (S_OK == enumRanges->Next(1, getter_AddRefs(range), NULL) && range) {
|
|
|
|
LONG start = 0, length = 0;
|
|
if (FAILED(GetRangeExtent(range, &start, &length)))
|
|
continue;
|
|
|
|
nsTextRange newRange;
|
|
newRange.mStartOffset = PRUint32(start - mCompositionStart);
|
|
// The end of the last range in the array is
|
|
// always kept at the end of composition
|
|
newRange.mEndOffset = mCompositionString.Length();
|
|
|
|
TF_DISPLAYATTRIBUTE attr;
|
|
hr = GetDisplayAttribute(attrPropetry, range, &attr);
|
|
if (FAILED(hr)) {
|
|
newRange.mRangeType = NS_TEXTRANGE_RAWINPUT;
|
|
} else {
|
|
newRange.mRangeType = GetGeckoSelectionValue(attr);
|
|
if (GetColor(attr.crText, newRange.mRangeStyle.mForegroundColor)) {
|
|
newRange.mRangeStyle.mDefinedStyles |=
|
|
nsTextRangeStyle::DEFINED_FOREGROUND_COLOR;
|
|
}
|
|
if (GetColor(attr.crBk, newRange.mRangeStyle.mBackgroundColor)) {
|
|
newRange.mRangeStyle.mDefinedStyles |=
|
|
nsTextRangeStyle::DEFINED_BACKGROUND_COLOR;
|
|
}
|
|
if (GetColor(attr.crLine, newRange.mRangeStyle.mUnderlineColor)) {
|
|
newRange.mRangeStyle.mDefinedStyles |=
|
|
nsTextRangeStyle::DEFINED_UNDERLINE_COLOR;
|
|
}
|
|
if (GetLineStyle(attr.lsStyle, newRange.mRangeStyle.mLineStyle)) {
|
|
newRange.mRangeStyle.mDefinedStyles |=
|
|
nsTextRangeStyle::DEFINED_LINESTYLE;
|
|
newRange.mRangeStyle.mIsBoldLine = attr.fBoldLine != 0;
|
|
}
|
|
}
|
|
|
|
nsTextRange& lastRange = textRanges[textRanges.Length() - 1];
|
|
if (lastRange.mStartOffset == newRange.mStartOffset) {
|
|
// Replace range if last range is the same as this one
|
|
// So that ranges don't overlap and confuse the editor
|
|
lastRange = newRange;
|
|
} else {
|
|
lastRange.mEndOffset = newRange.mStartOffset;
|
|
textRanges.AppendElement(newRange);
|
|
}
|
|
}
|
|
|
|
// We need to hack for Korean Input System which is Korean standard TIP.
|
|
// It sets no change style to IME selection (the selection is always only
|
|
// one). So, the composition string looks like normal (or committed) string.
|
|
// At this time, mCompositionSelection range is same as the composition
|
|
// string range. Other applications set a wide caret which covers the
|
|
// composition string, however, Gecko doesn't support the wide caret drawing
|
|
// now (Gecko doesn't support XOR drawing), unfortunately. For now, we should
|
|
// change the range style to undefined.
|
|
if (mCompositionSelection.acpStart != mCompositionSelection.acpEnd &&
|
|
textRanges.Length() == 1) {
|
|
nsTextRange& range = textRanges[0];
|
|
LONG start = NS_MIN(mCompositionSelection.acpStart,
|
|
mCompositionSelection.acpEnd);
|
|
LONG end = NS_MAX(mCompositionSelection.acpStart,
|
|
mCompositionSelection.acpEnd);
|
|
if ((LONG)range.mStartOffset == start - mCompositionStart &&
|
|
(LONG)range.mEndOffset == end - mCompositionStart &&
|
|
range.mRangeStyle.IsNoChangeStyle()) {
|
|
range.mRangeStyle.Clear();
|
|
// The looks of selected type is better than others.
|
|
range.mRangeType = NS_TEXTRANGE_SELECTEDRAWTEXT;
|
|
}
|
|
}
|
|
|
|
// The caret position has to be collapsed.
|
|
LONG caretPosition = NS_MAX(mCompositionSelection.acpStart,
|
|
mCompositionSelection.acpEnd);
|
|
caretPosition -= mCompositionStart;
|
|
nsTextRange caretRange;
|
|
caretRange.mStartOffset = caretRange.mEndOffset = PRUint32(caretPosition);
|
|
caretRange.mRangeType = NS_TEXTRANGE_CARETPOSITION;
|
|
textRanges.AppendElement(caretRange);
|
|
|
|
event.theText = mCompositionString;
|
|
event.rangeArray = textRanges.Elements();
|
|
event.rangeCount = textRanges.Length();
|
|
|
|
// If we are already send same text event, we should not resend it. Because
|
|
// it can be a cause of flickering.
|
|
if (IsSameTextEvent(mLastDispatchedTextEvent, &event)) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SendTextEventForCompositionString does not dispatch\n"));
|
|
return S_OK;
|
|
}
|
|
|
|
if (mCompositionString != mLastDispatchedCompositionString) {
|
|
nsCompositionEvent compositionUpdate(true, NS_COMPOSITION_UPDATE,
|
|
mWindow);
|
|
mWindow->InitEvent(compositionUpdate);
|
|
compositionUpdate.data = mCompositionString;
|
|
mLastDispatchedCompositionString = mCompositionString;
|
|
mWindow->DispatchWindowEvent(&compositionUpdate);
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SendTextEventForCompositionString compositionupdate "
|
|
"DISPATCHED\n"));
|
|
}
|
|
|
|
if (mWindow && !mWindow->Destroyed()) {
|
|
mWindow->DispatchWindowEvent(&event);
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SendTextEventForCompositionString text event DISPATCHED\n"));
|
|
}
|
|
return SaveTextEvent(&event);
|
|
}
|
|
|
|
HRESULT
|
|
nsTextStore::SetSelectionInternal(const TS_SELECTION_ACP* pSelection,
|
|
bool aDispatchTextEvent)
|
|
{
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SetSelection, sel=%ld-%ld\n",
|
|
pSelection->acpStart, pSelection->acpEnd));
|
|
if (mCompositionView) {
|
|
if (aDispatchTextEvent) {
|
|
HRESULT hr = UpdateCompositionExtent(nsnull);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
}
|
|
// Emulate selection during compositions
|
|
NS_ENSURE_TRUE(pSelection->acpStart >= mCompositionStart &&
|
|
pSelection->acpEnd <= mCompositionStart +
|
|
LONG(mCompositionString.Length()), TS_E_INVALIDPOS);
|
|
mCompositionSelection = *pSelection;
|
|
if (aDispatchTextEvent) {
|
|
HRESULT hr = SendTextEventForCompositionString();
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
}
|
|
} else {
|
|
nsSelectionEvent event(true, NS_SELECTION_SET, mWindow);
|
|
event.mOffset = pSelection->acpStart;
|
|
event.mLength = PRUint32(pSelection->acpEnd - pSelection->acpStart);
|
|
event.mReversed = pSelection->style.ase == TS_AE_START;
|
|
mWindow->InitEvent(event);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
NS_ENSURE_TRUE(event.mSucceeded, E_FAIL);
|
|
}
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SetSelection SUCCEEDED\n"));
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::SetSelection(ULONG ulCount,
|
|
const TS_SELECTION_ACP *pSelection)
|
|
{
|
|
NS_ENSURE_TRUE(TS_LF_READWRITE == (mLock & TS_LF_READWRITE), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(1 == ulCount && pSelection, E_INVALIDARG);
|
|
|
|
return SetSelectionInternal(pSelection, true);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetText(LONG acpStart,
|
|
LONG acpEnd,
|
|
WCHAR *pchPlain,
|
|
ULONG cchPlainReq,
|
|
ULONG *pcchPlainOut,
|
|
TS_RUNINFO *prgRunInfo,
|
|
ULONG ulRunInfoReq,
|
|
ULONG *pulRunInfoOut,
|
|
LONG *pacpNext)
|
|
{
|
|
NS_ENSURE_TRUE(TS_LF_READ == (mLock & TS_LF_READ), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(pcchPlainOut && (pchPlain || prgRunInfo) &&
|
|
(!cchPlainReq == !pchPlain) &&
|
|
(!ulRunInfoReq == !prgRunInfo), E_INVALIDARG);
|
|
NS_ENSURE_TRUE(0 <= acpStart && -1 <= acpEnd &&
|
|
(-1 == acpEnd || acpStart <= acpEnd), TS_E_INVALIDPOS);
|
|
|
|
// Making sure to NULL-terminate string just to be on the safe side
|
|
*pcchPlainOut = 0;
|
|
if (pchPlain && cchPlainReq) *pchPlain = 0;
|
|
if (pulRunInfoOut) *pulRunInfoOut = 0;
|
|
if (pacpNext) *pacpNext = acpStart;
|
|
if (prgRunInfo && ulRunInfoReq) {
|
|
prgRunInfo->uCount = 0;
|
|
prgRunInfo->type = TS_RT_PLAIN;
|
|
}
|
|
PRUint32 length = -1 == acpEnd ? PR_UINT32_MAX : PRUint32(acpEnd - acpStart);
|
|
if (cchPlainReq && cchPlainReq - 1 < length) {
|
|
length = cchPlainReq - 1;
|
|
}
|
|
if (length) {
|
|
LONG compNewStart = 0, compOldEnd = 0, compNewEnd = 0;
|
|
if (mCompositionView) {
|
|
// Sometimes GetText gets called between InsertTextAtSelection and
|
|
// OnUpdateComposition. In this case the returned text would
|
|
// be out of sync because we haven't sent NS_TEXT_TEXT in
|
|
// OnUpdateComposition yet. Manually resync here.
|
|
compOldEnd = NS_MIN(LONG(length) + acpStart,
|
|
mCompositionLength + mCompositionStart);
|
|
compNewEnd = NS_MIN(LONG(length) + acpStart,
|
|
LONG(mCompositionString.Length()) + mCompositionStart);
|
|
compNewStart = NS_MAX(acpStart, mCompositionStart);
|
|
// Check if the range is affected
|
|
if (compOldEnd > compNewStart || compNewEnd > compNewStart) {
|
|
NS_ASSERTION(compOldEnd >= mCompositionStart &&
|
|
compNewEnd >= mCompositionStart, "Range end is less than start\n");
|
|
length = PRUint32(LONG(length) + compOldEnd - compNewEnd);
|
|
}
|
|
}
|
|
// Send NS_QUERY_TEXT_CONTENT to get text content
|
|
nsQueryContentEvent event(true, NS_QUERY_TEXT_CONTENT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
event.InitForQueryTextContent(PRUint32(acpStart), length);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
NS_ENSURE_TRUE(event.mSucceeded, E_FAIL);
|
|
|
|
if (compOldEnd > compNewStart || compNewEnd > compNewStart) {
|
|
// Resync composition string
|
|
const PRUnichar* compStrStart = mCompositionString.BeginReading() +
|
|
NS_MAX<LONG>(compNewStart - mCompositionStart, 0);
|
|
event.mReply.mString.Replace(compNewStart - acpStart,
|
|
compOldEnd - mCompositionStart, compStrStart,
|
|
compNewEnd - mCompositionStart);
|
|
length = PRUint32(LONG(length) - compOldEnd + compNewEnd);
|
|
}
|
|
NS_ENSURE_TRUE(-1 == acpEnd || event.mReply.mString.Length() == length,
|
|
TS_E_INVALIDPOS);
|
|
length = NS_MIN(length, event.mReply.mString.Length());
|
|
|
|
if (pchPlain && cchPlainReq) {
|
|
memcpy(pchPlain, event.mReply.mString.BeginReading(),
|
|
length * sizeof(*pchPlain));
|
|
pchPlain[length] = 0;
|
|
*pcchPlainOut = length;
|
|
}
|
|
if (prgRunInfo && ulRunInfoReq) {
|
|
prgRunInfo->uCount = length;
|
|
prgRunInfo->type = TS_RT_PLAIN;
|
|
if (pulRunInfoOut) *pulRunInfoOut = 1;
|
|
}
|
|
if (pacpNext) *pacpNext = acpStart + length;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::SetText(DWORD dwFlags,
|
|
LONG acpStart,
|
|
LONG acpEnd,
|
|
const WCHAR *pchText,
|
|
ULONG cch,
|
|
TS_TEXTCHANGE *pChange)
|
|
{
|
|
// Per SDK documentation, and since we don't have better
|
|
// ways to do this, this method acts as a helper to
|
|
// call SetSelection followed by InsertTextAtSelection
|
|
NS_ENSURE_TRUE(TS_LF_READWRITE == (mLock & TS_LF_READWRITE), TS_E_NOLOCK);
|
|
TS_SELECTION_ACP selection;
|
|
selection.acpStart = acpStart;
|
|
selection.acpEnd = acpEnd;
|
|
selection.style.ase = TS_AE_END;
|
|
selection.style.fInterimChar = 0;
|
|
// Set selection to desired range
|
|
NS_ENSURE_TRUE(SUCCEEDED(SetSelectionInternal(&selection)), E_FAIL);
|
|
// Replace just selected text
|
|
return InsertTextAtSelection(TS_IAS_NOQUERY, pchText, cch,
|
|
NULL, NULL, pChange);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetFormattedText(LONG acpStart,
|
|
LONG acpEnd,
|
|
IDataObject **ppDataObject)
|
|
{
|
|
// no support for formatted text
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetEmbedded(LONG acpPos,
|
|
REFGUID rguidService,
|
|
REFIID riid,
|
|
IUnknown **ppunk)
|
|
{
|
|
// embedded objects are not supported
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::QueryInsertEmbedded(const GUID *pguidService,
|
|
const FORMATETC *pFormatEtc,
|
|
BOOL *pfInsertable)
|
|
{
|
|
// embedded objects are not supported
|
|
*pfInsertable = FALSE;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::InsertEmbedded(DWORD dwFlags,
|
|
LONG acpStart,
|
|
LONG acpEnd,
|
|
IDataObject *pDataObject,
|
|
TS_TEXTCHANGE *pChange)
|
|
{
|
|
// embedded objects are not supported
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::RequestSupportedAttrs(DWORD dwFlags,
|
|
ULONG cFilterAttrs,
|
|
const TS_ATTRID *paFilterAttrs)
|
|
{
|
|
// no attributes defined
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::RequestAttrsAtPosition(LONG acpPos,
|
|
ULONG cFilterAttrs,
|
|
const TS_ATTRID *paFilterAttrs,
|
|
DWORD dwFlags)
|
|
{
|
|
// no per character attributes defined
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::RequestAttrsTransitioningAtPosition(LONG acpPos,
|
|
ULONG cFilterAttrs,
|
|
const TS_ATTRID *paFilterAttr,
|
|
DWORD dwFlags)
|
|
{
|
|
// no per character attributes defined
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::FindNextAttrTransition(LONG acpStart,
|
|
LONG acpHalt,
|
|
ULONG cFilterAttrs,
|
|
const TS_ATTRID *paFilterAttrs,
|
|
DWORD dwFlags,
|
|
LONG *pacpNext,
|
|
BOOL *pfFound,
|
|
LONG *plFoundOffset)
|
|
{
|
|
NS_ENSURE_TRUE(pacpNext && pfFound && plFoundOffset, E_INVALIDARG);
|
|
// no per character attributes defined
|
|
*pacpNext = *plFoundOffset = acpHalt;
|
|
*pfFound = FALSE;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::RetrieveRequestedAttrs(ULONG ulCount,
|
|
TS_ATTRVAL *paAttrVals,
|
|
ULONG *pcFetched)
|
|
{
|
|
NS_ENSURE_TRUE(pcFetched && ulCount && paAttrVals, E_INVALIDARG);
|
|
// no attributes defined
|
|
*pcFetched = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetEndACP(LONG *pacp)
|
|
{
|
|
NS_ENSURE_TRUE(TS_LF_READ == (mLock & TS_LF_READ), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(pacp, E_INVALIDARG);
|
|
// Flattened text is retrieved and its length returned
|
|
nsQueryContentEvent event(true, NS_QUERY_TEXT_CONTENT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
// Return entire text
|
|
event.InitForQueryTextContent(0, PR_INT32_MAX);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
NS_ENSURE_TRUE(event.mSucceeded, E_FAIL);
|
|
*pacp = LONG(event.mReply.mString.Length());
|
|
return S_OK;
|
|
}
|
|
|
|
#define TEXTSTORE_DEFAULT_VIEW (1)
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetActiveView(TsViewCookie *pvcView)
|
|
{
|
|
NS_ENSURE_TRUE(pvcView, E_INVALIDARG);
|
|
*pvcView = TEXTSTORE_DEFAULT_VIEW;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetACPFromPoint(TsViewCookie vcView,
|
|
const POINT *pt,
|
|
DWORD dwFlags,
|
|
LONG *pacp)
|
|
{
|
|
NS_ENSURE_TRUE(TS_LF_READ == (mLock & TS_LF_READ), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(TEXTSTORE_DEFAULT_VIEW == vcView, E_INVALIDARG);
|
|
// not supported for now
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetTextExt(TsViewCookie vcView,
|
|
LONG acpStart,
|
|
LONG acpEnd,
|
|
RECT *prc,
|
|
BOOL *pfClipped)
|
|
{
|
|
NS_ENSURE_TRUE(TS_LF_READ == (mLock & TS_LF_READ), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(TEXTSTORE_DEFAULT_VIEW == vcView && prc && pfClipped,
|
|
E_INVALIDARG);
|
|
NS_ENSURE_TRUE(acpStart >= 0 && acpEnd >= acpStart, TS_E_INVALIDPOS);
|
|
|
|
// use NS_QUERY_TEXT_RECT to get rect in system, screen coordinates
|
|
nsQueryContentEvent event(true, NS_QUERY_TEXT_RECT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
event.InitForQueryTextRect(acpStart, acpEnd - acpStart);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
NS_ENSURE_TRUE(event.mSucceeded, TS_E_INVALIDPOS);
|
|
// IMEs don't like empty rects, fix here
|
|
if (event.mReply.mRect.width <= 0)
|
|
event.mReply.mRect.width = 1;
|
|
if (event.mReply.mRect.height <= 0)
|
|
event.mReply.mRect.height = 1;
|
|
|
|
// convert to unclipped screen rect
|
|
nsWindow* refWindow = static_cast<nsWindow*>(
|
|
event.mReply.mFocusedWidget ? event.mReply.mFocusedWidget : mWindow);
|
|
// Result rect is in top level widget coordinates
|
|
refWindow = refWindow->GetTopLevelWindow(false);
|
|
NS_ENSURE_TRUE(refWindow, E_FAIL);
|
|
|
|
event.mReply.mRect.MoveBy(refWindow->WidgetToScreenOffset());
|
|
|
|
// get bounding screen rect to test for clipping
|
|
HRESULT hr = GetScreenExt(vcView, prc);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
|
|
// clip text rect to bounding rect
|
|
RECT textRect;
|
|
::SetRect(&textRect, event.mReply.mRect.x, event.mReply.mRect.y,
|
|
event.mReply.mRect.XMost(), event.mReply.mRect.YMost());
|
|
if (!::IntersectRect(prc, prc, &textRect))
|
|
// Text is not visible
|
|
::SetRectEmpty(prc);
|
|
|
|
// not equal if text rect was clipped
|
|
*pfClipped = !::EqualRect(prc, &textRect);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetScreenExt(TsViewCookie vcView,
|
|
RECT *prc)
|
|
{
|
|
NS_ENSURE_TRUE(TEXTSTORE_DEFAULT_VIEW == vcView && prc, E_INVALIDARG);
|
|
// use NS_QUERY_EDITOR_RECT to get rect in system, screen coordinates
|
|
nsQueryContentEvent event(true, NS_QUERY_EDITOR_RECT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
NS_ENSURE_TRUE(event.mSucceeded, E_FAIL);
|
|
|
|
nsWindow* refWindow = static_cast<nsWindow*>(
|
|
event.mReply.mFocusedWidget ? event.mReply.mFocusedWidget : mWindow);
|
|
// Result rect is in top level widget coordinates
|
|
refWindow = refWindow->GetTopLevelWindow(false);
|
|
NS_ENSURE_TRUE(refWindow, E_FAIL);
|
|
|
|
nsIntRect boundRect;
|
|
nsresult rv = refWindow->GetClientBounds(boundRect);
|
|
NS_ENSURE_SUCCESS(rv, E_FAIL);
|
|
|
|
boundRect.MoveTo(0, 0);
|
|
|
|
// Clip frame rect to window rect
|
|
boundRect.IntersectRect(event.mReply.mRect, boundRect);
|
|
if (!boundRect.IsEmpty()) {
|
|
boundRect.MoveBy(refWindow->WidgetToScreenOffset());
|
|
::SetRect(prc, boundRect.x, boundRect.y,
|
|
boundRect.XMost(), boundRect.YMost());
|
|
} else {
|
|
::SetRectEmpty(prc);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::GetWnd(TsViewCookie vcView,
|
|
HWND *phwnd)
|
|
{
|
|
NS_ENSURE_TRUE(TEXTSTORE_DEFAULT_VIEW == vcView && phwnd, E_INVALIDARG);
|
|
*phwnd = mWindow->GetWindowHandle();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::InsertTextAtSelection(DWORD dwFlags,
|
|
const WCHAR *pchText,
|
|
ULONG cch,
|
|
LONG *pacpStart,
|
|
LONG *pacpEnd,
|
|
TS_TEXTCHANGE *pChange)
|
|
{
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: InsertTextAtSelection, cch=%lu\n", cch));
|
|
NS_ENSURE_TRUE(TS_LF_READWRITE == (mLock & TS_LF_READWRITE), TS_E_NOLOCK);
|
|
NS_ENSURE_TRUE(!cch || pchText, E_INVALIDARG);
|
|
|
|
// Get selection first
|
|
TS_SELECTION_ACP sel;
|
|
ULONG selFetched;
|
|
NS_ENSURE_TRUE(SUCCEEDED(GetSelection(
|
|
TS_DEFAULT_SELECTION, 1, &sel, &selFetched)) && selFetched, E_FAIL);
|
|
if (TS_IAS_QUERYONLY == dwFlags) {
|
|
NS_ENSURE_TRUE(pacpStart && pacpEnd, E_INVALIDARG);
|
|
// Simulate text insertion
|
|
*pacpStart = sel.acpStart;
|
|
*pacpEnd = sel.acpEnd;
|
|
if (pChange) {
|
|
pChange->acpStart = sel.acpStart;
|
|
pChange->acpOldEnd = sel.acpEnd;
|
|
pChange->acpNewEnd = sel.acpStart + cch;
|
|
}
|
|
} else {
|
|
NS_ENSURE_TRUE(pChange, E_INVALIDARG);
|
|
NS_ENSURE_TRUE(TS_IAS_NOQUERY == dwFlags || (pacpStart && pacpEnd),
|
|
E_INVALIDARG);
|
|
if (mCompositionView) {
|
|
// Emulate text insertion during compositions, because during a
|
|
// composition, editor expects the whole composition string to
|
|
// be sent in NS_TEXT_TEXT, not just the inserted part.
|
|
// The actual NS_TEXT_TEXT will be sent in SetSelection or
|
|
// OnUpdateComposition.
|
|
mCompositionString.Replace(PRUint32(sel.acpStart - mCompositionStart),
|
|
sel.acpEnd - sel.acpStart, pchText, cch);
|
|
|
|
mCompositionSelection.acpStart += cch;
|
|
mCompositionSelection.acpEnd = mCompositionSelection.acpStart;
|
|
mCompositionSelection.style.ase = TS_AE_END;
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: InsertTextAtSelection, replaced=%lu-%lu\n",
|
|
sel.acpStart - mCompositionStart,
|
|
sel.acpEnd - mCompositionStart));
|
|
} else {
|
|
// Use a temporary composition to contain the text
|
|
nsCompositionEvent compEvent(true, NS_COMPOSITION_START, mWindow);
|
|
mWindow->InitEvent(compEvent);
|
|
mWindow->DispatchWindowEvent(&compEvent);
|
|
if (mWindow && !mWindow->Destroyed()) {
|
|
compEvent.message = NS_COMPOSITION_UPDATE;
|
|
compEvent.data.Assign(pchText, cch);
|
|
mWindow->DispatchWindowEvent(&compEvent);
|
|
if (mWindow && !mWindow->Destroyed()) {
|
|
nsTextEvent event(true, NS_TEXT_TEXT, mWindow);
|
|
mWindow->InitEvent(event);
|
|
if (!cch) {
|
|
// XXX See OnEndComposition comment on inserting empty strings
|
|
event.theText = NS_LITERAL_STRING(" ");
|
|
mWindow->DispatchWindowEvent(&event);
|
|
}
|
|
if (mWindow && !mWindow->Destroyed()) {
|
|
event.theText.Assign(pchText, cch);
|
|
event.theText.ReplaceSubstring(NS_LITERAL_STRING("\r\n"),
|
|
NS_LITERAL_STRING("\n"));
|
|
mWindow->DispatchWindowEvent(&event);
|
|
if (mWindow && !mWindow->Destroyed()) {
|
|
compEvent.message = NS_COMPOSITION_END;
|
|
mWindow->DispatchWindowEvent(&compEvent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pChange->acpStart = sel.acpStart;
|
|
pChange->acpOldEnd = sel.acpEnd;
|
|
// Get new selection
|
|
NS_ENSURE_TRUE(SUCCEEDED(GetSelection(
|
|
TS_DEFAULT_SELECTION, 1, &sel, &selFetched)) && selFetched, E_FAIL);
|
|
pChange->acpNewEnd = sel.acpEnd;
|
|
if (TS_IAS_NOQUERY != dwFlags) {
|
|
*pacpStart = pChange->acpStart;
|
|
*pacpEnd = pChange->acpNewEnd;
|
|
}
|
|
}
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: InsertTextAtSelection SUCCEEDED\n"));
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::InsertEmbeddedAtSelection(DWORD dwFlags,
|
|
IDataObject *pDataObject,
|
|
LONG *pacpStart,
|
|
LONG *pacpEnd,
|
|
TS_TEXTCHANGE *pChange)
|
|
{
|
|
// embedded objects are not supported
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT
|
|
nsTextStore::OnStartCompositionInternal(ITfCompositionView* pComposition,
|
|
ITfRange* aRange,
|
|
bool aPreserveSelection)
|
|
{
|
|
mCompositionView = pComposition;
|
|
HRESULT hr = GetRangeExtent(aRange, &mCompositionStart, &mCompositionLength);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: OnStartComposition, range=%ld-%ld\n", mCompositionStart,
|
|
mCompositionStart + mCompositionLength));
|
|
|
|
// Select composition range so the new composition replaces the range
|
|
nsSelectionEvent selEvent(true, NS_SELECTION_SET, mWindow);
|
|
mWindow->InitEvent(selEvent);
|
|
selEvent.mOffset = PRUint32(mCompositionStart);
|
|
selEvent.mLength = PRUint32(mCompositionLength);
|
|
selEvent.mReversed = false;
|
|
mWindow->DispatchWindowEvent(&selEvent);
|
|
NS_ENSURE_TRUE(selEvent.mSucceeded, E_FAIL);
|
|
|
|
// Set up composition
|
|
nsQueryContentEvent queryEvent(true, NS_QUERY_SELECTED_TEXT, mWindow);
|
|
mWindow->InitEvent(queryEvent);
|
|
mWindow->DispatchWindowEvent(&queryEvent);
|
|
NS_ENSURE_TRUE(queryEvent.mSucceeded, E_FAIL);
|
|
mCompositionString = queryEvent.mReply.mString;
|
|
if (!aPreserveSelection) {
|
|
mCompositionSelection.acpStart = mCompositionStart;
|
|
mCompositionSelection.acpEnd = mCompositionStart + mCompositionLength;
|
|
mCompositionSelection.style.ase = TS_AE_END;
|
|
mCompositionSelection.style.fInterimChar = FALSE;
|
|
}
|
|
nsCompositionEvent event(true, NS_COMPOSITION_START, mWindow);
|
|
mWindow->InitEvent(event);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
return S_OK;
|
|
}
|
|
|
|
static PRUint32
|
|
GetLayoutChangeIntervalTime()
|
|
{
|
|
static PRInt32 sTime = -1;
|
|
if (sTime > 0)
|
|
return PRUint32(sTime);
|
|
|
|
sTime = NS_MAX(10,
|
|
Preferences::GetInt("intl.tsf.on_layout_change_interval", 100));
|
|
return PRUint32(sTime);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::OnStartComposition(ITfCompositionView* pComposition,
|
|
BOOL* pfOk)
|
|
{
|
|
*pfOk = FALSE;
|
|
|
|
// Only one composition at a time
|
|
if (mCompositionView)
|
|
return S_OK;
|
|
|
|
nsRefPtr<ITfRange> range;
|
|
HRESULT hr = pComposition->GetRange(getter_AddRefs(range));
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
hr = OnStartCompositionInternal(pComposition, range, false);
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
NS_ASSERTION(!mCompositionTimer, "The timer is alive!");
|
|
mCompositionTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
|
|
if (mCompositionTimer) {
|
|
mCompositionTimer->InitWithFuncCallback(CompositionTimerCallbackFunc, this,
|
|
GetLayoutChangeIntervalTime(),
|
|
nsITimer::TYPE_REPEATING_SLACK);
|
|
}
|
|
*pfOk = TRUE;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::OnUpdateComposition(ITfCompositionView* pComposition,
|
|
ITfRange* pRangeNew)
|
|
{
|
|
NS_ENSURE_TRUE(mCompositionView &&
|
|
mCompositionView == pComposition &&
|
|
mDocumentMgr && mContext, E_UNEXPECTED);
|
|
|
|
if (!pRangeNew) // pRangeNew is null when the update is not complete
|
|
return S_OK;
|
|
|
|
HRESULT hr = UpdateCompositionExtent(pRangeNew);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
|
|
|
return SendTextEventForCompositionString();
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsTextStore::OnEndComposition(ITfCompositionView* pComposition)
|
|
{
|
|
NS_ENSURE_TRUE(mCompositionView &&
|
|
mCompositionView == pComposition, E_UNEXPECTED);
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: OnEndComposition\n"));
|
|
|
|
// Clear the saved text event
|
|
SaveTextEvent(nsnull);
|
|
|
|
if (mCompositionTimer) {
|
|
mCompositionTimer->Cancel();
|
|
mCompositionTimer = nsnull;
|
|
}
|
|
|
|
if (mCompositionString != mLastDispatchedCompositionString) {
|
|
nsCompositionEvent compositionUpdate(true, NS_COMPOSITION_UPDATE,
|
|
mWindow);
|
|
mWindow->InitEvent(compositionUpdate);
|
|
compositionUpdate.data = mCompositionString;
|
|
mLastDispatchedCompositionString = mCompositionString;
|
|
mWindow->DispatchWindowEvent(&compositionUpdate);
|
|
if (!mWindow || mWindow->Destroyed()) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: CompositionUpdate caused aborting compositionend\n"));
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
// Use NS_TEXT_TEXT to commit composition string
|
|
nsTextEvent textEvent(true, NS_TEXT_TEXT, mWindow);
|
|
mWindow->InitEvent(textEvent);
|
|
if (!mCompositionString.Length()) {
|
|
// XXX HACK! HACK! NS_TEXT_TEXT handler specifically rejects
|
|
// first-time empty strings as workaround for another IME bug
|
|
// and our request will be rejected if this is the first time
|
|
// we are sending NS_TEXT_TEXT. The workaround is to send it a
|
|
// non-empty dummy string first.
|
|
textEvent.theText = NS_LITERAL_STRING(" ");
|
|
mWindow->DispatchWindowEvent(&textEvent);
|
|
}
|
|
textEvent.theText = mCompositionString;
|
|
textEvent.theText.ReplaceSubstring(NS_LITERAL_STRING("\r\n"),
|
|
NS_LITERAL_STRING("\n"));
|
|
mWindow->DispatchWindowEvent(&textEvent);
|
|
|
|
if (!mWindow || mWindow->Destroyed()) {
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: Text event caused aborting compositionend\n"));
|
|
return S_OK;
|
|
}
|
|
|
|
nsCompositionEvent event(true, NS_COMPOSITION_END, mWindow);
|
|
event.data = mLastDispatchedCompositionString;
|
|
mWindow->InitEvent(event);
|
|
mWindow->DispatchWindowEvent(&event);
|
|
|
|
mCompositionView = NULL;
|
|
mCompositionString.Truncate(0);
|
|
mLastDispatchedCompositionString.Truncate();
|
|
|
|
// Maintain selection
|
|
SetSelectionInternal(&mCompositionSelection);
|
|
return S_OK;
|
|
}
|
|
|
|
nsresult
|
|
nsTextStore::OnFocusChange(bool aFocus,
|
|
nsWindow* aWindow,
|
|
IMEState::Enabled aIMEEnabled)
|
|
{
|
|
// no change notifications if TSF is disabled
|
|
if (!sTsfThreadMgr || !sTsfTextStore)
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
if (aFocus) {
|
|
bool bRet = sTsfTextStore->Create(aWindow, aIMEEnabled);
|
|
NS_ENSURE_TRUE(bRet, NS_ERROR_FAILURE);
|
|
NS_ENSURE_TRUE(sTsfTextStore->mDocumentMgr, NS_ERROR_FAILURE);
|
|
HRESULT hr = sTsfThreadMgr->SetFocus(sTsfTextStore->mDocumentMgr);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
|
|
} else {
|
|
sTsfTextStore->Destroy();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
nsTextStore::OnTextChangeInternal(PRUint32 aStart,
|
|
PRUint32 aOldEnd,
|
|
PRUint32 aNewEnd)
|
|
{
|
|
if (!mLock && mSink && 0 != (mSinkMask & TS_AS_TEXT_CHANGE)) {
|
|
mTextChange.acpStart = NS_MIN(mTextChange.acpStart, LONG(aStart));
|
|
mTextChange.acpOldEnd = NS_MAX(mTextChange.acpOldEnd, LONG(aOldEnd));
|
|
mTextChange.acpNewEnd = NS_MAX(mTextChange.acpNewEnd, LONG(aNewEnd));
|
|
::PostMessageW(mWindow->GetWindowHandle(),
|
|
WM_USER_TSF_TEXTCHANGE, 0, 0);
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsTextStore::OnTextChangeMsgInternal(void)
|
|
{
|
|
if (!mLock && mSink && 0 != (mSinkMask & TS_AS_TEXT_CHANGE) &&
|
|
PR_INT32_MAX > mTextChange.acpStart) {
|
|
mSink->OnTextChange(0, &mTextChange);
|
|
mTextChange.acpStart = PR_INT32_MAX;
|
|
mTextChange.acpOldEnd = mTextChange.acpNewEnd = 0;
|
|
}
|
|
}
|
|
|
|
nsresult
|
|
nsTextStore::OnSelectionChangeInternal(void)
|
|
{
|
|
if (!mLock && mSink && 0 != (mSinkMask & TS_AS_SEL_CHANGE)) {
|
|
mSink->OnSelectionChange();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
nsTextStore::OnCompositionTimer()
|
|
{
|
|
NS_ENSURE_TRUE(mContext, NS_ERROR_FAILURE);
|
|
NS_ENSURE_TRUE(mSink, NS_ERROR_FAILURE);
|
|
|
|
// XXXmnakano We always call OnLayoutChange for now, but this might use CPU
|
|
// power when the focused editor has very long text. Ideally, we should call
|
|
// this only when the composition string screen position is changed by window
|
|
// moving, resizing. And also reflowing and scrolling the contents.
|
|
HRESULT hr = mSink->OnLayoutChange(TS_LC_CHANGE, TEXTSTORE_DEFAULT_VIEW);
|
|
NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsTextStore::CommitCompositionInternal(bool aDiscard)
|
|
{
|
|
if (mCompositionView && aDiscard) {
|
|
mCompositionString.Truncate(0);
|
|
if (mSink && !mLock) {
|
|
TS_TEXTCHANGE textChange;
|
|
textChange.acpStart = mCompositionStart;
|
|
textChange.acpOldEnd = mCompositionStart + mCompositionLength;
|
|
textChange.acpNewEnd = mCompositionStart;
|
|
mSink->OnTextChange(0, &textChange);
|
|
}
|
|
}
|
|
// Terminate two contexts, the base context (mContext) and the top
|
|
// if the top context is not the same as the base context
|
|
nsRefPtr<ITfContext> context = mContext;
|
|
do {
|
|
if (context) {
|
|
nsRefPtr<ITfContextOwnerCompositionServices> services;
|
|
context->QueryInterface(IID_ITfContextOwnerCompositionServices,
|
|
getter_AddRefs(services));
|
|
if (services)
|
|
services->TerminateComposition(NULL);
|
|
}
|
|
if (context != mContext)
|
|
break;
|
|
if (mDocumentMgr)
|
|
mDocumentMgr->GetTop(getter_AddRefs(context));
|
|
} while (context != mContext);
|
|
}
|
|
|
|
static
|
|
bool
|
|
GetCompartment(IUnknown* pUnk,
|
|
const GUID& aID,
|
|
ITfCompartment** aCompartment)
|
|
{
|
|
if (!pUnk) return false;
|
|
|
|
nsRefPtr<ITfCompartmentMgr> compMgr;
|
|
pUnk->QueryInterface(IID_ITfCompartmentMgr, getter_AddRefs(compMgr));
|
|
if (!compMgr) return false;
|
|
|
|
return SUCCEEDED(compMgr->GetCompartment(aID, aCompartment)) &&
|
|
(*aCompartment) != NULL;
|
|
}
|
|
|
|
void
|
|
nsTextStore::SetIMEOpenState(bool aState)
|
|
{
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SetIMEOpenState, state=%lu\n", aState));
|
|
|
|
nsRefPtr<ITfCompartment> comp;
|
|
if (!GetCompartment(sTsfThreadMgr,
|
|
GUID_COMPARTMENT_KEYBOARD_OPENCLOSE,
|
|
getter_AddRefs(comp)))
|
|
return;
|
|
|
|
VARIANT variant;
|
|
variant.vt = VT_I4;
|
|
variant.lVal = aState;
|
|
comp->SetValue(sTsfClientId, &variant);
|
|
}
|
|
|
|
bool
|
|
nsTextStore::GetIMEOpenState(void)
|
|
{
|
|
nsRefPtr<ITfCompartment> comp;
|
|
if (!GetCompartment(sTsfThreadMgr,
|
|
GUID_COMPARTMENT_KEYBOARD_OPENCLOSE,
|
|
getter_AddRefs(comp)))
|
|
return false;
|
|
|
|
VARIANT variant;
|
|
::VariantInit(&variant);
|
|
if (SUCCEEDED(comp->GetValue(&variant)) && variant.vt == VT_I4)
|
|
return variant.lVal != 0;
|
|
|
|
::VariantClear(&variant); // clear up in case variant.vt != VT_I4
|
|
return false;
|
|
}
|
|
|
|
void
|
|
nsTextStore::SetInputContextInternal(IMEState::Enabled aState)
|
|
{
|
|
PR_LOG(sTextStoreLog, PR_LOG_ALWAYS,
|
|
("TSF: SetInputContext, state=%ld\n", static_cast<PRInt32>(aState)));
|
|
|
|
VARIANT variant;
|
|
variant.vt = VT_I4;
|
|
variant.lVal = (aState != IMEState::ENABLED);
|
|
|
|
// Set two contexts, the base context (mContext) and the top
|
|
// if the top context is not the same as the base context
|
|
nsRefPtr<ITfContext> context = mContext;
|
|
nsRefPtr<ITfCompartment> comp;
|
|
do {
|
|
if (GetCompartment(context, GUID_COMPARTMENT_KEYBOARD_DISABLED,
|
|
getter_AddRefs(comp)))
|
|
comp->SetValue(sTsfClientId, &variant);
|
|
|
|
if (context != mContext)
|
|
break;
|
|
if (mDocumentMgr)
|
|
mDocumentMgr->GetTop(getter_AddRefs(context));
|
|
} while (context != mContext);
|
|
}
|
|
|
|
void
|
|
nsTextStore::Initialize(void)
|
|
{
|
|
#ifdef PR_LOGGING
|
|
if (!sTextStoreLog)
|
|
sTextStoreLog = PR_NewLogModule("nsTextStoreWidgets");
|
|
#endif
|
|
if (!sTsfThreadMgr) {
|
|
bool enableTsf =
|
|
Preferences::GetBool("intl.enable_tsf_support", false);
|
|
if (enableTsf) {
|
|
if (SUCCEEDED(CoCreateInstance(CLSID_TF_ThreadMgr, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_ITfThreadMgr,
|
|
reinterpret_cast<void**>(&sTsfThreadMgr)))) {
|
|
if (FAILED(sTsfThreadMgr->Activate(&sTsfClientId))) {
|
|
NS_RELEASE(sTsfThreadMgr);
|
|
NS_WARNING("failed to activate TSF\n");
|
|
}
|
|
} else
|
|
// TSF not installed?
|
|
NS_WARNING("failed to create TSF manager\n");
|
|
}
|
|
}
|
|
if (sTsfThreadMgr && !sTsfTextStore) {
|
|
sTsfTextStore = new nsTextStore();
|
|
if (!sTsfTextStore)
|
|
NS_ERROR("failed to create text store");
|
|
}
|
|
if (sTsfThreadMgr && !sDisplayAttrMgr) {
|
|
HRESULT hr =
|
|
::CoCreateInstance(CLSID_TF_DisplayAttributeMgr, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_ITfDisplayAttributeMgr,
|
|
reinterpret_cast<void**>(&sDisplayAttrMgr));
|
|
if (FAILED(hr) || !sDisplayAttrMgr)
|
|
NS_ERROR("failed to create display attribute manager");
|
|
}
|
|
if (sTsfThreadMgr && !sCategoryMgr) {
|
|
HRESULT hr =
|
|
::CoCreateInstance(CLSID_TF_CategoryMgr, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_ITfCategoryMgr,
|
|
reinterpret_cast<void**>(&sCategoryMgr));
|
|
if (FAILED(hr) || !sCategoryMgr)
|
|
NS_ERROR("failed to create category manager");
|
|
}
|
|
if (sTsfThreadMgr && !sFlushTIPInputMessage) {
|
|
sFlushTIPInputMessage = ::RegisterWindowMessageW(
|
|
NS_LITERAL_STRING("Flush TIP Input Message").get());
|
|
}
|
|
}
|
|
|
|
void
|
|
nsTextStore::Terminate(void)
|
|
{
|
|
NS_IF_RELEASE(sDisplayAttrMgr);
|
|
NS_IF_RELEASE(sCategoryMgr);
|
|
NS_IF_RELEASE(sTsfTextStore);
|
|
if (sTsfThreadMgr) {
|
|
sTsfThreadMgr->Deactivate();
|
|
NS_RELEASE(sTsfThreadMgr);
|
|
}
|
|
}
|