--- a/dom/plugins/test/testplugin/nptest_qt.cpp
+++ b/dom/plugins/test/testplugin/nptest_qt.cpp
@@ -25,30 +25,20 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contributor(s):
* Josh Aas <josh@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
-#include <QWidget>
-#include <QPainter>
-
#include "nptest_platform.h"
#include "npapi.h"
-struct _PlatformData {
-#ifdef MOZ_X11
- Display* display;
- Visual* visual;
- Colormap colormap;
-#endif
-};
- using namespace std;
+using namespace std;
bool
pluginSupportsWindowMode()
{
return false;
}
bool
@@ -61,34 +51,18 @@ bool
pluginSupportsAsyncBitmapDrawing()
{
return false;
}
NPError
pluginInstanceInit(InstanceData* instanceData)
{
-#ifdef MOZ_X11
- instanceData->platformData = static_cast<PlatformData*>
- (NPN_MemAlloc(sizeof(PlatformData)));
- if (!instanceData->platformData){
- //printf("NPERR_OUT_OF_MEMORY_ERROR\n");
- return NPERR_OUT_OF_MEMORY_ERROR;
- }
-
- instanceData->platformData->display = nullptr;
- instanceData->platformData->visual = nullptr;
- instanceData->platformData->colormap = None;
-
- return NPERR_NO_ERROR;
-#else
printf("NPERR_INCOMPATIBLE_VERSION_ERROR\n");
return NPERR_INCOMPATIBLE_VERSION_ERROR;
-#endif
- return NPERR_NO_ERROR;
}
void
pluginInstanceShutdown(InstanceData* instanceData)
{
NPN_MemFree(instanceData->platformData);
instanceData->platformData = 0;
}
@@ -100,112 +74,19 @@ pluginDoSetWindow(InstanceData* instance
}
void
pluginWidgetInit(InstanceData* instanceData, void* oldWindow)
{
// XXX nothing here yet since we don't support windowed plugins
}
-static void
-pluginDrawWindow(InstanceData* instanceData, void* event)
-{
- NPWindow& window = instanceData->window;
- // When we have a widget, window.x/y are meaningless since our
- // widget is always positioned correctly and we just draw into it at 0,0
- int x = instanceData->hasWidget ? 0 : window.x;
- int y = instanceData->hasWidget ? 0 : window.y;
- int width = window.width;
- int height = window.height;
-
-#ifdef MOZ_X11
- XEvent* nsEvent = (XEvent*)event;
- const XGraphicsExposeEvent& expose = nsEvent->xgraphicsexpose;
-
- QColor drawColor((QColor)instanceData->scriptableObject->drawColor);//QRgb qRgba ( int r, int g, int b, int a )
-#ifdef Q_WS_X11
- QPixmap pixmap = QPixmap::fromX11Pixmap(expose.drawable, QPixmap::ExplicitlyShared);
-
- QRect exposeRect(expose.x, expose.y, expose.width, expose.height);
- if (instanceData->scriptableObject->drawMode == DM_SOLID_COLOR) {
- //printf("Drawing Solid\n");
- // drawing a solid color for reftests
- QPainter painter(&pixmap);
- painter.fillRect(exposeRect, drawColor);
- notifyDidPaint(instanceData);
- return;
-
- }
-#endif
-#endif
-
- NPP npp = instanceData->npp;
- if (!npp)
- return;
-
- QString text (NPN_UserAgent(npp));
- if (text.isEmpty())
- return;
-
-#ifdef MOZ_X11
-#ifdef Q_WS_X11
- //printf("Drawing Default\n");
- // drawing a solid color for reftests
- QColor color;
- QPainter painter(&pixmap);
- QRect theRect(x, y, width, height);
- QRect clipRect(QPoint(window.clipRect.left, window.clipRect.top),
- QPoint(window.clipRect.right, window.clipRect.bottom));
- painter.setClipRect(clipRect);
- painter.fillRect(theRect, QColor(128,128,128,255));
- painter.drawRect(theRect);
- painter.drawText(QRect(theRect), Qt::AlignCenter, text);
- notifyDidPaint(instanceData);
-#endif
-#endif
- return;
-}
-
int16_t
pluginHandleEvent(InstanceData* instanceData, void* event)
{
-#ifdef MOZ_X11
- XEvent* nsEvent = (XEvent*)event;
- //printf("\nEvent Type %d\n", nsEvent->type);
- switch (nsEvent->type) {
- case GraphicsExpose: {
- //printf("GraphicsExpose\n");
-
- pluginDrawWindow(instanceData, event);
- break;
- }
- case MotionNotify: {
- //printf("MotionNotify\n");
- XMotionEvent* motion = &nsEvent->xmotion;
- instanceData->lastMouseX = motion->x;
- instanceData->lastMouseY = motion->y;
- break;
- }
- case ButtonPress:{
- ////printf("ButtonPress\n");
- break;
- }
- case ButtonRelease: {
- //printf("ButtonRelease\n");
- XButtonEvent* button = &nsEvent->xbutton;
- instanceData->lastMouseX = button->x;
- instanceData->lastMouseY = button->y;
- instanceData->mouseUpEventCount++;
- break;
- }
- default:
- break;
- }
-#endif
-
return 0;
}
int32_t pluginGetEdge(InstanceData* instanceData, RectEdge edge)
{
// XXX nothing here yet since we don't support windowed plugins
return NPTEST_INT32_ERROR;
}
--- a/dom/src/geolocation/nsGeolocation.cpp
+++ b/dom/src/geolocation/nsGeolocation.cpp
@@ -23,17 +23,17 @@
#include "mozilla/unused.h"
#include "mozilla/Preferences.h"
#include "mozilla/ClearOnShutdown.h"
#include "PCOMContentPermissionRequestChild.h"
#include "mozilla/dom/PermissionMessageUtils.h"
class nsIPrincipal;
-#ifdef MOZ_ENABLE_QTMOBILITY
+#ifdef MOZ_ENABLE_QT5GEOPOSITION
#include "QTMLocationProvider.h"
#endif
#ifdef MOZ_WIDGET_ANDROID
#include "AndroidLocationProvider.h"
#endif
#ifdef MOZ_WIDGET_GONK
@@ -662,17 +662,17 @@ nsresult nsGeolocationService::Init()
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
if (!obs) {
return NS_ERROR_FAILURE;
}
obs->AddObserver(this, "quit-application", false);
obs->AddObserver(this, "mozsettings-changed", false);
-#ifdef MOZ_ENABLE_QTMOBILITY
+#ifdef MOZ_ENABLE_QT5GEOPOSITION
mProvider = new QTMLocationProvider();
#endif
#ifdef MOZ_WIDGET_ANDROID
mProvider = new AndroidLocationProvider();
#endif
#ifdef MOZ_WIDGET_GONK
--- a/dom/system/moz.build
+++ b/dom/system/moz.build
@@ -1,18 +1,18 @@
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
toolkit = CONFIG['MOZ_WIDGET_TOOLKIT']
-if toolkit in ('qt', 'gtk2', 'gtk3'):
- DIRS += ['unix']
+if toolkit in ('qt'):
+ DIRS += ['qt']
elif toolkit == 'windows':
DIRS += ['windows']
elif toolkit == 'cocoa':
DIRS += ['mac']
elif toolkit == 'android':
DIRS += ['android']
elif toolkit == 'gonk':
DIRS += ['gonk']
rename from dom/system/unix/Makefile.in
rename to dom/system/qt/Makefile.in
rename from dom/system/unix/QTMLocationProvider.cpp
rename to dom/system/qt/QTMLocationProvider.cpp
--- a/dom/system/unix/QTMLocationProvider.cpp
+++ b/dom/system/qt/QTMLocationProvider.cpp
@@ -7,16 +7,19 @@
#include "nsGeoPosition.h"
using namespace mozilla;
NS_IMPL_ISUPPORTS1(QTMLocationProvider, nsIGeolocationProvider)
QTMLocationProvider::QTMLocationProvider()
{
+ if (QMetaType::type("QGeoPositionInfo") == QMetaType::UnknownType) {
+ qRegisterMetaType<QGeoPositionInfo>("QGeoPositionInfo");
+ }
mLocation = QGeoPositionInfoSource::createDefaultSource(this);
if (mLocation)
connect(mLocation, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo)));
}
QTMLocationProvider::~QTMLocationProvider()
{
delete mLocation;
@@ -52,16 +55,19 @@ QTMLocationProvider::positionUpdated(con
}
NS_IMETHODIMP
QTMLocationProvider::Startup()
{
if (!mLocation)
return NS_ERROR_NOT_IMPLEMENTED;
+ // Not all versions of qt5positioning set default prefered method
+ // thus this workaround initializing QGeoPositionSource explicitly
+ SetHighAccuracy(false);
mLocation->startUpdates();
return NS_OK;
}
NS_IMETHODIMP
QTMLocationProvider::Watch(nsIGeolocationUpdate* aCallback)
{
@@ -78,12 +84,18 @@ QTMLocationProvider::Shutdown()
mLocation->stopUpdates();
mCallback = nullptr;
return NS_OK;
}
NS_IMETHODIMP
-QTMLocationProvider::SetHighAccuracy(bool)
+QTMLocationProvider::SetHighAccuracy(bool aHigh)
{
- return NS_OK;
+ if (!mLocation)
+ return NS_ERROR_NOT_IMPLEMENTED;
+
+ mLocation->setPreferredPositioningMethods(aHigh ?
+ QGeoPositionInfoSource::SatellitePositioningMethods :
+ QGeoPositionInfoSource::AllPositioningMethods);
+ return NS_OK;
}
rename from dom/system/unix/QTMLocationProvider.h
rename to dom/system/qt/QTMLocationProvider.h
--- a/dom/system/unix/QTMLocationProvider.h
+++ b/dom/system/qt/QTMLocationProvider.h
@@ -5,19 +5,16 @@
#ifndef QTMLocationProvider_h
#define QTMLocationProvider_h
#include <QGeoPositionInfoSource>
#include "nsGeolocation.h"
#include "nsIGeolocationProvider.h"
#include "nsCOMPtr.h"
-
-using namespace QtMobility;
-
class QTMLocationProvider : public QObject,
public nsIGeolocationProvider
{
Q_OBJECT
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIGEOLOCATIONPROVIDER
rename from dom/system/unix/nsHapticFeedback.cpp
rename to dom/system/qt/QtHapticFeedback.cpp
--- a/dom/system/unix/nsHapticFeedback.cpp
+++ b/dom/system/qt/QtHapticFeedback.cpp
@@ -1,68 +1,20 @@
/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#if (MOZ_PLATFORM_MAEMO == 5)
-#include <dbus/dbus.h>
-#include <mce/dbus-names.h>
-#endif
-#if defined(MOZ_ENABLE_QTMOBILITY)
#include <QFeedbackEffect>
-using namespace QtMobility;
-#endif
+#include "QtHapticFeedback.h"
-#include "nsHapticFeedback.h"
-
-NS_IMPL_ISUPPORTS1(nsHapticFeedback, nsIHapticFeedback)
+NS_IMPL_ISUPPORTS1(QtHapticFeedback, nsIHapticFeedback)
NS_IMETHODIMP
-nsHapticFeedback::PerformSimpleAction(int32_t aType)
+QtHapticFeedback::PerformSimpleAction(int32_t aType)
{
-#if (MOZ_PLATFORM_MAEMO == 5)
- DBusError err;
- dbus_error_init(&err);
-
- DBusConnection *connection;
- connection = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
- if (dbus_error_is_set(&err)) {
- dbus_error_free(&err);
- return NS_ERROR_FAILURE;
- }
- if (nullptr == connection) {
- return NS_ERROR_FAILURE;
- }
-
- dbus_connection_set_exit_on_disconnect(connection,false);
-
- DBusMessage* msg =
- dbus_message_new_method_call(MCE_SERVICE, MCE_REQUEST_PATH,
- MCE_REQUEST_IF, MCE_ACTIVATE_VIBRATOR_PATTERN);
-
- if (!msg) {
- return NS_ERROR_FAILURE;
- }
-
- dbus_message_set_no_reply(msg, true);
-
- DBusMessageIter iter;
- dbus_message_iter_init_append(msg, &iter);
- const char* pattern = "PatternTouchscreen";
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &pattern);
-
- if (dbus_connection_send(connection, msg, nullptr)) {
- dbus_connection_flush(connection);
- dbus_message_unref(msg);
- } else {
- dbus_message_unref(msg);
- return NS_ERROR_FAILURE;
- }
-#elif defined(MOZ_ENABLE_QTMOBILITY)
if (aType == ShortPress)
- QFeedbackEffect::playThemeEffect(QFeedbackEffect::ThemeBasicButton);
+ QFeedbackEffect::playThemeEffect(QFeedbackEffect::PressWeak);
if (aType == LongPress)
- QFeedbackEffect::playThemeEffect(QFeedbackEffect::ThemeLongPress);
-#endif
+ QFeedbackEffect::playThemeEffect(QFeedbackEffect::PressStrong);
return NS_OK;
}
rename from dom/system/unix/nsHapticFeedback.h
rename to dom/system/qt/QtHapticFeedback.h
--- a/dom/system/unix/nsHapticFeedback.h
+++ b/dom/system/qt/QtHapticFeedback.h
@@ -1,13 +1,13 @@
/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsIHapticFeedback.h"
-class nsHapticFeedback : public nsIHapticFeedback
+class QtHapticFeedback : public nsIHapticFeedback
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIHAPTICFEEDBACK
};
rename from dom/system/unix/moz.build
rename to dom/system/qt/moz.build
--- a/dom/system/unix/moz.build
+++ b/dom/system/qt/moz.build
@@ -13,16 +13,16 @@ if CONFIG['MOZ_ENABLE_QT5GEOPOSITION']:
]
LOCAL_INCLUDES += [
'/dom/src/geolocation',
]
if CONFIG['MOZ_ENABLE_QT5FEEDBACK']:
SOURCES += [
- 'nsHapticFeedback.cpp',
+ 'QtHapticFeedback.cpp',
]
FAIL_ON_WARNINGS = True
include('/ipc/chromium/chromium-config.mozbuild')
FINAL_LIBRARY = 'gklayout'
--- a/gfx/cairo/cairo/src/cairo-qt-surface.cpp
+++ b/gfx/cairo/cairo/src/cairo-qt-surface.cpp
@@ -51,17 +51,16 @@
#include <QtGui/QPainter>
#include <QtGui/QPaintEngine>
#include <QtGui/QPaintDevice>
#include <QtGui/QImage>
#include <QtGui/QPixmap>
#include <QtGui/QBrush>
#include <QtGui/QPen>
-#include <QWidget>
#include <QtCore/QVarLengthArray>
#include <sys/time.h>
/* Enable workaround slow regional Qt paths */
#define ENABLE_FAST_FILL 0
#define ENABLE_FAST_CLIP 0
@@ -584,18 +583,16 @@ static cairo_status_t
QPaintDevice *rpd = QPainter::redirected(pd, &offset);
if (rpd)
pd = rpd;
if (pd->devType() == QInternal::Image) {
qimg = new QImage(((QImage*) pd)->copy());
} else if (pd->devType() == QInternal::Pixmap) {
qimg = new QImage(((QPixmap*) pd)->toImage());
- } else if (pd->devType() == QInternal::Widget) {
- qimg = new QImage(QPixmap::grabWindow(((QWidget*)pd)->winId()).toImage());
}
}
if (qimg == NULL)
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
*image_out = (cairo_image_surface_t*)
cairo_image_surface_create_for_data (qimg->bits(),
--- a/gfx/thebes/gfxQtNativeRenderer.cpp
+++ b/gfx/thebes/gfxQtNativeRenderer.cpp
@@ -32,17 +32,17 @@ gfxQtNativeRenderer::Draw(gfxContext* ct
gfxIntSize(size.width, size.height));
if (!isOpaque) {
nsRefPtr<gfxContext> tempCtx = new gfxContext(xsurf);
tempCtx->SetOperator(gfxContext::OPERATOR_CLEAR);
tempCtx->Paint();
}
- nsresult rv = DrawWithXlib(xsurf.get(), nsIntPoint(0, 0), nullptr, 0);
+ nsresult rv = DrawWithXlib(xsurf->CairoSurface(), nsIntPoint(0, 0), nullptr, 0);
if (NS_FAILED(rv))
return rv;
ctx->SetSource(xsurf);
ctx->Paint();
return rv;
--- a/gfx/thebes/gfxQtNativeRenderer.h
+++ b/gfx/thebes/gfxQtNativeRenderer.h
@@ -25,19 +25,19 @@ public:
/**
* Perform the native drawing.
* @param offsetX draw at this offset into the given drawable
* @param offsetY draw at this offset into the given drawable
* @param clipRects an array of rects; clip to the union
* @param numClipRects the number of rects in the array, or zero if
* no clipping is required
*/
- virtual nsresult DrawWithXlib(gfxXlibSurface *xsurf,
- nsIntPoint offset,
- nsIntRect* clipRects, uint32_t numClipRects) = 0;
+ virtual nsresult DrawWithXlib(cairo_surface_t* surface,
+ nsIntPoint offset,
+ nsIntRect* clipRects, uint32_t numClipRects) = 0;
enum {
// If set, then Draw() is opaque, i.e., every pixel in the intersection
// of the clipRect and (offset.x,offset.y,bounds.width,bounds.height)
// will be set and there is no dependence on what the existing pixels
// in the drawable are set to.
DRAW_IS_OPAQUE = 0x01,
// If set, then numClipRects can be zero or one
--- a/gfx/thebes/gfxQtPlatform.cpp
+++ b/gfx/thebes/gfxQtPlatform.cpp
@@ -1,24 +1,21 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <QPixmap>
-#include <qglobal.h>
-#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
-# include <QX11Info>
-#else
-# include <qpa/qplatformnativeinterface.h>
-# include <qpa/qplatformintegration.h>
+#include <QWindow>
+#ifdef MOZ_X11
+#include <qpa/qplatformnativeinterface.h>
+#include <qpa/qplatformintegration.h>
#endif
-#include <QApplication>
-#include <QDesktopWidget>
-#include <QPaintEngine>
+#include <QGuiApplication>
+#include <QScreen>
#include "gfxQtPlatform.h"
#include "gfxFontconfigUtils.h"
#include "mozilla/gfx/2D.h"
#include "cairo.h"
@@ -28,187 +25,107 @@
#include "nsUnicodeProperties.h"
#include "gfxPangoFonts.h"
#include "gfxContext.h"
#include "gfxUserFontSet.h"
#include "nsUnicharUtils.h"
-#include <fontconfig/fontconfig.h>
-
#include "nsMathUtils.h"
#include "nsTArray.h"
#ifdef MOZ_X11
#include "gfxXlibSurface.h"
+#include "prenv.h"
#endif
#include "qcms.h"
#include "mozilla/Preferences.h"
using namespace mozilla;
using namespace mozilla::unicode;
using namespace mozilla::gfx;
-#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
-#define DEFAULT_RENDER_MODE RENDER_DIRECT
-#else
-#define DEFAULT_RENDER_MODE RENDER_BUFFERED
+gfxFontconfigUtils *gfxQtPlatform::sFontconfigUtils = nullptr;
+#ifdef MOZ_X11
+bool gfxQtPlatform::sUseXRender = true;
#endif
-static QPaintEngine::Type sDefaultQtPaintEngineType = QPaintEngine::Raster;
-gfxFontconfigUtils *gfxQtPlatform::sFontconfigUtils = nullptr;
-static cairo_user_data_key_t cairo_qt_pixmap_key;
-static void do_qt_pixmap_unref (void *data)
-{
- QPixmap *pmap = (QPixmap*)data;
- delete pmap;
-}
-
static gfxImageFormat sOffscreenFormat = gfxImageFormat::RGB24;
gfxQtPlatform::gfxQtPlatform()
{
- mPrefFonts.Init(50);
-
+#ifdef MOZ_X11
+ sUseXRender = mozilla::Preferences::GetBool("gfx.xrender.enabled");
+#endif
if (!sFontconfigUtils)
sFontconfigUtils = gfxFontconfigUtils::GetFontconfigUtils();
- g_type_init();
-
- nsresult rv;
- // 0 - default gfxQPainterSurface
- // 1 - gfxImageSurface
- int32_t ival = Preferences::GetInt("mozilla.widget-qt.render-mode", DEFAULT_RENDER_MODE);
-
- const char *envTypeOverride = getenv("MOZ_QT_RENDER_TYPE");
- if (envTypeOverride)
- ival = atoi(envTypeOverride);
-
- switch (ival) {
- case 0:
- mRenderMode = RENDER_QPAINTER;
- break;
- case 1:
- mRenderMode = RENDER_BUFFERED;
- break;
- case 2:
- mRenderMode = RENDER_DIRECT;
- break;
- default:
- mRenderMode = RENDER_QPAINTER;
- }
-
- // Qt doesn't provide a public API to detect the graphicssystem type. We hack
- // around this by checking what type of graphicssystem a test QPixmap uses.
- QPixmap pixmap(1, 1);
- if (pixmap.depth() == 16) {
+ mScreenDepth = qApp->primaryScreen()->depth();
+ if (mScreenDepth == 16) {
sOffscreenFormat = gfxImageFormat::RGB16_565;
}
- mScreenDepth = pixmap.depth();
-#if (QT_VERSION < QT_VERSION_CHECK(4,8,0))
- if (pixmap.paintEngine())
- sDefaultQtPaintEngineType = pixmap.paintEngine()->type();
-#endif
uint32_t canvasMask = BackendTypeBit(BackendType::CAIRO) | BackendTypeBit(BackendType::SKIA);
uint32_t contentMask = BackendTypeBit(BackendType::CAIRO) | BackendTypeBit(BackendType::SKIA);
InitBackendPrefs(canvasMask, BackendType::CAIRO,
contentMask, BackendType::CAIRO);
}
gfxQtPlatform::~gfxQtPlatform()
{
gfxFontconfigUtils::Shutdown();
sFontconfigUtils = nullptr;
gfxPangoFontGroup::Shutdown();
-
-#if 0
- // It would be nice to do this (although it might need to be after
- // the cairo shutdown that happens in ~gfxPlatform). It even looks
- // idempotent. But it has fatal assertions that fire if stuff is
- // leaked, and we hit them.
- FcFini();
-#endif
}
#ifdef MOZ_X11
Display*
-gfxQtPlatform::GetXDisplay(QWidget* aWindow)
+gfxQtPlatform::GetXDisplay(QWindow* aWindow)
{
-#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
-#ifdef Q_WS_X11
- return aWindow ? aWindow->x11Info().display() : QX11Info::display();
-#else
- return nullptr;
-#endif
-#else
- return (Display*)(qApp->platformNativeInterface()->
- nativeResourceForWindow("display", aWindow ? aWindow->windowHandle() : nullptr));
-#endif
+ return (Display*)(qApp->platformNativeInterface()->
+ nativeResourceForScreen("display", aWindow ? aWindow->screen() : qApp->primaryScreen()));
}
Screen*
-gfxQtPlatform::GetXScreen(QWidget* aWindow)
+gfxQtPlatform::GetXScreen(QWindow* aWindow)
{
-#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
-#ifdef Q_WS_X11
- return ScreenOfDisplay(GetXDisplay(aWindow), aWindow ? aWindow->x11Info().screen() : QX11Info().screen());
-#else
- return nullptr;
-#endif
-#else
- return ScreenOfDisplay(GetXDisplay(aWindow),
- (int)(intptr_t)qApp->platformNativeInterface()->
- nativeResourceForWindow("screen",
- aWindow ? aWindow->windowHandle() : nullptr));
-#endif
+ return ScreenOfDisplay(GetXDisplay(aWindow),
+ (int)(intptr_t)qApp->platformNativeInterface()->
+ nativeResourceForScreen("screen", aWindow ? aWindow->screen() : qApp->primaryScreen()));
}
#endif
already_AddRefed<gfxASurface>
gfxQtPlatform::CreateOffscreenSurface(const IntSize& size,
gfxContentType contentType)
{
- nsRefPtr<gfxASurface> newSurface = nullptr;
-
gfxImageFormat imageFormat = OptimalFormatForContent(contentType);
-#ifdef CAIRO_HAS_QT_SURFACE
- if (mRenderMode == RENDER_QPAINTER) {
- newSurface = new gfxQPainterSurface(ThebesIntSize(size), imageFormat);
- return newSurface.forget();
- }
-#endif
-
- if ((mRenderMode == RENDER_BUFFERED || mRenderMode == RENDER_DIRECT) &&
- sDefaultQtPaintEngineType != QPaintEngine::X11) {
- newSurface = new gfxImageSurface(ThebesIntSize(size), imageFormat);
- return newSurface.forget();
- }
-
-#ifdef MOZ_X11
- XRenderPictFormat* xrenderFormat =
- gfxXlibSurface::FindRenderFormat(GetXDisplay(), imageFormat);
-
- Screen* screen = GetXScreen();
- newSurface = gfxXlibSurface::Create(screen, xrenderFormat,
- ThebesIntSize(size));
-#endif
-
- if (newSurface) {
- gfxContext ctx(newSurface);
- ctx.SetOperator(gfxContext::OPERATOR_CLEAR);
- ctx.Paint();
- }
+ nsRefPtr<gfxASurface> newSurface =
+ new gfxImageSurface(gfxIntSize(size.width, size.height), imageFormat);
return newSurface.forget();
}
+already_AddRefed<gfxASurface>
+gfxQtPlatform::OptimizeImage(gfxImageSurface *aSurface,
+ gfxImageFormat format)
+{
+ /* Qt have no special offscreen surfaces so we can avoid a copy */
+ if (OptimalFormatForContent(gfxASurface::ContentFromFormat(format)) ==
+ format) {
+ return nullptr;
+ }
+
+ return gfxPlatform::OptimizeImage(aSurface, format);
+}
+
+
nsresult
gfxQtPlatform::GetFontList(nsIAtom *aLangGroup,
const nsACString& aGenericFamily,
nsTArray<nsString>& aListOfFonts)
{
return sFontconfigUtils->GetFontList(aLangGroup, aGenericFamily,
aListOfFonts);
}
@@ -255,16 +172,27 @@ gfxQtPlatform::MakePlatformFont(const gf
const uint8_t *aFontData, uint32_t aLength)
{
// passing ownership of the font data to the new font entry
return gfxPangoFontGroup::NewFontEntry(*aProxyEntry,
aFontData, aLength);
}
bool
+gfxQtPlatform::SupportsOffMainThreadCompositing()
+{
+#if defined(MOZ_X11) && !defined(NIGHTLY_BUILD)
+ return (PR_GetEnv("MOZ_USE_OMTC") != nullptr) ||
+ (PR_GetEnv("MOZ_OMTC_ENABLED") != nullptr);
+#else
+ return true;
+#endif
+}
+
+bool
gfxQtPlatform::IsFontFormatSupported(nsIURI *aFontURI, uint32_t aFormatFlags)
{
// check for strange format flags
NS_ASSERTION(!(aFormatFlags & gfxUserFontSet::FLAG_FORMAT_NOT_USED),
"strange font format hint set");
// accept supported formats
// Pango doesn't apply features from AAT TrueType extensions.
@@ -280,28 +208,27 @@ gfxQtPlatform::IsFontFormatSupported(nsI
if (aFormatFlags != 0) {
return false;
}
// no format hint set, need to look at data
return true;
}
-qcms_profile*
-gfxQtPlatform::GetPlatformCMSOutputProfile()
+void
+gfxQtPlatform::GetPlatformCMSOutputProfile(void *&mem, size_t &size)
{
- return nullptr;
+ mem = nullptr;
+ size = 0;
}
int32_t
gfxQtPlatform::GetDPI()
{
- QDesktopWidget* rootWindow = qApp->desktop();
- int32_t dpi = rootWindow->logicalDpiY(); // y-axis DPI for fonts
- return dpi <= 0 ? 96 : dpi;
+ return qApp->primaryScreen()->logicalDotsPerInch();
}
gfxImageFormat
gfxQtPlatform::GetOffscreenFormat()
{
return sOffscreenFormat;
}
--- a/gfx/thebes/gfxQtPlatform.h
+++ b/gfx/thebes/gfxQtPlatform.h
@@ -10,106 +10,111 @@
#include "nsAutoRef.h"
#include "nsDataHashtable.h"
#include "nsTArray.h"
#ifdef MOZ_X11
#include "X11/Xlib.h"
#endif
class gfxFontconfigUtils;
-class QWidget;
+class QWindow;
class gfxQtPlatform : public gfxPlatform {
public:
-
- enum RenderMode {
- /* Use QPainter surfaces */
- RENDER_QPAINTER = 0,
- /* Use offscreen buffer for rendering with image or xlib gfx backend */
- RENDER_BUFFERED,
- /* Direct rendering to Widget surface */
- RENDER_DIRECT,
- /* max */
- RENDER_MODE_MAX
- };
-
gfxQtPlatform();
virtual ~gfxQtPlatform();
static gfxQtPlatform *GetPlatform() {
- return (gfxQtPlatform*) gfxPlatform::GetPlatform();
+ return static_cast<gfxQtPlatform*>(gfxPlatform::GetPlatform());
}
virtual already_AddRefed<gfxASurface>
+ OptimizeImage(gfxImageSurface *aSurface,
+ gfxImageFormat format) MOZ_OVERRIDE;
+ virtual already_AddRefed<gfxASurface>
CreateOffscreenSurface(const IntSize& size,
gfxContentType contentType) MOZ_OVERRIDE;
- mozilla::TemporaryRef<mozilla::gfx::ScaledFont>
- GetScaledFontForFont(mozilla::gfx::DrawTarget* aTarget, gfxFont *aFont);
+ virtual mozilla::TemporaryRef<mozilla::gfx::ScaledFont>
+ GetScaledFontForFont(mozilla::gfx::DrawTarget* aTarget, gfxFont *aFont) MOZ_OVERRIDE;
- nsresult GetFontList(nsIAtom *aLangGroup,
- const nsACString& aGenericFamily,
- nsTArray<nsString>& aListOfFonts);
+ virtual nsresult GetFontList(nsIAtom *aLangGroup,
+ const nsACString& aGenericFamily,
+ nsTArray<nsString>& aListOfFonts) MOZ_OVERRIDE;
- nsresult UpdateFontList();
+ virtual nsresult UpdateFontList() MOZ_OVERRIDE;
- nsresult ResolveFontName(const nsAString& aFontName,
- FontResolverCallback aCallback,
- void *aClosure, bool& aAborted);
+ virtual nsresult ResolveFontName(const nsAString& aFontName,
+ FontResolverCallback aCallback,
+ void *aClosure, bool& aAborted) MOZ_OVERRIDE;
- nsresult GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName);
+ virtual nsresult GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName) MOZ_OVERRIDE;
- gfxFontGroup *CreateFontGroup(const nsAString &aFamilies,
- const gfxFontStyle *aStyle,
- gfxUserFontSet* aUserFontSet);
+ virtual gfxFontGroup *CreateFontGroup(const nsAString &aFamilies,
+ const gfxFontStyle *aStyle,
+ gfxUserFontSet* aUserFontSet) MOZ_OVERRIDE;
/**
* Look up a local platform font using the full font face name (needed to
* support @font-face src local() )
*/
virtual gfxFontEntry* LookupLocalFont(const gfxProxyFontEntry *aProxyEntry,
- const nsAString& aFontName);
+ const nsAString& aFontName) MOZ_OVERRIDE;
/**
* Activate a platform font (needed to support @font-face src url() )
*
*/
virtual gfxFontEntry* MakePlatformFont(const gfxProxyFontEntry *aProxyEntry,
const uint8_t *aFontData,
- uint32_t aLength);
+ uint32_t aLength) MOZ_OVERRIDE;
/**
* Check whether format is supported on a platform or not (if unclear,
* returns true).
*/
virtual bool IsFontFormatSupported(nsIURI *aFontURI,
- uint32_t aFormatFlags);
+ uint32_t aFormatFlags) MOZ_OVERRIDE;
- void ClearPrefFonts() { mPrefFonts.Clear(); }
-
- RenderMode GetRenderMode() { return mRenderMode; }
- void SetRenderMode(RenderMode rmode) { mRenderMode = rmode; }
+ virtual void ClearPrefFonts() { mPrefFonts.Clear(); }
static int32_t GetDPI();
- virtual gfxImageFormat GetOffscreenFormat();
+ virtual gfxImageFormat GetOffscreenFormat() MOZ_OVERRIDE;
#ifdef MOZ_X11
- static Display* GetXDisplay(QWidget* aWindow = 0);
- static Screen* GetXScreen(QWidget* aWindow = 0);
+ static Display* GetXDisplay(QWindow* aWindow = 0);
+ static Screen* GetXScreen(QWindow* aWindow = 0);
#endif
- virtual int GetScreenDepth() const;
+ virtual int GetScreenDepth() const MOZ_OVERRIDE;
+
+ virtual bool SupportsOffMainThreadCompositing() MOZ_OVERRIDE;
protected:
static gfxFontconfigUtils *sFontconfigUtils;
private:
- virtual qcms_profile *GetPlatformCMSOutputProfile();
+
+ bool UseXRender() {
+#if defined(MOZ_X11)
+ if (GetContentBackend() != mozilla::gfx::BackendType::NONE &&
+ GetContentBackend() != mozilla::gfx::BackendType::CAIRO)
+ return false;
+
+ return sUseXRender;
+#else
+ return false;
+#endif
+ }
+
+ virtual void GetPlatformCMSOutputProfile(void *&mem, size_t &size) MOZ_OVERRIDE;
// TODO: unify this with mPrefFonts (NB: holds families, not fonts) in gfxPlatformFontList
nsDataHashtable<nsCStringHashKey, nsTArray<nsRefPtr<gfxFontEntry> > > mPrefFonts;
- RenderMode mRenderMode;
int mScreenDepth;
+#ifdef MOZ_X11
+ static bool sUseXRender;
+#endif
};
#endif /* GFX_PLATFORM_QT_H */
--- a/image/decoders/icon/qt/nsIconChannel.cpp
+++ b/image/decoders/icon/qt/nsIconChannel.cpp
@@ -1,16 +1,14 @@
/* vim:set ts=2 sw=2 sts=2 cin et: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <QIcon>
-#include <QStyle>
-#include <QApplication>
#include <stdlib.h>
#include <unistd.h>
#include "nsMimeTypes.h"
#include "nsIMIMEService.h"
#include "nsIStringBundle.h"
@@ -103,28 +101,18 @@ nsIconChannel::Init(nsIURI* aURI)
uint32_t desiredImageSize;
iconURI->GetImageSize(&desiredImageSize);
nsAutoCString iconStateString;
iconURI->GetIconState(iconStateString);
bool disabled = iconStateString.EqualsLiteral("disabled");
- QStyle::StandardPixmap sp_icon = (QStyle::StandardPixmap)0;
- nsCOMPtr <nsIGtkQtIconsConverter> converter = do_GetService("@mozilla.org/gtkqticonsconverter;1");
- if (converter) {
- int32_t res = 0;
- stockIcon.Cut(0,4);
- converter->Convert(stockIcon.get(), &res);
- sp_icon = (QStyle::StandardPixmap)res;
- // printf("ConvertIcon: icon:'%s' -> res:%i\n", stockIcon.get(), res);
- }
- if (!sp_icon)
- return NS_ERROR_FAILURE;
+ // This is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=662299
+ // Try to find corresponding freedesktop icon and fallback to empty QIcon if failed.
+ QIcon icon = QIcon::fromTheme(QString(stockIcon.get()).replace("gtk-", "edit-"));
+ QPixmap pixmap = icon.pixmap(desiredImageSize, desiredImageSize, disabled ? QIcon::Disabled : QIcon::Normal);
- QStyle *style = qApp->style();
- NS_ENSURE_TRUE(style, NS_ERROR_NULL_POINTER);
- QPixmap pixmap = style->standardIcon(sp_icon).pixmap(desiredImageSize, desiredImageSize, disabled?QIcon::Disabled:QIcon::Normal);
QImage image = pixmap.toImage();
return moz_qicon_to_channel(&image, iconURI,
getter_AddRefs(mRealChannel));
}
--- a/ipc/chromium/src/base/message_pump_qt.cc
+++ b/ipc/chromium/src/base/message_pump_qt.cc
@@ -34,21 +34,17 @@ MessagePumpForUI::MessagePumpForUI()
MessagePumpForUI::~MessagePumpForUI() {
}
MessagePumpQt::MessagePumpQt(MessagePumpForUI &aPump)
: pump(aPump), mTimer(new QTimer(this))
{
// Register our custom event type, to use in qApp event loop
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
sPokeEvent = QEvent::registerEventType();
-#else
- sPokeEvent = QEvent::User+5000;
-#endif
connect(mTimer, SIGNAL(timeout()), this, SLOT(dispatchDelayed()));
mTimer->setSingleShot(true);
}
MessagePumpQt::~MessagePumpQt()
{
mTimer->stop();
delete mTimer;
--- a/netwerk/base/src/nsAutodialQt.cpp
+++ b/netwerk/base/src/nsAutodialQt.cpp
@@ -23,17 +23,17 @@ nsresult
nsAutodial::Init()
{
return NS_OK;
}
nsresult
nsAutodial::DialDefault(const char16_t* hostName)
{
- if (nsQtNetworkManager::get()->openConnection(QString::fromUtf16(hostName))) {
+ if (nsQtNetworkManager::get()->openConnection(QString::fromUtf16((const ushort*)hostName))) {
return NS_OK;
}
return NS_ERROR_FAILURE;
}
bool
nsAutodial::ShouldDialOnNetworkError()
--- a/toolkit/components/remote/nsQtRemoteService.cpp
+++ b/toolkit/components/remote/nsQtRemoteService.cpp
@@ -1,34 +1,35 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=2:tabstop=8:
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include <QWidget>
+#include <QWindow>
#include "nsQtRemoteService.h"
#include "mozilla/ModuleUtils.h"
#include "mozilla/X11Util.h"
#include "nsIServiceManager.h"
#include "nsIAppShellService.h"
#include "nsCOMPtr.h"
/**
Helper class which is used to receive notification about property changes
*/
-class MozQRemoteEventHandlerWidget: public QWidget {
+class MozQRemoteEventHandlerWidget: public QWindow {
public:
/**
Constructor
@param aRemoteService remote service, which is notified about atom change
*/
MozQRemoteEventHandlerWidget(nsQtRemoteService &aRemoteService);
+ virtual ~MozQRemoteEventHandlerWidget() {}
protected:
/**
Event filter, which receives all XEvents
@return false which continues event handling
*/
bool x11Event(XEvent *);
--- a/toolkit/components/remote/nsQtRemoteService.h
+++ b/toolkit/components/remote/nsQtRemoteService.h
@@ -16,22 +16,21 @@ class RemoteEventHandlerWidget;
class nsQtRemoteService : public nsXRemoteService
{
public:
// We will be a static singleton, so don't use the ordinary methods.
NS_DECL_ISUPPORTS
NS_DECL_NSIREMOTESERVICE
nsQtRemoteService();
+ virtual ~nsQtRemoteService() { };
private:
- ~nsQtRemoteService() { };
-
virtual void SetDesktopStartupIDOrTimestamp(const nsACString& aDesktopStartupID,
uint32_t aTimestamp);
void PropertyNotifyEvent(XEvent *evt);
friend class MozQRemoteEventHandlerWidget;
- QWidget *mServerWindow;
+ QWindow *mServerWindow;
};
#endif // __nsQtRemoteService_h__
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -1,21 +1,17 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if defined(MOZ_WIDGET_QT)
-#include <QApplication>
+#include <QGuiApplication>
#include <QStringList>
#include "nsQAppInstance.h"
-#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
-#include <QInputContextFactory>
-#include <QInputContext>
-#endif
#endif // MOZ_WIDGET_QT
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/Attributes.h"
#include "mozilla/Likely.h"
--- a/toolkit/xre/nsQAppInstance.cpp
+++ b/toolkit/xre/nsQAppInstance.cpp
@@ -1,48 +1,31 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsQAppInstance.h"
-#include <QApplication>
-#ifdef MOZ_ENABLE_MEEGOTOUCH
-#include <MComponentData>
-#include <MApplicationService>
-#endif
+#include <QGuiApplication>
#include "prenv.h"
#include "nsXPCOMPrivate.h"
#include <stdlib.h>
-QApplication *nsQAppInstance::sQAppInstance = nullptr;
-#ifdef MOZ_ENABLE_MEEGOTOUCH
-MComponentData* nsQAppInstance::sMComponentData = nullptr;
-#endif
+QGuiApplication *nsQAppInstance::sQAppInstance = nullptr;
int nsQAppInstance::sQAppRefCount = 0;
void nsQAppInstance::AddRef(int& aArgc, char** aArgv, bool aDefaultProcess) {
if (qApp)
return;
if (!sQAppInstance) {
-#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
- const char *graphicsSystem = getenv("MOZ_QT_GRAPHICSSYSTEM");
- if (graphicsSystem) {
- QApplication::setGraphicsSystem(QString(graphicsSystem));
- }
-#endif
mozilla::SetICUMemoryFunctions();
- sQAppInstance = new QApplication(aArgc, aArgv);
+ sQAppInstance = new QGuiApplication(aArgc, aArgv);
}
sQAppRefCount++;
}
void nsQAppInstance::Release(void) {
if (sQAppInstance && !--sQAppRefCount) {
-#ifdef MOZ_ENABLE_MEEGOTOUCH
- delete sMComponentData;
- sMComponentData = nullptr;
-#endif
delete sQAppInstance;
sQAppInstance = nullptr;
}
}
--- a/toolkit/xre/nsQAppInstance.h
+++ b/toolkit/xre/nsQAppInstance.h
@@ -6,25 +6,23 @@
#ifndef nsQAppInstance_h
#define nsQAppInstance_h
// declared in nsAppRunner.cpp
extern int gArgc;
extern char **gArgv;
-class QApplication;
-class MComponentData;
+class QGuiApplication;
class nsQAppInstance
{
public:
static void AddRef(int& aArgc = gArgc,
char** aArgv = gArgv,
bool aDefaultProcess = false);
static void Release(void);
private:
- static QApplication *sQAppInstance;
- static MComponentData* sMComponentData;
+ static QGuiApplication *sQAppInstance;
static int sQAppRefCount;
};
#endif /* nsQAppInstance_h */
--- a/widget/qt/Makefile.in
+++ b/widget/qt/Makefile.in
@@ -1,9 +1,9 @@
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
include $(topsrcdir)/config/rules.mk
-CXXFLAGS += $(MOZ_QT_CFLAGS) $(GLIB_CFLAGS) $(MOZ_CAIRO_CFLAGS)
-CFLAGS += $(MOZ_QT_CFLAGS) $(GLIB_CFLAGS) $(MOZ_CAIRO_CFLAGS)
+CXXFLAGS += $(MOZ_QT_CFLAGS) $(MOZ_CAIRO_CFLAGS)
+CFLAGS += $(MOZ_QT_CFLAGS) $(MOZ_CAIRO_CFLAGS)
deleted file mode 100644
--- a/widget/qt/faststartupqt/Makefile.in
+++ /dev/null
@@ -1,23 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DIST_INSTALL = 1
-STL_FLAGS=
-
-EXPORT_SOURCES = \
- $(topsrcdir)/widget/qt/moziqwidget.h \
- $(topsrcdir)/toolkit/xre/nsQAppInstance.h \
- $(topsrcdir)/toolkit/xre/nsQAppInstance.cpp \
- $(topsrcdir)/widget/qt/mozqglwidgetwrapper.h \
- $(topsrcdir)/widget/qt/mozqglwidgetwrapper.cpp
-
-GARBAGE += $(EXPORT_SOURCES)
-export:: $(EXPORT_SOURCES)
- $(INSTALL) $^ .
-
-include $(topsrcdir)/config/rules.mk
-
-CXXFLAGS += \
- $(MOZ_QT_CFLAGS) \
- $(NULL)
deleted file mode 100644
--- a/widget/qt/faststartupqt/moz.build
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-GENERATED_SOURCES += [
- 'moc_moziqwidget.cpp',
- 'moc_nsFastStartupQt.cpp',
- 'mozqwidgetfast.cpp',
-]
-
-SOURCES += [
- TOPSRCDIR + '/toolkit/xre/nsQAppInstance.cpp',
- TOPSRCDIR + '/widget/qt/mozqglwidgetwrapper.cpp',
-]
-
-SOURCES += [
- 'nsFastStartupQt.cpp',
-]
-
-FINAL_LIBRARY = 'xul'
-
-LOCAL_INCLUDES += [
- '/widget/qt',
- '/xpcom/build',
-]
-
-
-DEFINES['LIBRARY_FILENAME'] = '%s%s%s' % (
- CONFIG['DLL_PREFIX'],
- LIBRARY_NAME,
- CONFIG['DLL_SUFFIX']
-)
-
-DEFINES['MOZ_NO_MOZALLOC'] = True
-DEFINES['XPCOM_GLUE'] = True
deleted file mode 100644
--- a/widget/qt/faststartupqt/mozqwidgetfast.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <QtCore/QUrl>
-#include "mozqwidgetfast.h"
-#include "nsFastStartupQt.h"
-#include "nsIFile.h"
-#include "nsString.h"
-#include "BinaryPath.h"
-
-#define TOOLBAR_SPLASH "toolbar_splash.png"
-#define FAVICON_SPLASH "favicon32.png"
-#define DRAWABLE_PATH "res/drawable/"
-
-MozQWidgetFast::MozQWidgetFast(nsWindow* aReceiver, QGraphicsItem* aParent)
-{
- setParentItem(aParent);
- char exePath[MAXPATHLEN];
- QStringList arguments = qApp->arguments();
- nsresult rv =
- mozilla::BinaryPath::Get(arguments.at(0).toLocal8Bit().constData(),
- exePath);
- if (NS_FAILED(rv)) {
- printf("Cannot read default path\n");
- return;
- }
- char *lastSlash = strrchr(exePath, XPCOM_FILE_PATH_SEPARATOR[0]);
- if (!lastSlash ||
- (lastSlash - exePath > int(MAXPATHLEN - sizeof(XPCOM_DLL) - 1))) {
- return;
- }
- strcpy(++lastSlash, "/");
- QString resourcePath(QString((const char*)&exePath) + DRAWABLE_PATH);
- mToolbar.load(resourcePath + TOOLBAR_SPLASH);
- mIcon.load(resourcePath + FAVICON_SPLASH);
- for (int i = 1; i < arguments.size(); i++) {
- QUrl url = QUrl::fromUserInput(arguments.at(i));
- if (url.isValid()) {
- mUrl = url.toString();
- }
- }
-}
-
-void MozQWidgetFast::paint(QPainter* aPainter,
- const QStyleOptionGraphicsItem*,
- QWidget*)
-{
- // toolbar height
- int toolbarHeight = 80;
- // Offset of favicon starting from left toolbar edge
- int faviconOffset = 25;
- // favicon size
- int faviconSize = 32;
- // width of left and right TOOLBAR_SPLASH part
- // |------------------------------|
- // |LeftPart|tile...part|RightPart|
- float toolbarPartWidth = 77;
- // width of TOOLBAR_SPLASH part after toolbarPartWidth,
- // that can be used for tiled toolbar area
- int tileWidth = 2;
- // Paint left toolbar part
- aPainter->drawPixmap(QRect(0, 0, toolbarPartWidth, toolbarHeight),
- mToolbar, QRect(0, 0, toolbarPartWidth, toolbarHeight));
-
- // Paint Tile pixmap of middle toolbar part
- QPixmap tile(tileWidth, toolbarHeight);
- QPainter p(&tile);
- p.drawPixmap(QRect(0, 0, tileWidth, toolbarHeight), mToolbar,
- QRect(toolbarPartWidth, 0, tileWidth, toolbarHeight));
- aPainter->drawTiledPixmap(QRect(toolbarPartWidth, 0, rect().width() - toolbarPartWidth * 2,
- toolbarHeight),
- tile);
- // Paint Favicon
- aPainter->drawPixmap(QRect(faviconOffset, faviconOffset,
- faviconSize, faviconSize),
- mIcon);
- if (!mUrl.isEmpty()) {
- // Height or URL string (font height)
- float urlHeight = 24.0f;
- // Start point of URL string, relative to window 0,0
- int urlOffsetX = 80;
- int urlOffsetY = 48;
- QFont font = aPainter->font();
- font.setPixelSize(urlHeight);
- font.setFamily(QString("Nokia Sans"));
- font.setKerning(true);
- aPainter->setFont(font);
- aPainter->setRenderHint(QPainter::TextAntialiasing, true);
- aPainter->drawText(urlOffsetX, urlOffsetY,
- aPainter->fontMetrics().elidedText(mUrl, Qt::ElideRight, rect().width() - urlOffsetX * 2));
- }
-
- // Paint Right toolbar part
- aPainter->drawPixmap(QRect(rect().width() - toolbarPartWidth,
- 0, toolbarPartWidth,
- toolbarHeight),
- mToolbar,
- QRect(mToolbar.width() - toolbarPartWidth, 0,
- toolbarPartWidth, toolbarHeight));
-
- nsFastStartup::GetSingleton()->painted();
-}
deleted file mode 100644
--- a/widget/qt/faststartupqt/mozqwidgetfast.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef MOZQWIDGETFAST_H
-#define MOZQWIDGETFAST_H
-
-#include <QtCore/QObject>
-#include "moziqwidget.h"
-
-class MozQWidgetFast : public IMozQWidget
-{
-public:
- MozQWidgetFast(nsWindow* aReceiver, QGraphicsItem *aParent);
- ~MozQWidgetFast() {}
-
-protected:
- virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
-
-private:
- QPixmap mToolbar;
- QPixmap mIcon;
- QString mUrl;
-};
-
-#endif
deleted file mode 100644
--- a/widget/qt/faststartupqt/nsFastStartupQt.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <QApplication>
-#include "nsQAppInstance.h"
-#include <QtOpenGL/QGLWidget>
-#include <QThread>
-#if defined MOZ_ENABLE_MEEGOTOUCH
-#include <MScene>
-#endif
-#include "moziqwidget.h"
-#include "mozqwidgetfast.h"
-#include "nsFastStartupQt.h"
-#include "nsXPCOMGlue.h"
-#include "nsXULAppAPI.h"
-
-
-static nsFastStartup* sFastStartup = nullptr;
-
-void
-GeckoThread::run()
-{
- Q_EMIT symbolsLoadingFinished(mFunc(mExecPath));
-}
-
-void
-nsFastStartup::symbolsLoadingFinished(bool preloaded)
-{
- mSymbolsLoaded = preloaded;
- if (mWidgetPainted && mSymbolsLoaded) {
- mLoop.quit();
- }
-}
-
-void nsFastStartup::painted()
-{
- mWidgetPainted = true;
- if (mWidgetPainted && mSymbolsLoaded) {
- mLoop.quit();
- }
-}
-
-MozGraphicsView*
-nsFastStartup::GetStartupGraphicsView(QWidget* parentWidget, IMozQWidget* aTopChild)
-{
- MozGraphicsView* view = nullptr;
- if (sFastStartup && sFastStartup->mGraphicsView) {
- view = sFastStartup->mGraphicsView;
- } else {
- view = new MozGraphicsView(parentWidget);
- Qt::WindowFlags flags = Qt::Widget;
- view->setWindowFlags(flags);
- }
- view->SetTopLevel(aTopChild, parentWidget);
-
- return view;
-}
-
-nsFastStartup*
-nsFastStartup::GetSingleton()
-{
- return sFastStartup;
-}
-
-nsFastStartup::nsFastStartup()
- : mGraphicsView(0)
- , mFakeWidget(0)
- , mSymbolsLoaded(false)
- , mWidgetPainted(false)
- , mThread(0)
-
-{
- sFastStartup = this;
-}
-
-nsFastStartup::~nsFastStartup()
-{
- nsQAppInstance::Release();
- sFastStartup = 0;
-}
-
-void
-nsFastStartup::RemoveFakeLayout()
-{
- if (mFakeWidget && mGraphicsView) {
- mGraphicsView->scene()->removeItem(mFakeWidget);
- mFakeWidget->deleteLater();
- mFakeWidget = 0;
- // Forget GraphicsView, ownership moved to nsIWidget
- mGraphicsView = 0;
- }
-}
-
-bool
-nsFastStartup::CreateFastStartup(int& argc, char ** argv,
- const char* execPath,
- GeckoLoaderFunc aFunc)
-{
- gArgc = argc;
- gArgv = argv;
- // Create main QApplication instance
- nsQAppInstance::AddRef(argc, argv, true);
- // Create symbols loading thread
- mThread = new GeckoThread();
- // Setup thread loading finished callbacks
- connect(mThread, SIGNAL(symbolsLoadingFinished(bool)),
- this, SLOT(symbolsLoadingFinished(bool)));
- mThread->SetLoader(aFunc, execPath);
- // Create Static UI widget and view
- IMozQWidget* fakeWidget = new MozQWidgetFast(nullptr, nullptr);
- mGraphicsView = GetStartupGraphicsView(nullptr, fakeWidget);
- mFakeWidget = fakeWidget;
-
- mThread->start();
- mGraphicsView->showNormal();
-
- // Start native loop in order to get view opened and painted once
- // Will block CreateFastStartup function and
- // exit when symbols are loaded and Static UI shown
- mLoop.exec();
-
- return true;
-}
deleted file mode 100644
--- a/widget/qt/faststartupqt/nsFastStartupQt.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef FAST_STARTUP_H
-#define FAST_STARTUP_H
-
-#include <QObject>
-#include "nscore.h"
-#include <QThread>
-#include <QEventLoop>
-#include <sys/time.h>
-
-class QGraphicsView;
-class MozMGraphicsView;
-class MozQGraphicsView;
-class QGraphicsWidget;
-class IMozQWidget;
-class QWidget;
-
-#if defined MOZ_ENABLE_MEEGOTOUCH
-typedef MozMGraphicsView MozGraphicsView;
-#else
-typedef MozQGraphicsView MozGraphicsView;
-#endif
-
-class nsFastStartup;
-typedef bool (*GeckoLoaderFunc)(const char* execPath);
-class GeckoThread : public QThread
-{
- Q_OBJECT
-
-public:
- void run();
- void SetLoader(GeckoLoaderFunc aFunc, const char* execPath)
- {
- mExecPath = execPath;
- mFunc = aFunc;
- }
-
-Q_SIGNALS:
- void symbolsLoadingFinished(bool);
-
-private:
- const char* mExecPath;
- GeckoLoaderFunc mFunc;
-};
-
-class NS_EXPORT nsFastStartup : public QObject
-{
- Q_OBJECT
-
-public:
- static nsFastStartup* GetSingleton();
- // Create new or get QGraphicsView which could have been created for Static UI
- static MozGraphicsView* GetStartupGraphicsView(QWidget* parentWidget, IMozQWidget* aTopChild);
- nsFastStartup();
- virtual ~nsFastStartup();
- virtual bool CreateFastStartup(int& argc, char ** argv,
- const char* execPath,
- GeckoLoaderFunc aFunc);
- // Called when first real mozilla paint happend
- void RemoveFakeLayout();
- // Final notification that Static UI show and painted
- void painted();
-
-protected Q_SLOTS:
- void symbolsLoadingFinished(bool);
-
-private:
- MozGraphicsView* mGraphicsView;
- QGraphicsWidget* mFakeWidget;
- bool mSymbolsLoaded;
- bool mWidgetPainted;
- GeckoThread* mThread;
- QEventLoop mLoop;
-};
-
-#endif
--- a/widget/qt/moz.build
+++ b/widget/qt/moz.build
@@ -1,76 +1,50 @@
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-DIRS += ['faststartupqt']
-
-EXPORTS += [
- 'nsQtKeyUtils.h',
-]
-
GENERATED_SOURCES += [
- 'moc_moziqwidget.cpp',
'moc_mozqwidget.cpp',
'moc_nsAppShell.cpp',
]
SOURCES += [
- 'mozqglwidgetwrapper.cpp',
'mozqwidget.cpp',
- 'mozSwipeGesture.cpp',
'nsAppShell.cpp',
'nsBidiKeyboard.cpp',
'nsClipboard.cpp',
- 'nsDeviceContextSpecQt.cpp',
- 'nsDragService.cpp',
- 'nsFilePicker.cpp',
'nsIdleServiceQt.cpp',
'nsLookAndFeel.cpp',
- 'nsNativeThemeQt.cpp',
- 'nsPrintDialogQt.cpp',
- 'nsPrintOptionsQt.cpp',
- 'nsPrintSettingsQt.cpp',
'nsQtKeyUtils.cpp',
'nsScreenManagerQt.cpp',
'nsScreenQt.cpp',
- 'nsSound.cpp',
'nsWidgetFactory.cpp',
'nsWindow.cpp',
]
-if CONFIG['MOZ_ENABLE_CONTENTMANAGER']:
+
+if CONFIG['NS_PRINTING']:
SOURCES += [
- 'nsMFilePicker.cpp',
- ]
- GENERATED_SOURCES += [
- 'moc_nsMFilePicker.cpp',
- ]
-
-if CONFIG[' MOZ_ENABLE_QTMOBILITY']:
- SOURCES += [
- 'mozqorientationsensorfilter.cpp',
- ]
- GENERATED_SOURCES += [
- 'moc_mozqorientationsensorfilter.cpp',
+ 'nsDeviceContextSpecQt.cpp',
+ 'nsPrintDialogQt.cpp',
+ 'nsPrintOptionsQt.cpp',
+ 'nsPrintSettingsQt.cpp',
]
LIBRARY_NAME = 'widget_qt'
include('/ipc/chromium/chromium-config.mozbuild')
FINAL_LIBRARY = 'xul'
LOCAL_INCLUDES += [
'../shared',
- '/widget/qt/faststartupqt',
- '/widget/shared',
'/widget/xpwidgets',
]
if CONFIG['MOZ_X11']:
LOCAL_INCLUDES += [
'../shared/x11',
]
deleted file mode 100644
--- a/widget/qt/mozSwipeGesture.cpp
+++ /dev/null
@@ -1,180 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim:expandtab:shiftwidth=4:tabstop=4:
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include "mozSwipeGesture.h"
-#include <QTouchEvent>
-#include <QGraphicsWidget>
-#include <nsIDOMSimpleGestureEvent.h>
-#include <math.h>
-
-// Percent of screen size
-static const float TRIGGER_DISTANCE = 0.3;
-
-// It would be nice to get platform defines for these values
-// Maximum finger distance in pixels
-const int MAX_FINGER_DISTANCE = 250;
-// We could define it as 2*QT_GUI_DOUBLE_CLICK_RADIUS, but it's not available
-// due to QTBUG-9630
-const int FINGER_DISTANCE_MISTAKE = 50;
-
-QGesture*
-MozSwipeGestureRecognizer::create(QObject* target)
-{
- return new MozSwipeGesture();
-}
-
-QGestureRecognizer::Result
-MozSwipeGestureRecognizer::recognize(QGesture* aState,
- QObject* aWatched,
- QEvent* aEvent)
-{
- const QTouchEvent* ev = static_cast<const QTouchEvent *>(aEvent);
- MozSwipeGesture* swipe = static_cast<MozSwipeGesture *>(aState);
-
- QGestureRecognizer::Result result = QGestureRecognizer::Ignore;
-
- QGraphicsWidget* widget = qobject_cast<QGraphicsWidget*>(aWatched);
- if (!widget) {
- return result;
- }
-
- switch (aEvent->type()) {
- case QEvent::TouchBegin:
- swipe->mSwipeState = MozSwipeGesture::NOT_STARTED;
- result = QGestureRecognizer::MayBeGesture;
- break;
-
- case QEvent::TouchEnd:
- if (swipe->state() != Qt::NoGesture &&
- swipe->mSwipeState == MozSwipeGesture::TRIGGERED) {
- result = QGestureRecognizer::FinishGesture;
- }
- else {
- result = QGestureRecognizer::CancelGesture;
- }
- break;
-
- case QEvent::TouchUpdate:
- // We have already handled this swipe
- if (swipe->mSwipeState > MozSwipeGesture::STARTED) {
- break;
- }
-
- if (ev->touchPoints().count() > 2) {
- swipe->mSwipeState = MozSwipeGesture::CANCELLED;
- result = QGestureRecognizer::CancelGesture;
- break;
- }
-
-
- if (ev->touchPoints().count() == 2) {
- swipe->mSwipeState = MozSwipeGesture::STARTED;
- QList <QTouchEvent::TouchPoint> touchPoints = ev->touchPoints();
- if (!swipe->Update(touchPoints[0], touchPoints[1], widget->size())) {
- result = QGestureRecognizer::CancelGesture;
- swipe->mSwipeState = MozSwipeGesture::CANCELLED;
- }
- if (swipe->mSwipeState == MozSwipeGesture::TRIGGERED) {
- result = QGestureRecognizer::TriggerGesture;
- }
- else {
- result = QGestureRecognizer::MayBeGesture;
- }
- }
- break;
-
- default:
- result = QGestureRecognizer::Ignore;
- }
-
- return result;
-}
-
-void
-MozSwipeGestureRecognizer::reset(QGesture* aState)
-{
- MozSwipeGesture* swipe = static_cast<MozSwipeGesture *>(aState);
- swipe->mHorizontalDirection = 0;
- swipe->mVerticalDirection = 0;
- QGestureRecognizer::reset(aState);
-}
-
-MozSwipeGesture::MozSwipeGesture()
- : mHorizontalDirection(0)
- , mVerticalDirection(0)
- , mSwipeState(MozSwipeGesture::NOT_STARTED)
-{
-}
-
-int MozSwipeGesture::Direction()
-{
- return mHorizontalDirection | mVerticalDirection;
-}
-
-bool
-MozSwipeGesture::Update(const QTouchEvent::TouchPoint& aFirstPoint,
- const QTouchEvent::TouchPoint& aSecondPoint,
- const QSizeF& aSize)
-{
- // Check that fingers are not too far away
- QPointF fingerDistance = aFirstPoint.pos() - aSecondPoint.pos();
- if (fingerDistance.manhattanLength() > MAX_FINGER_DISTANCE) {
- return false;
- }
-
- // Check that fingers doesn't move too much from the original distance
- QPointF startFingerDistance = aFirstPoint.startPos() - aSecondPoint.startPos();
- if ((startFingerDistance - fingerDistance).manhattanLength()
- > FINGER_DISTANCE_MISTAKE) {
- return false;
- }
-
- QPointF startPosition = aFirstPoint.startNormalizedPos();
- QPointF currentPosition = aFirstPoint.normalizedPos();
-
- float xDistance = fabs(currentPosition.x() - startPosition.x());
- float yDistance = fabs(currentPosition.y() - startPosition.y());
-
- startPosition = aFirstPoint.startPos();
- currentPosition = aFirstPoint.pos();
-
- if (!aSize.isEmpty()) {
- xDistance = fabs(currentPosition.x() - startPosition.x())
- / aSize.width();
- yDistance = fabs(currentPosition.y() - startPosition.y())
- / aSize.height();
- }
-
- mVerticalDirection = nsIDOMSimpleGestureEvent::DIRECTION_UP;
- if (currentPosition.y() > startPosition.y()) {
- mVerticalDirection = nsIDOMSimpleGestureEvent::DIRECTION_DOWN;
- }
-
- mHorizontalDirection = nsIDOMSimpleGestureEvent::DIRECTION_LEFT;
- if (currentPosition.x() > startPosition.x()) {
- mHorizontalDirection = nsIDOMSimpleGestureEvent::DIRECTION_RIGHT;
- }
-
- if (xDistance > TRIGGER_DISTANCE) {
- if (yDistance < TRIGGER_DISTANCE/2) {
- mVerticalDirection = 0;
- }
- mSwipeState = TRIGGERED;
- }
-
- if (yDistance > TRIGGER_DISTANCE) {
- if (xDistance < TRIGGER_DISTANCE/2) {
- mHorizontalDirection = 0;
- }
- mSwipeState = TRIGGERED;
- }
-
- // Use center of touchpoints as hotspot
- QPointF hotspot = aFirstPoint.pos() + aSecondPoint.pos();
- hotspot /= 2;
- setHotSpot(hotspot);
- return true;
-}
deleted file mode 100644
--- a/widget/qt/mozSwipeGesture.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim:expandtab:shiftwidth=4:tabstop=4:
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef MOZSWIPEGESTURE_H
-#define MOZSWIPEGESTURE_H
-
-#include <QGestureRecognizer>
-#include <QGesture>
-#include <QTouchEvent>
-
-class MozSwipeGestureRecognizer: public QGestureRecognizer
-{
-public:
- virtual QGesture* create(QObject* aTarget);
- virtual QGestureRecognizer::Result recognize(QGesture* aState,
- QObject* aWatched,
- QEvent* aEvent);
- virtual void reset(QGesture* aState);
-};
-
-class MozSwipeGesture: public QGesture
-{
-public:
- int Direction();
-
-private:
- enum SwipeState {
- NOT_STARTED = 0,
- STARTED,
- CANCELLED,
- TRIGGERED
- };
-
- MozSwipeGesture();
-
- bool Update(const QTouchEvent::TouchPoint& aFirstPoint,
- const QTouchEvent::TouchPoint& aSecondPoint,
- const QSizeF& aSize);
-
- int mHorizontalDirection;
- int mVerticalDirection;
- SwipeState mSwipeState;
- friend class MozSwipeGestureRecognizer;
-};
-
-#endif
deleted file mode 100644
--- a/widget/qt/moziqwidget.h
+++ /dev/null
@@ -1,319 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef MOZIQWIDGET_H
-#define MOZIQWIDGET_H
-
-#include <QApplication>
-#include <QGraphicsWidget>
-#include <QGraphicsView>
-#include "mozqglwidgetwrapper.h"
-
-#include "nsCOMPtr.h"
-
-#ifdef MOZ_ENABLE_MEEGOTOUCH
-#include <MSceneWindow>
-#include <MInputMethodState>
-#include <QtGui/QGraphicsSceneResizeEvent>
-#include <QTimer>
-#endif
-
-class nsWindow;
-
-class IMozQWidget : public QGraphicsWidget
-{
- Q_OBJECT
-public:
- /**
- * Mozilla helper.
- */
- virtual void setModal(bool) {}
- virtual void dropReceiver() { };
- virtual nsWindow* getReceiver() { return nullptr; };
-
- virtual void activate() {}
- virtual void deactivate() {}
-
- /**
- * VirtualKeyboardIntegration
- */
- virtual bool isVKBOpen() { return false; }
-
- virtual void NotifyVKB(const QRect& rect) {}
- virtual void SwitchToForeground() {}
- virtual void SwitchToBackground() {}
-};
-
-class MozQGraphicsViewEvents
-{
-public:
-
- MozQGraphicsViewEvents(QGraphicsView* aView)
- : mView(aView)
- { }
-
- void handleEvent(QEvent* aEvent, IMozQWidget* aTopLevel)
- {
- if (!aEvent)
- return;
- if (aEvent->type() == QEvent::WindowActivate) {
- if (aTopLevel)
- aTopLevel->activate();
- }
-
- if (aEvent->type() == QEvent::WindowDeactivate) {
- if (aTopLevel)
- aTopLevel->deactivate();
- }
- }
-
- void handleResizeEvent(QResizeEvent* aEvent, IMozQWidget* aTopLevel)
- {
- if (!aEvent)
- return;
- if (aTopLevel) {
- // transfer new size to graphics widget
- aTopLevel->setGeometry(0.0, 0.0,
- static_cast<qreal>(aEvent->size().width()),
- static_cast<qreal>(aEvent->size().height()));
- // resize scene rect to vieport size,
- // to avoid extra scrolling from QAbstractScrollable
- if (mView)
- mView->setSceneRect(mView->viewport()->rect());
- }
- }
-
- bool handleCloseEvent(QCloseEvent* aEvent, IMozQWidget* aTopLevel)
- {
- if (!aEvent)
- return false;
- if (aTopLevel) {
- // close graphics widget instead, this view will be discarded
- // automatically
- QApplication::postEvent(aTopLevel, new QCloseEvent(*aEvent));
- aEvent->ignore();
- return true;
- }
-
- return false;
- }
-
-private:
- QGraphicsView* mView;
-};
-
-/**
- This is a helper class to synchronize the QGraphicsView window with
- its contained QGraphicsWidget for things like resizing and closing
- by the user.
-*/
-class MozQGraphicsView : public QGraphicsView
-{
- Q_OBJECT
-
-public:
- MozQGraphicsView(QWidget * aParent = nullptr)
- : QGraphicsView (new QGraphicsScene(), aParent)
- , mEventHandler(this)
- , mTopLevelWidget(nullptr)
- , mGLWidget(0)
- {
- setMouseTracking(true);
- setFrameShape(QFrame::NoFrame);
- }
-
- void SetTopLevel(IMozQWidget* aTopLevel, QWidget* aParent)
- {
- scene()->addItem(aTopLevel);
- mTopLevelWidget = aTopLevel;
- }
-
- void setGLWidgetEnabled(bool aEnabled)
- {
- if (aEnabled) {
- mGLWidget = new MozQGLWidgetWrapper();
- mGLWidget->setViewport(this);
- } else {
- delete mGLWidget;
- mGLWidget = 0;
- setViewport(new QWidget());
- }
- }
-
-protected:
-
- virtual bool event(QEvent* aEvent)
- {
- mEventHandler.handleEvent(aEvent, mTopLevelWidget);
- return QGraphicsView::event(aEvent);
- }
-
- virtual void resizeEvent(QResizeEvent* aEvent)
- {
- mEventHandler.handleResizeEvent(aEvent, mTopLevelWidget);
- QGraphicsView::resizeEvent(aEvent);
- }
-
- virtual void closeEvent (QCloseEvent* aEvent)
- {
- if (!mEventHandler.handleCloseEvent(aEvent, mTopLevelWidget))
- QGraphicsView::closeEvent(aEvent);
- }
-
- virtual void paintEvent(QPaintEvent* aEvent)
- {
- if (mGLWidget) {
- mGLWidget->makeCurrent();
- }
- QGraphicsView::paintEvent(aEvent);
- }
-
-private:
- MozQGraphicsViewEvents mEventHandler;
- IMozQWidget* mTopLevelWidget;
- MozQGLWidgetWrapper* mGLWidget;
-};
-
-#ifdef MOZ_ENABLE_MEEGOTOUCH
-class MozMSceneWindow : public MSceneWindow
-{
- Q_OBJECT
-public:
- MozMSceneWindow(IMozQWidget* aTopLevel)
- : MSceneWindow(aTopLevel->parentItem())
- , mTopLevelWidget(aTopLevel)
- {
- MInputMethodState* inputMethodState = MInputMethodState::instance();
- if (inputMethodState) {
- connect(inputMethodState, SIGNAL(inputMethodAreaChanged(const QRect&)),
- this, SLOT(VisibleScreenAreaChanged(const QRect&)));
- }
- }
-
- void SetTopLevel(IMozQWidget* aTopLevel)
- {
- mTopLevelWidget = aTopLevel;
- mTopLevelWidget->setParentItem(this);
- mTopLevelWidget->installEventFilter(this);
- }
-
-protected:
- virtual void resizeEvent(QGraphicsSceneResizeEvent* aEvent)
- {
- mCurrentSize = aEvent->newSize();
- MSceneWindow::resizeEvent(aEvent);
- CheckTopLevelSize();
- }
-
- virtual bool eventFilter(QObject* watched, QEvent* e)
- {
- if (e->type() == QEvent::GraphicsSceneResize ||
- e->type() == QEvent::GraphicsSceneMove) {
-
- //Do this in next event loop, or we are in recursion!
- QTimer::singleShot(0, this, SLOT(CheckTopLevelSize()));
- }
-
- return false;
- }
-
-private Q_SLOTS:
- void CheckTopLevelSize()
- {
- if (mTopLevelWidget) {
- qreal xpos = 0;
- qreal ypos = 0;
- qreal width = mCurrentSize.width();
- qreal height = mCurrentSize.height();
-
- // transfer new size to graphics widget if changed
- QRectF r = mTopLevelWidget->geometry();
- if (r != QRectF(xpos, ypos, width, height)) {
- mTopLevelWidget->setGeometry(xpos, ypos, width, height);
- }
- }
- }
-
- void VisibleScreenAreaChanged(const QRect& rect) {
- if (mTopLevelWidget) {
- mTopLevelWidget->NotifyVKB(rect);
- }
- }
-
-private:
- IMozQWidget* mTopLevelWidget;
- QSizeF mCurrentSize;
-};
-
-/**
- This is a helper class to synchronize the MWindow window with
- its contained QGraphicsWidget for things like resizing and closing
- by the user.
-*/
-class MozMGraphicsView : public MWindow
-{
- Q_OBJECT
-public:
- MozMGraphicsView(QWidget* aParent = nullptr)
- : MWindow(aParent)
- , mEventHandler(this)
- , mTopLevelWidget(nullptr)
- , mSceneWin(nullptr)
- {
- QObject::connect(this, SIGNAL(switcherEntered()), this, SLOT(onSwitcherEntered()));
- QObject::connect(this, SIGNAL(switcherExited()), this, SLOT(onSwitcherExited()));
- setFrameShape(QFrame::NoFrame);
- }
-
- void SetTopLevel(IMozQWidget* aTopLevel, QWidget* aParent)
- {
- if (!mSceneWin) {
- mSceneWin = new MozMSceneWindow(aTopLevel);
- mSceneWin->appear(this);
- }
- mSceneWin->SetTopLevel(aTopLevel);
- mTopLevelWidget = aTopLevel;
- }
-
-public Q_SLOTS:
- void onSwitcherEntered() {
- if (mTopLevelWidget) {
- mTopLevelWidget->SwitchToBackground();
- }
- }
- void onSwitcherExited() {
- if (mTopLevelWidget) {
- mTopLevelWidget->SwitchToForeground();
- }
- }
-
-protected:
- virtual bool event(QEvent* aEvent) {
- mEventHandler.handleEvent(aEvent, mTopLevelWidget);
- return MWindow::event(aEvent);
- }
-
- virtual void resizeEvent(QResizeEvent* aEvent)
- {
- setSceneRect(viewport()->rect());
- MWindow::resizeEvent(aEvent);
- }
-
- virtual void closeEvent (QCloseEvent* aEvent)
- {
- if (!mEventHandler.handleCloseEvent(aEvent, mTopLevelWidget)) {
- MWindow::closeEvent(aEvent);
- }
- }
-
-private:
- MozQGraphicsViewEvents mEventHandler;
- IMozQWidget* mTopLevelWidget;
- MozMSceneWindow* mSceneWin;
-};
-
-#endif /* MOZ_ENABLE_MEEGOTOUCH */
-#endif
deleted file mode 100644
--- a/widget/qt/mozqglwidgetwrapper.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "mozqglwidgetwrapper.h"
-#include <QGraphicsView>
-#include <QtOpenGL/QGLWidget>
-#include <QtOpenGL/QGLContext>
-
-MozQGLWidgetWrapper::MozQGLWidgetWrapper()
- : mWidget(new QGLWidget())
-{
-}
-
-MozQGLWidgetWrapper::~MozQGLWidgetWrapper()
-{
- delete mWidget;
-}
-
-void MozQGLWidgetWrapper::makeCurrent()
-{
- mWidget->makeCurrent();
-}
-
-void MozQGLWidgetWrapper::setViewport(QGraphicsView* aView)
-{
- aView->setViewport(mWidget);
-}
-
-bool MozQGLWidgetWrapper::hasGLContext(QGraphicsView* aView)
-{
- return aView && qobject_cast<QGLWidget*>(aView->viewport());
-}
-
-bool MozQGLWidgetWrapper::isRGBAContext()
-{
- QGLContext* context = const_cast<QGLContext*>(QGLContext::currentContext());
- return context && context->format().alpha();
-}
\ No newline at end of file
deleted file mode 100644
--- a/widget/qt/mozqglwidgetwrapper.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef MOZQGLWIDGETWRAPPER_H
-#define MOZQGLWIDGETWRAPPER_H
-
-/*
- * qgl.h and GLDefs.h has conflicts in type defines
- * QGLWidget wrapper class helps to avoid including qgl.h with mozilla gl includes
- */
-
-class QGLWidget;
-class QGraphicsView;
-class MozQGLWidgetWrapper
-{
-public:
- MozQGLWidgetWrapper();
- ~MozQGLWidgetWrapper();
- void makeCurrent();
- void setViewport(QGraphicsView*);
- static bool hasGLContext(QGraphicsView*);
- static bool isRGBAContext();
-private:
- QGLWidget* mWidget;
-};
-
-#endif
deleted file mode 100644
--- a/widget/qt/mozqorientationsensorfilter.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "mozqorientationsensorfilter.h"
-#ifdef MOZ_ENABLE_MEEGOTOUCH
-#include <MApplication>
-#include <MWindow>
-#include <MSceneManager>
-#endif
-#include "nsXULAppAPI.h"
-
-using namespace QtMobility;
-
-int MozQOrientationSensorFilter::mWindowRotationAngle = 0;
-QTransform MozQOrientationSensorFilter::mWindowRotationTransform;
-
-bool
-MozQOrientationSensorFilter::filter(QOrientationReading* reading)
-{
- switch (reading->orientation()) {
- //The Top edge of the device is pointing up.
- case QOrientationReading::TopDown:
- mWindowRotationAngle = 90;
- break;
- //The Top edge of the device is pointing down.
- case QOrientationReading::TopUp:
- mWindowRotationAngle = 270;
- break;
- //The Left edge of the device is pointing up.
- case QOrientationReading::LeftUp:
- mWindowRotationAngle = 180;
- break;
- //The Right edge of the device is pointing up.
- case QOrientationReading::RightUp:
- mWindowRotationAngle = 0;
- break;
- //The Face of the device is pointing up.
- case QOrientationReading::FaceUp:
- //The Face of the device is pointing down.
- case QOrientationReading::FaceDown:
- //The orientation is unknown.
- case QOrientationReading::Undefined:
- default:
- return true;
- }
-
- mWindowRotationTransform = QTransform();
- mWindowRotationTransform.rotate(mWindowRotationAngle);
-
-#ifdef MOZ_ENABLE_MEEGOTOUCH
- if (XRE_GetProcessType() == GeckoProcessType_Default) {
- MWindow* window = MApplication::activeWindow();
- if (window && window->sceneManager()) {
- window->sceneManager()->
- setOrientationAngle((M::OrientationAngle)mWindowRotationAngle,
- MSceneManager::ImmediateTransition);
- }
- }
-#else
- Q_EMIT orientationChanged();
-#endif
-
- return true; // don't store the reading in the sensor
-}
-
-int
-MozQOrientationSensorFilter::GetWindowRotationAngle()
-{
-#ifdef MOZ_ENABLE_MEEGOTOUCH
- if (XRE_GetProcessType() == GeckoProcessType_Default) {
- MWindow* window = MApplication::activeWindow();
- if (window) {
- M::OrientationAngle angle = window->orientationAngle();
- if (mWindowRotationAngle != angle) {
- mWindowRotationAngle = angle;
- mWindowRotationTransform = QTransform();
- mWindowRotationTransform.rotate(mWindowRotationAngle);
- }
- }
- }
-#endif
- return mWindowRotationAngle;
-}
-
-QTransform&
-MozQOrientationSensorFilter::GetRotationTransform()
-{
- GetWindowRotationAngle();
- return mWindowRotationTransform;
-}
-
deleted file mode 100644
--- a/widget/qt/mozqorientationsensorfilter.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim: set ts=4 et sw=4 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef MOZQORIENTATIONMODULE_H
-#define MOZQORIENTATIONMODULE_H
-
-#include <QtSensors/QOrientationReading>
-#include <QtSensors/QOrientationFilter>
-#include <QObject>
-#include <QTransform>
-
-
-class MozQOrientationSensorFilter : public QObject
- , public QtMobility::QOrientationFilter
-{
- Q_OBJECT
-
-public:
- MozQOrientationSensorFilter()
- {
- mWindowRotationAngle = 0;
- }
-
- virtual ~MozQOrientationSensorFilter(){}
-
- virtual bool filter(QtMobility::QOrientationReading* reading);
-
- static int GetWindowRotationAngle();
- static QTransform& GetRotationTransform();
-
-Q_SIGNALS:
- void orientationChanged();
-
-private:
- bool filter(QtMobility::QSensorReading *reading)
- {
- return filter(static_cast<QtMobility::QOrientationReading*>(reading));
- }
-
- static int mWindowRotationAngle;
- static QTransform mWindowRotationTransform;
-};
-
-#endif
--- a/widget/qt/mozqwidget.cpp
+++ b/widget/qt/mozqwidget.cpp
@@ -1,404 +1,183 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set ts=4 et sw=4 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include <QGraphicsSceneHoverEvent>
-#include <QGraphicsSceneMouseEvent>
-#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
-#include <QInputContext>
-#endif
-#include <QtCore/QTimer>
-// Solve conflict of qgl.h and GLDefs.h
-#define GLdouble_defined 1
+#include <QtCore/QCoreApplication>
+#include <QtGui/QResizeEvent>
+
#include "mozqwidget.h"
#include "nsWindow.h"
-#include "nsIObserverService.h"
-#include "mozilla/Services.h"
-#include "mozilla/TextEvents.h"
-
-
-#ifdef MOZ_ENABLE_QTMOBILITY
-#include "mozqorientationsensorfilter.h"
-#ifdef MOZ_X11
-#include <QX11Info>
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-# undef KeyPress
-# undef KeyRelease
-# undef CursorShape
-#endif //MOZ_X11
-#endif //MOZ_ENABLE_QTMOBILITY
-
-/*
- Pure Qt is lacking a clear API to get the current state of the VKB (opened
- or closed).
-*/
-static bool gKeyboardOpen = false;
+using namespace mozilla::widget;
-/*
- In case we could not open the keyboard, we will try again when the focus
- event is sent. This can happen if the keyboard is asked for before the
- window is focused. This global is used to track that case.
-*/
-static bool gFailedOpenKeyboard = false;
-
-/*
- For websites that focus editable elements during other operations for a very
- short time, we add some decoupling to prevent the VKB from appearing and
- reappearing for a very short time. This global is set when the keyboard should
- be opened and if it is still set when a timer runs out, the VKB is really
- shown.
-*/
-static bool gPendingVKBOpen = false;
-
-/*
- Contains the last preedit String, this is needed in order to generate KeyEvents
-*/
-static QString gLastPreeditString;
-
-MozQWidget::MozQWidget(nsWindow* aReceiver, QGraphicsItem* aParent)
- : mReceiver(aReceiver)
+MozQWidget::MozQWidget(nsWindow* aReceiver, QWindow* aParent)
+ : QWindow(aParent)
+ , mReceiver(aReceiver)
+ , mUpdatePending(false)
{
- setParentItem(aParent);
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0))
- setFlag(QGraphicsItem::ItemAcceptsInputMethod);
- setAcceptTouchEvents(true);
-#endif
- setAcceptHoverEvents(true);
+ mReceiver->GetWindowType(mWindowType);
}
MozQWidget::~MozQWidget()
{
- if (mReceiver)
- mReceiver->QWidgetDestroyed();
-}
-
-void MozQWidget::paint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption, QWidget* aWidget /*= 0*/)
-{
- if (mReceiver)
- mReceiver->DoPaint(aPainter, aOption, aWidget);
-}
-
-void MozQWidget::activate()
-{
- // ensure that the keyboard is hidden when we activate the window
- hideVKB();
- mReceiver->DispatchActivateEventOnTopLevelWindow();
-}
-
-void MozQWidget::deactivate()
-{
- // ensure that the keyboard is hidden when we deactivate the window
- hideVKB();
- mReceiver->DispatchDeactivateEventOnTopLevelWindow();
-}
-
-void MozQWidget::resizeEvent(QGraphicsSceneResizeEvent* aEvent)
-{
- mReceiver->OnResizeEvent(aEvent);
-}
-
-void MozQWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent* aEvent)
-{
- mReceiver->contextMenuEvent(aEvent);
}
-void MozQWidget::dragEnterEvent(QGraphicsSceneDragDropEvent* aEvent)
-{
- mReceiver->OnDragEnter(aEvent);
-}
-
-void MozQWidget::dragLeaveEvent(QGraphicsSceneDragDropEvent* aEvent)
+void MozQWidget::render(QPainter* painter)
{
- mReceiver->OnDragLeaveEvent(aEvent);
-}
-
-void MozQWidget::dragMoveEvent(QGraphicsSceneDragDropEvent* aEvent)
-{
- mReceiver->OnDragMotionEvent(aEvent);
+ Q_UNUSED(painter);
}
-void MozQWidget::dropEvent(QGraphicsSceneDragDropEvent* aEvent)
-{
- mReceiver->OnDragDropEvent(aEvent);
-}
-
-void MozQWidget::focusInEvent(QFocusEvent* aEvent)
+void MozQWidget::renderLater()
{
- mReceiver->OnFocusInEvent(aEvent);
-
- // The application requested the VKB during startup but did not manage
- // to open it, because there was no focused window yet so we do it now by
- // requesting the VKB without any timeout.
- if (gFailedOpenKeyboard)
- requestVKB(0, this);
-}
-
-#ifdef MOZ_ENABLE_QTMOBILITY
-void MozQWidget::orientationChanged()
-{
- if (!scene() || !scene()->views().size()) {
+ if (!isExposed() || eWindowType_child != mWindowType || !isVisible()) {
return;
}
- NS_ASSERTION(scene()->views().size() == 1, "Not exactly one view for our scene!");
- QTransform& transform = MozQOrientationSensorFilter::GetRotationTransform();
- QRect scrTrRect = transform.mapRect(scene()->views()[0]->rect());
+ if (!mUpdatePending) {
+ mUpdatePending = true;
+ QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest));
+ }
+}
- setTransformOriginPoint(scene()->views()[0]->size().width() / 2, scene()->views()[0]->size().height() / 2);
- scene()->views()[0]->setTransform(transform);
- int orientation = MozQOrientationSensorFilter::GetWindowRotationAngle();
- if (orientation == 0 || orientation == 180) {
- setPos(0,0);
- } else {
- setPos(-(scrTrRect.size().width() - scrTrRect.size().height()) / 2,
- (scrTrRect.size().width() - scrTrRect.size().height()) / 2);
- }
- resize(scrTrRect.size());
- scene()->setSceneRect(QRectF(QPointF(0, 0), scrTrRect.size()));
-#ifdef MOZ_X11
- Display* display = QX11Info::display();
- if (!display) {
+void MozQWidget::renderNow()
+{
+ if (!isExposed() || eWindowType_child != mWindowType || !isVisible()) {
return;
}
- Atom orientationAngleAtom = XInternAtom(display, "_MEEGOTOUCH_ORIENTATION_ANGLE", False);
- XChangeProperty(display, scene()->views()[0]->effectiveWinId(),
- orientationAngleAtom, XA_CARDINAL, 32,
- PropModeReplace, (unsigned char*)&orientation, 1);
-#endif
+ mReceiver->OnPaint();
}
-#endif
-void MozQWidget::focusOutEvent(QFocusEvent* aEvent)
+bool MozQWidget::event(QEvent* event)
{
- mReceiver->OnFocusOutEvent(aEvent);
- //OtherFocusReason most like means VKB was closed manual (done button)
- if (aEvent->reason() == Qt::OtherFocusReason && gKeyboardOpen) {
- hideVKB();
+ switch (event->type()) {
+ case QEvent::UpdateRequest:
+ mUpdatePending = false;
+ renderNow();
+ return true;
+ default:
+ return QWindow::event(event);
}
}
-void MozQWidget::hoverEnterEvent(QGraphicsSceneHoverEvent* aEvent)
+void MozQWidget::exposeEvent(QExposeEvent* event)
{
- mReceiver->OnEnterNotifyEvent(aEvent);
-}
+ Q_UNUSED(event);
+ if (!isExposed() || eWindowType_child != mWindowType || !isVisible()) {
+ return;
+ }
+ LOG(("MozQWidget::%s [%p] flags:%x\n", __FUNCTION__, (void *)this, flags()));
+ renderNow();
-void MozQWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent* aEvent)
-{
- mReceiver->OnLeaveNotifyEvent(aEvent);
}
-void MozQWidget::hoverMoveEvent(QGraphicsSceneHoverEvent* aEvent)
+void MozQWidget::resizeEvent(QResizeEvent* event)
{
- mReceiver->OnMotionNotifyEvent(aEvent->pos(), aEvent->modifiers());
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->resizeEvent(event);
+ QWindow::resizeEvent(event);
}
-void MozQWidget::keyPressEvent(QKeyEvent* aEvent)
+void MozQWidget::focusInEvent(QFocusEvent* event)
{
- mReceiver->OnKeyPressEvent(aEvent);
-}
-
-void MozQWidget::keyReleaseEvent(QKeyEvent* aEvent)
-{
- mReceiver->OnKeyReleaseEvent(aEvent);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->focusInEvent(event);
+ QWindow::focusInEvent(event);
}
-void MozQWidget::inputMethodEvent(QInputMethodEvent* aEvent)
+void MozQWidget::focusOutEvent(QFocusEvent* event)
{
- QString currentPreeditString = aEvent->preeditString();
- QString currentCommitString = aEvent->commitString();
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->focusOutEvent(event);
+ QWindow::focusOutEvent(event);
+}
- //first check for some controllkeys send as text...
- if (currentCommitString == " ") {
- sendPressReleaseKeyEvent(Qt::Key_Space, currentCommitString.unicode());
- } else if (currentCommitString == "\n") {
- sendPressReleaseKeyEvent(Qt::Key_Return, currentCommitString.unicode());
- } else if (currentCommitString.isEmpty()) {
- //if its no controllkey than check if current Commit is empty
- //if yes than we have some preedit text here
- if (currentPreeditString.length() == 1 && gLastPreeditString.isEmpty()) {
- //Preedit text can change its entire look'a'like
- //check if length of new compared to the old is 1,
- //means that its a new startup
- sendPressReleaseKeyEvent(0, currentPreeditString.unicode());
- } else if (currentPreeditString.startsWith(gLastPreeditString)) {
- //Length was not 1 or not a new startup
- //check if the current preedit starts with the last one,
- //if so: Add new letters (note: this can be more then one new letter)
- const QChar * text = currentPreeditString.unicode();
- for (int i = gLastPreeditString.length(); i < currentPreeditString.length(); i++) {
- sendPressReleaseKeyEvent(0, &text[i]);
- }
- } else {
- //last possible case, we had a PreeditString which was now completely changed.
- //first, check if just one letter was removed (normal Backspace case!)
- //if so: just send the backspace
- QString tempLastPre = gLastPreeditString;
- tempLastPre.truncate(gLastPreeditString.length()-1);
- if (currentPreeditString == tempLastPre) {
- sendPressReleaseKeyEvent(Qt::Key_Backspace);
- } else if (currentPreeditString != tempLastPre) {
- //more than one character changed, so just renew everything
- //delete all preedit
- for (int i = 0; i < gLastPreeditString.length(); i++) {
- sendPressReleaseKeyEvent(Qt::Key_Backspace);
- }
- //send new Preedit
- const QChar * text = currentPreeditString.unicode();
- for (int i = 0; i < currentPreeditString.length(); i++) {
- sendPressReleaseKeyEvent(0, &text[i]);
- }
- }
- }
- } else if (gLastPreeditString != currentCommitString) {
- //User commited something
- if (currentCommitString.length() == 1 && gLastPreeditString.isEmpty()) {
- //if commit string ist one and there is no Preedit String
- //case i.e. when no error correction is enabled in the system (default meego.com)
- sendPressReleaseKeyEvent(0, currentCommitString.unicode());
- } else {
- //There is a Preedit, first remove it
- for (int i = 0; i < gLastPreeditString.length(); i++) {
- sendPressReleaseKeyEvent(Qt::Key_Backspace);
- }
- //Now push commited String into
- const QChar * text = currentCommitString.unicode();
- for (int i = 0; i < currentCommitString.length(); i++) {
- sendPressReleaseKeyEvent(0, &text[i]);
- }
- }
- }
+void MozQWidget::hideEvent(QHideEvent* event)
+{
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->hideEvent(event);
+ QWindow::hideEvent(event);
+}
- //save preedit for next round.
- gLastPreeditString = currentPreeditString;
+void MozQWidget::keyPressEvent(QKeyEvent* event)
+{
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->keyPressEvent(event);
+ QWindow::keyPressEvent(event);
+}
- //pre edit is continues string of new chars pressed by the user.
- //if pre edit is changing rapidly without commit string first then user choose some overed text
- //if commitstring comes directly after, forget about it
- QGraphicsWidget::inputMethodEvent(aEvent);
+void MozQWidget::keyReleaseEvent(QKeyEvent* event)
+{
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->keyReleaseEvent(event);
+ QWindow::keyReleaseEvent(event);
}
-void MozQWidget::sendPressReleaseKeyEvent(int key,
- const QChar* letter,
- bool autorep,
- ushort count)
+void MozQWidget::mouseDoubleClickEvent(QMouseEvent* event)
{
- Qt::KeyboardModifiers modifiers = Qt::NoModifier;
- if (letter && letter->isUpper()) {
- modifiers = Qt::ShiftModifier;
- }
-
- if (letter) {
- // Handle as TextEvent
- mozilla::WidgetCompositionEvent start(true, NS_COMPOSITION_START,
- mReceiver);
- mReceiver->DispatchEvent(&start);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->mouseDoubleClickEvent(event);
+ QWindow::mouseDoubleClickEvent(event);
+}
- mozilla::WidgetTextEvent text(true, NS_TEXT_TEXT, mReceiver);
- QString commitString = QString(*letter);
- text.theText.Assign(commitString.utf16());
- mReceiver->DispatchEvent(&text);
-
- mozilla::WidgetCompositionEvent end(true, NS_COMPOSITION_END,
- mReceiver);
- mReceiver->DispatchEvent(&end);
- return;
- }
-
- QKeyEvent press(QEvent::KeyPress, key, modifiers, QString(), autorep, count);
- mReceiver->OnKeyPressEvent(&press);
- QKeyEvent release(QEvent::KeyRelease, key, modifiers, QString(), autorep, count);
- mReceiver->OnKeyReleaseEvent(&release);
+void MozQWidget::mouseMoveEvent(QMouseEvent* event)
+{
+ mReceiver->mouseMoveEvent(event);
+ QWindow::mouseMoveEvent(event);
}
-void MozQWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* aEvent)
+void MozQWidget::mousePressEvent(QMouseEvent* event)
{
- // Qt sends double click event, but not second press event.
- mReceiver->OnButtonPressEvent(aEvent);
- mReceiver->OnMouseDoubleClickEvent(aEvent);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->mousePressEvent(event);
+ QWindow::mousePressEvent(event);
}
-void MozQWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* aEvent)
-{
- mReceiver->OnMotionNotifyEvent(aEvent->pos(), aEvent->modifiers());
-}
-
-void MozQWidget::mousePressEvent(QGraphicsSceneMouseEvent* aEvent)
+void MozQWidget::mouseReleaseEvent(QMouseEvent* event)
{
- mReceiver->OnButtonPressEvent(aEvent);
-}
-
-void MozQWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent* aEvent)
-{
- mReceiver->OnButtonReleaseEvent(aEvent);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->mouseReleaseEvent(event);
+ QWindow::mouseReleaseEvent(event);
}
-bool MozQWidget::event ( QEvent * event )
+void MozQWidget::moveEvent(QMoveEvent* event)
{
- // check receiver, since due to deleteLater() call it's possible, that
- // events pass loop after receiver's destroy and while widget is still alive
- if (!mReceiver)
- return QGraphicsWidget::event(event);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->moveEvent(event);
+ QWindow::moveEvent(event);
+}
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0))
- switch (event->type())
- {
- case QEvent::TouchBegin:
- case QEvent::TouchEnd:
- case QEvent::TouchUpdate:
- {
- // Do not send this event to other handlers, this is needed
- // to be able to receive the gesture events
- bool handled = false;
- mReceiver->OnTouchEvent(static_cast<QTouchEvent *>(event),handled);
- return handled;
- }
- case (QEvent::Gesture):
- {
- bool handled = false;
- mReceiver->OnGestureEvent(static_cast<QGestureEvent*>(event),handled);
- return handled;
- }
- default:
- break;
- }
-#endif
- return QGraphicsWidget::event(event);
+void MozQWidget::showEvent(QShowEvent* event)
+{
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->showEvent(event);
+ QWindow::showEvent(event);
}
-void MozQWidget::wheelEvent(QGraphicsSceneWheelEvent* aEvent)
+void MozQWidget::wheelEvent(QWheelEvent* event)
{
- mReceiver->OnScrollEvent(aEvent);
-}
-
-void MozQWidget::closeEvent(QCloseEvent* aEvent)
-{
- mReceiver->OnCloseEvent(aEvent);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ mReceiver->wheelEvent(event);
+ QWindow::wheelEvent(event);
}
-void MozQWidget::hideEvent(QHideEvent* aEvent)
+void MozQWidget::tabletEvent(QTabletEvent* event)
{
- if (mReceiver) {
- mReceiver->hideEvent(aEvent);
- }
- QGraphicsWidget::hideEvent(aEvent);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ QWindow::tabletEvent(event);
}
-void MozQWidget::showEvent(QShowEvent* aEvent)
+void MozQWidget::touchEvent(QTouchEvent* event)
{
- if (mReceiver) {
- mReceiver->showEvent(aEvent);
- }
- QGraphicsWidget::showEvent(aEvent);
+ LOG(("MozQWidget::%s [%p]\n", __FUNCTION__, (void *)this));
+ QWindow::touchEvent(event);
}
void MozQWidget::SetCursor(nsCursor aCursor)
{
Qt::CursorShape cursor = Qt::ArrowCursor;
switch(aCursor) {
case eCursor_standard:
cursor = Qt::ArrowCursor;
@@ -445,180 +224,8 @@ void MozQWidget::SetCursor(nsCursor aCur
case eCursor_zoom_out:
default:
break;
}
setCursor(cursor);
}
-
-void MozQWidget::SetCursor(const QPixmap& aCursor, int aHotX, int aHotY)
-{
- QCursor bitmapCursor(aCursor, aHotX, aHotY);
- setCursor(bitmapCursor);
-}
-
-void MozQWidget::setModal(bool modal)
-{
-#if QT_VERSION >= 0x040600
- setPanelModality(modal ? QGraphicsItem::SceneModal : QGraphicsItem::NonModal);
-#else
- LOG(("Modal QGraphicsWidgets not supported in Qt < 4.6\n"));
-#endif
-}
-
-QVariant MozQWidget::inputMethodQuery(Qt::InputMethodQuery aQuery) const
-{
- // Additional MeeGo Touch queries, which do not depend on actually
- // having a focused input field.
- switch ((int) aQuery) {
- case 10001: // VisualizationPriorityQuery.
- // Tells if input method widget wants to have high priority
- // for visualization. Input methods should honor this and stay
- // out of widgets space.
- // Return false, eg. the input method can overlap QGraphicsWKView.
- return QVariant(false);
- case 10003: // ImCorrectionEnabledQuery.
- // Explicit correction enabling for text entries.
- return QVariant(false);
- case 10004: // ImModeQuery.
- // Retrieval mode: normal (0), direct [minics hardware keyboard] (1) or proxy (2)
- return QVariant::fromValue(0);
- case 10006: // InputMethodToolbarQuery.
- // Custom toolbar file name for text entry.
- return QVariant();
- }
-
- // Standard Qt queries dependent on having a focused web text input.
- switch (aQuery) {
- case Qt::ImFont:
- return QVariant(QFont());
- case Qt::ImMaximumTextLength:
- return QVariant(); // Means no limit.
- }
-
- // Additional MeeGo Touch queries dependent on having a focused web text input
- switch ((int) aQuery) {
- case 10002: // PreeditRectangleQuery.
- // Retrieve bounding rectangle for current preedit text.
- return QVariant(QRect());
- }
-
- return QVariant();
-}
-
-/**
- Request the VKB and starts a timer with the given timeout in milliseconds.
- If the request is not canceled when the timer runs out, the VKB is actually
- shown.
-*/
-void MozQWidget::requestVKB(int aTimeout, QObject* aWidget)
-{
- if (!gPendingVKBOpen) {
- gPendingVKBOpen = true;
-
- if (aTimeout == 0 || !aWidget) {
- showVKB();
- } else {
- QTimer::singleShot(aTimeout, aWidget, SLOT(showVKB()));
- }
- }
-}
-
-void MozQWidget::showVKB()
-{
- // skip showing of keyboard if not pending
- if (!gPendingVKBOpen) {
- return;
- }
-
- gPendingVKBOpen = false;
-
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)) && (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
- QWidget* focusWidget = qApp->focusWidget();
-
- if (focusWidget) {
- QInputContext *inputContext = qApp->inputContext();
- if (!inputContext) {
- NS_WARNING("Requesting SIP: but no input context");
- return;
- }
-
- QEvent request(QEvent::RequestSoftwareInputPanel);
- inputContext->filterEvent(&request);
- focusWidget->setAttribute(Qt::WA_InputMethodEnabled, true);
- inputContext->setFocusWidget(focusWidget);
- gKeyboardOpen = true;
- gFailedOpenKeyboard = false;
- }
- else
- {
- // No focused widget yet, so we have to open the VKB later on.
- gFailedOpenKeyboard = true;
- }
-#else
- LOG(("VKB not supported in Qt < 4.6\n"));
-#endif
-}
-
-void MozQWidget::hideVKB()
-{
- if (gPendingVKBOpen) {
- // do not really open
- gPendingVKBOpen = false;
- }
-
- if (!gKeyboardOpen) {
- return;
- }
-
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)) && (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
- QInputContext *inputContext = qApp->inputContext();
- if (!inputContext) {
- NS_WARNING("Closing SIP: but no input context");
- return;
- }
-
- QEvent request(QEvent::CloseSoftwareInputPanel);
- inputContext->filterEvent(&request);
- inputContext->reset();
- gKeyboardOpen = false;
-#else
- LOG(("VKB not supported in Qt < 4.6\n"));
-#endif
-}
-
-bool MozQWidget::isVKBOpen()
-{
- return gKeyboardOpen;
-}
-
-void
-MozQWidget::NotifyVKB(const QRect& rect)
-{
- QRegion region(scene()->views()[0]->rect());
- region -= rect;
- QRectF bounds = mapRectFromScene(region.boundingRect());
- nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
- if (observerService) {
- QString rect = QString("{\"left\": %1, \"top\": %2, \"right\": %3, \"bottom\": %4}")
- .arg(bounds.x()).arg(bounds.y()).arg(bounds.width()).arg(bounds.height());
- observerService->NotifyObservers(nullptr, "softkb-change", rect.utf16());
- }
-}
-
-void MozQWidget::SwitchToForeground()
-{
- nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
- if (!os)
- return;
- os->NotifyObservers(nullptr, "application-foreground", nullptr);
-}
-
-void MozQWidget::SwitchToBackground()
-{
- nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
- if (!os)
- return;
- os->NotifyObservers(nullptr, "application-background", nullptr);
-}
-
--- a/widget/qt/mozqwidget.h
+++ b/widget/qt/mozqwidget.h
@@ -2,84 +2,70 @@
/* vim: set ts=4 et sw=4 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef MOZQWIDGET_H
#define MOZQWIDGET_H
-#include "moziqwidget.h"
#include "nsIWidget.h"
-class MozQWidget : public IMozQWidget
+#include <QtGui/QWindow>
+
+QT_BEGIN_NAMESPACE
+class QPainter;
+class QExposeEvent;
+class QResizeEvent;
+QT_END_NAMESPACE
+
+namespace mozilla {
+namespace widget {
+
+class nsWindow;
+
+class MozQWidget : public QWindow
{
Q_OBJECT
public:
- MozQWidget(nsWindow* aReceiver, QGraphicsItem *aParent);
-
+ explicit MozQWidget(nsWindow* aReceiver, QWindow* aParent = 0);
~MozQWidget();
- /**
- * Mozilla helper.
- */
- virtual void setModal(bool);
- virtual void SetCursor(nsCursor aCursor);
- virtual void dropReceiver() { mReceiver = 0x0; };
- virtual nsWindow* getReceiver() { return mReceiver; };
-
- virtual void activate();
- virtual void deactivate();
+ virtual void render(QPainter* painter);
- /**
- * VirtualKeyboardIntegration
- */
- static void requestVKB(int aTimeout = 0, QObject* aWidget = 0);
- static void hideVKB();
- virtual bool isVKBOpen();
-
- virtual void NotifyVKB(const QRect& rect);
- virtual void SwitchToForeground();
- virtual void SwitchToBackground();
+ virtual nsWindow* getReceiver() { return mReceiver; };
+ virtual void dropReceiver() { mReceiver = nullptr; };
+ virtual void SetCursor(nsCursor aCursor);
public Q_SLOTS:
- static void showVKB();
-
-#ifdef MOZ_ENABLE_QTMOBILITY
- void orientationChanged();
-#endif
+ void renderLater();
+ void renderNow();
protected:
- virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent* aEvent);
- virtual void dragEnterEvent(QGraphicsSceneDragDropEvent* aEvent);
- virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent* aEvent);
- virtual void dragMoveEvent(QGraphicsSceneDragDropEvent* aEvent);
- virtual void dropEvent(QGraphicsSceneDragDropEvent* aEvent);
- virtual void focusInEvent(QFocusEvent* aEvent);
- virtual void focusOutEvent(QFocusEvent* aEvent);
- virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* aEvent);
- virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* aEvent);
- virtual void hoverMoveEvent(QGraphicsSceneHoverEvent* aEvent);
- virtual void keyPressEvent(QKeyEvent* aEvent);
- virtual void keyReleaseEvent(QKeyEvent* aEvent);
- virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* aEvent);
- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* aEvent);
- virtual void mousePressEvent(QGraphicsSceneMouseEvent* aEvent);
- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent* aEvent);
- virtual void inputMethodEvent(QInputMethodEvent* aEvent);
-
- virtual void wheelEvent(QGraphicsSceneWheelEvent* aEvent);
- virtual void paint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption, QWidget* aWidget = 0);
- virtual void resizeEvent(QGraphicsSceneResizeEvent* aEvent);
- virtual void closeEvent(QCloseEvent* aEvent);
- virtual void hideEvent(QHideEvent* aEvent);
- virtual void showEvent(QShowEvent* aEvent);
- virtual bool event(QEvent* aEvent);
- virtual QVariant inputMethodQuery(Qt::InputMethodQuery aQuery) const;
-
- void SetCursor(const QPixmap& aPixmap, int, int);
+ virtual bool event(QEvent* event);
+ virtual void exposeEvent(QExposeEvent* event);
+ virtual void focusInEvent(QFocusEvent* event);
+ virtual void focusOutEvent(QFocusEvent* event);
+ virtual void hideEvent(QHideEvent* event);
+ virtual void keyPressEvent(QKeyEvent* event);
+ virtual void keyReleaseEvent(QKeyEvent* event);
+ virtual void mouseDoubleClickEvent(QMouseEvent* event);
+ virtual void mouseMoveEvent(QMouseEvent* event);
+ virtual void mousePressEvent(QMouseEvent* event);
+ virtual void mouseReleaseEvent(QMouseEvent* event);
+ virtual void moveEvent(QMoveEvent* event);
+ virtual void resizeEvent(QResizeEvent* event);
+ virtual void showEvent(QShowEvent* event);
+ virtual void tabletEvent(QTabletEvent* event);
+ virtual void touchEvent(QTouchEvent* event);
+ virtual void wheelEvent(QWheelEvent* event);
private:
- void sendPressReleaseKeyEvent(int key, const QChar* letter = 0, bool autorep = false, ushort count = 1);
- nsWindow *mReceiver;
+ nsWindow* mReceiver;
+ bool mUpdatePending;
+ nsWindowType mWindowType;
};
-#endif
+} // namespace widget
+} // namespace mozilla
+
+#endif // MOZQWIDGET_H
+
--- a/widget/qt/nsAppShell.cpp
+++ b/widget/qt/nsAppShell.cpp
@@ -1,17 +1,17 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim:expandtab:shiftwidth=4:tabstop=4:
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsAppShell.h"
-#include <qapplication.h>
+#include <QGuiApplication>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <qabstracteventdispatcher.h>
#include <qthread.h>
#include "prenv.h"
@@ -44,21 +44,17 @@ nsAppShell::Init()
gWidgetLog = PR_NewLogModule("Widget");
if (!gWidgetFocusLog)
gWidgetFocusLog = PR_NewLogModule("WidgetFocus");
if (!gWidgetIMLog)
gWidgetIMLog = PR_NewLogModule("WidgetIM");
if (!gWidgetDrawLog)
gWidgetDrawLog = PR_NewLogModule("WidgetDraw");
#endif
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
sPokeEvent = QEvent::registerEventType();
-#else
- sPokeEvent = QEvent::User+5000;
-#endif
nsQAppInstance::AddRef();
return nsBaseAppShell::Init();
}
void
nsAppShell::ScheduleNativeEventCallback()
--- a/widget/qt/nsBidiKeyboard.cpp
+++ b/widget/qt/nsBidiKeyboard.cpp
@@ -1,17 +1,17 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim:expandtab:shiftwidth=4:tabstop=4:
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <Qt>
-#include <QApplication>
+#include <QGuiApplication>
#include "nsBidiKeyboard.h"
NS_IMPL_ISUPPORTS1(nsBidiKeyboard, nsIBidiKeyboard)
nsBidiKeyboard::nsBidiKeyboard() : nsIBidiKeyboard()
{
Reset();
@@ -25,27 +25,23 @@ NS_IMETHODIMP nsBidiKeyboard::Reset()
{
return NS_OK;
}
NS_IMETHODIMP nsBidiKeyboard::IsLangRTL(bool *aIsRTL)
{
*aIsRTL = false;
-#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
- Qt::LayoutDirection layoutDir = QApplication::keyboardInputDirection();
-#else
QInputMethod* input = qApp->inputMethod();
Qt::LayoutDirection layoutDir = input ? input->inputDirection() : Qt::LeftToRight;
-#endif
if (layoutDir == Qt::RightToLeft) {
*aIsRTL = true;
}
-
+
return NS_OK;
}
NS_IMETHODIMP nsBidiKeyboard::GetHaveBidiKeyboards(bool* aResult)
{
// not implemented yet
return NS_ERROR_NOT_IMPLEMENTED;
}
--- a/widget/qt/nsClipboard.cpp
+++ b/widget/qt/nsClipboard.cpp
@@ -1,13 +1,13 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include <QApplication>
+#include <QGuiApplication>
#include <QMimeData>
#include <QString>
#include <QStringList>
#include <QByteArray>
#include <QImage>
#include <QImageWriter>
#include <QBuffer>
@@ -85,17 +85,17 @@ nsClipboard::SetNativeClipboardData( nsI
nsresult rv = aTransferable->FlavorsTransferableCanExport( getter_AddRefs(flavorList) );
if (NS_FAILED(rv))
{
NS_WARNING("nsClipboard::SetNativeClipboardData(): no FlavorsTransferable !");
return NS_ERROR_FAILURE;
}
- QClipboard *cb = QApplication::clipboard();
+ QClipboard *cb = QGuiApplication::clipboard();
QMimeData *mimeData = new QMimeData;
uint32_t flavorCount = 0;
flavorList->Count(&flavorCount);
bool imageAdded = false;
for (uint32_t i = 0; i < flavorCount; ++i)
{
@@ -120,34 +120,34 @@ nsClipboard::SetNativeClipboardData( nsI
rv = aTransferable->GetTransferData(flavorStr,getter_AddRefs(clip),&len);
nsCOMPtr<nsISupportsString> wideString;
wideString = do_QueryInterface(clip);
if (!wideString || NS_FAILED(rv))
continue;
nsAutoString utf16string;
wideString->GetData(utf16string);
- QString str = QString::fromUtf16(utf16string.get());
+ QString str = QString::fromUtf16((const ushort*)utf16string.get());
// Add text to the mimeData
mimeData->setText(str);
}
// html?
else if (!strcmp(flavorStr.get(), kHTMLMime))
{
rv = aTransferable->GetTransferData(flavorStr,getter_AddRefs(clip),&len);
nsCOMPtr<nsISupportsString> wideString;
wideString = do_QueryInterface(clip);
if (!wideString || NS_FAILED(rv))
continue;
nsAutoString utf16string;
wideString->GetData(utf16string);
- QString str = QString::fromUtf16(utf16string.get());
+ QString str = QString::fromUtf16((const ushort*)utf16string.get());
// Add html to the mimeData
mimeData->setHtml(str);
}
// image?
else if (!imageAdded // image is added only once to the clipboard
&& (!strcmp(flavorStr.get(), kNativeImageMime)
@@ -248,17 +248,17 @@ nsClipboard::GetNativeClipboardData(nsIT
getter_AddRefs(flavorList));
if (NS_FAILED(errCode))
{
NS_WARNING("nsClipboard::GetNativeClipboardData(): no FlavorsTransferable!");
return NS_ERROR_FAILURE;
}
- QClipboard *cb = QApplication::clipboard();
+ QClipboard *cb = QGuiApplication::clipboard();
const QMimeData *mimeData = cb->mimeData(clipboardMode);
// Walk through flavors and see which flavor matches the one being pasted
uint32_t flavorCount;
flavorList->Count(&flavorCount);
nsAutoCString foundFlavor;
for (uint32_t i = 0; i < flavorCount; ++i)
@@ -400,17 +400,17 @@ NS_IMETHODIMP
nsClipboard::HasDataMatchingFlavors(const char** aFlavorList, uint32_t aLength,
int32_t aWhichClipboard, bool *_retval)
{
*_retval = false;
if (aWhichClipboard != kGlobalClipboard)
return NS_OK;
// Which kind of data in the clipboard
- QClipboard *cb = QApplication::clipboard();
+ QClipboard *cb = QGuiApplication::clipboard();
const QMimeData *mimeData = cb->mimeData();
const char *flavor=nullptr;
QStringList formats = mimeData->formats();
for (uint32_t i = 0; i < aLength; ++i)
{
flavor = aFlavorList[i];
if (flavor)
{
@@ -539,17 +539,17 @@ nsClipboard::EmptyClipboard(int32_t aWhi
return NS_OK;
}
NS_IMETHODIMP
nsClipboard::SupportsSelectionClipboard(bool *_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
- QClipboard *cb = QApplication::clipboard();
+ QClipboard *cb = QGuiApplication::clipboard();
if (cb->supportsSelection())
{
*_retval = true; // we support the selection clipboard
}
else
{
*_retval = false;
}
deleted file mode 100644
--- a/widget/qt/nsCommonWidget.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim:expandtab:shiftwidth=4:tabstop=4:
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsCommonWidget.h"
-#include "nsQtKeyUtils.h"
-
deleted file mode 100644
--- a/widget/qt/nsCommonWidget.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim:expandtab:shiftwidth=4:tabstop=4:
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef __nsCommonWidget_h__
-#define __nsCommonWidget_h__
-
-
-
-class nsCommonWidget : public nsBaseWidget {
-public:
- nsCommonWidget();
- virtual ~nsCommonWidget();
-
-
-protected:
-};
-
-#endif /* __nsCommonWidget_h__ */
deleted file mode 100644
--- a/widget/qt/nsDragService.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim:expandtab:shiftwidth=4:tabstop=4:
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "qmimedata.h"
-#include "qwidget.h"
-#include "qapplication.h"
-#include "qthread.h"
-
-#include "nsDragService.h"
-#include "nsISupportsPrimitives.h"
-#include "nsXPIDLString.h"
-#include "nsIDOMMouseEvent.h"
-
-NS_IMPL_ADDREF_INHERITED(nsDragService, nsBaseDragService)
-NS_IMPL_RELEASE_INHERITED(nsDragService, nsBaseDragService)
-NS_IMPL_QUERY_INTERFACE2(nsDragService, nsIDragService, nsIDragSession )
-
-nsDragService::nsDragService() : mDrag(nullptr), mHiddenWidget(nullptr)
-{
-}
-
-nsDragService::~nsDragService()
-{
- /* destructor code */
- delete mHiddenWidget;
-}
-
-NS_IMETHODIMP
-nsDragService::SetDropActionType( uint32_t aActionType )
-{
- mDropAction = Qt::IgnoreAction;
-
- if (aActionType & DRAGDROP_ACTION_COPY)
- {
- mDropAction |= Qt::CopyAction;
- }
- if (aActionType & DRAGDROP_ACTION_MOVE)
- {
- mDropAction |= Qt::MoveAction;
- }
- if (aActionType & DRAGDROP_ACTION_LINK)
- {
- mDropAction |= Qt::LinkAction;
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsDragService::SetupDragSession(
- nsISupportsArray *aTransferables,
- uint32_t aActionType)
-{
- uint32_t itemCount = 0;
- aTransferables->Count(&itemCount);
- if (0 == itemCount)
- {
- NS_WARNING("No items to drag?");
- return NS_ERROR_FAILURE;
- }
-
- if (1 != itemCount)
- {
- NS_WARNING("Dragging more than one item, cannot do (yet?)");
- return NS_ERROR_NOT_IMPLEMENTED;
- }
-
- SetDropActionType(aActionType);
-
- QMimeData *mimeData = new QMimeData;
-
- nsCOMPtr<nsISupports> genericItem;
- aTransferables->GetElementAt(0, getter_AddRefs(genericItem));
- nsCOMPtr<nsITransferable> transferable(do_QueryInterface(genericItem));
-
- if (transferable)
- {
- nsCOMPtr <nsISupportsArray> flavorList;
- transferable->FlavorsTransferableCanExport(getter_AddRefs(flavorList));
-
- if (flavorList)
- {
- uint32_t flavorCount;
- flavorList->Count( &flavorCount );
-
- for (uint32_t flavor=0; flavor < flavorCount; flavor++)
- {
- nsCOMPtr<nsISupports> genericWrapper;
- flavorList->GetElementAt(flavor, getter_AddRefs(genericWrapper));
- nsCOMPtr<nsISupportsCString> currentFlavor;
- currentFlavor = do_QueryInterface(genericWrapper);
-
- if (currentFlavor)
- {
- nsCOMPtr<nsISupports> data;
- uint32_t dataLen = 0;
- nsXPIDLCString flavorStr;
- currentFlavor->ToString(getter_Copies(flavorStr));
-
- // Is it some flavor we think we could support?
- if (!strcmp(kURLMime, flavorStr.get())
- || !strcmp(kURLDataMime, flavorStr.get())
- || !strcmp(kURLDescriptionMime, flavorStr.get())
- || !strcmp(kHTMLMime, flavorStr.get())
- || !strcmp(kUnicodeMime, flavorStr.get())
- )
- {
- transferable->GetTransferData(flavorStr,getter_AddRefs(data),&dataLen);
-
- nsCOMPtr<nsISupportsString> wideString;
- wideString = do_QueryInterface(data);
- if (!wideString)
- {
- return NS_ERROR_FAILURE;
- }
-
- nsAutoString utf16string;
- wideString->GetData(utf16string);
- QByteArray ba((const char*) utf16string.get(), dataLen);
-
- mimeData->setData(flavorStr.get(), ba);
- }
- }
- }
- }
- }
-
- if (qApp->thread() != QThread::currentThread()) {
- NS_WARNING("Cannot initialize drag session in non main thread");
- return NS_OK;
- }
-
- if (!mHiddenWidget) {
- mHiddenWidget = new QWidget();
- }
- mDrag = new QDrag( mHiddenWidget ); // TODO: Better drag source here?
- mDrag->setMimeData(mimeData);
-
- // mDrag and mimeData SHOULD NOT be destroyed. They are destroyed by QT.
-
- return NS_OK;
-}
-
-/* void invokeDragSession (in nsIDOMNode aDOMNode, in nsISupportsArray aTransferables, in nsIScriptableRegion aRegion, in unsigned long aActionType); */
-NS_IMETHODIMP
-nsDragService::InvokeDragSession(
- nsIDOMNode *aDOMNode,
- nsISupportsArray *aTransferables,
- nsIScriptableRegion *aRegion,
- uint32_t aActionType)
-{
- nsBaseDragService::InvokeDragSession(
- aDOMNode,
- aTransferables,
- aRegion,
- aActionType);
-
- SetupDragSession( aTransferables, aActionType);
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsDragService::ExecuteDrag()
-{
- if (qApp->thread() == QThread::currentThread()) {
- mDrag->exec(mDropAction);
- }
-
- return NS_OK;
-}
-
-/* void invokeDragSessionWithImage ( nsIDOMNode DOMNode , nsISupportsArray transferableArray , nsIScriptableRegion region , uint32_t actionType , nsIDOMNode image , int32_t imageX , int32_t imageY , nsIDOMMouseEvent dragEvent ); */
-NS_IMETHODIMP
-nsDragService::InvokeDragSessionWithImage(
- nsIDOMNode *aDOMNode,
- nsISupportsArray*aTransferables,
- nsIScriptableRegion* aRegion,
- uint32_t aActionType,
- nsIDOMNode* aImage,
- int32_t aImageX,
- int32_t aImageY,
- nsIDOMDragEvent* aDragEvent,
- nsIDOMDataTransfer* aDataTransfer)
-{
- nsBaseDragService::InvokeDragSessionWithImage(
- aDOMNode, aTransferables,
- aRegion, aActionType,
- aImage,
- aImageX, aImageY,
- aDragEvent,
- aDataTransfer);
-
- SetupDragSession( aTransferables, aActionType);
-
- // Setup Image, and other stuff
- if (aImage)
- {
- // Use the custom image
- // (aImageX,aImageY) specifies the offset "within the image where
- // the cursor would be positioned"
-
- // So, convert the aImage to QPixmap and X and Y to q QPoint
- // and then:
- // mDrag->setPixmap( pixmap ) or mDrag->setDragCursor( pixmap );
- // mDrad->setHotSpot( point );
- // TODO: Not implemented yet as this cannot be currently tested
- NS_WARNING("Support for drag image not implemented");
- }
-
- return ExecuteDrag();
-}
-
-NS_IMETHODIMP
-nsDragService::InvokeDragSessionWithSelection(nsISelection* aSelection,
- nsISupportsArray* aTransferableArray,
- uint32_t aActionType,
- nsIDOMDragEvent* aDragEvent,
- nsIDOMDataTransfer* aDataTransfer)
-{
- nsBaseDragService::InvokeDragSessionWithSelection(
- aSelection,
- aTransferableArray,
- aActionType,
- aDragEvent,
- aDataTransfer);
-
- SetupDragSession( aTransferableArray, aActionType);
-
- // Setup selection related properties
- // There is however nothing that needs to be set
-
- return ExecuteDrag();
-}
-
-/* nsIDragSession getCurrentSession (); */
-NS_IMETHODIMP
-nsDragService::GetCurrentSession(nsIDragSession **_retval)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* void startDragSession (); */
-NS_IMETHODIMP
-nsDragService::StartDragSession()
-{
- return nsBaseDragService::StartDragSession();
-}
-
-/* void endDragSession (in bool aDoneDrag); */
-NS_IMETHODIMP
-nsDragService::EndDragSession(bool aDoneDrag)
-{
- return nsBaseDragService::EndDragSession(aDoneDrag);
-}
-
-/* void fireDragEventAtSource (in unsigned long aMsg); */
-NS_IMETHODIMP
-nsDragService::FireDragEventAtSource(uint32_t aMsg)
-{
- return nsBaseDragService::FireDragEventAtSource(aMsg);
-}
-
-/* TODO: What is this? */
-NS_IMETHODIMP
-nsDragService::Suppress()
-{
- return nsBaseDragService::Suppress();
-}
-
-/* TODO: What is this? */
-NS_IMETHODIMP
-nsDragService::Unsuppress()
-{
- return nsBaseDragService::Unsuppress();
-}
-
-NS_IMETHODIMP
-nsDragService::DragMoved(int32_t aX, int32_t aY)
-{
- return nsBaseDragService::DragMoved(aX, aY);
-}
deleted file mode 100644
--- a/widget/qt/nsDragService.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef nsDragService_h__
-#define nsDragService_h__
-
-#include <qdrag.h>
-
-#include "nsBaseDragService.h"
-
-/* Header file */
-class nsDragService : public nsBaseDragService
-{
-public:
- NS_DECL_ISUPPORTS
- NS_DECL_NSIDRAGSERVICE
-
- nsDragService();
-
-private:
- ~nsDragService();
-
-protected:
- /* additional members */
- NS_IMETHODIMP SetupDragSession(nsISupportsArray *aTransferables, uint32_t aActionType);
- NS_IMETHODIMP SetDropActionType(uint32_t aActionType);
- NS_IMETHODIMP ExecuteDrag();
-
- QDrag *mDrag;
- Qt::DropActions mDropAction;
- QWidget *mHiddenWidget;
-};
-
-#endif // nsDragService_h__
deleted file mode 100644
--- a/widget/qt/nsFilePicker.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <QStringList>
-#include <QGraphicsWidget>
-#include <QGraphicsScene>
-#include <QGraphicsView>
-#include <QTemporaryFile>
-
-#ifdef MOZ_ENABLE_CONTENTMANAGER
-#include "nsMFilePicker.h"
-#define MozFileDialog MeegoFileDialog
-#else
-#include <QFileDialog>
-#define MozFileDialog QFileDialog
-#endif
-
-
-#include "nsFilePicker.h"
-#include "nsNetUtil.h"
-#include "nsIWidget.h"
-#include "prlog.h"
-
-#ifdef PR_LOGGING
-static PRLogModuleInfo* sFilePickerLog = nullptr;
-#endif
-
-#include "nsDirectoryServiceDefs.h"
-
-//-----------------------------
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(nsFilePicker, nsIFilePicker)
-
-nsFilePicker::nsFilePicker()
-{
-#ifdef PR_LOGGING
- if (!sFilePickerLog)
- sFilePickerLog = PR_NewLogModule("nsQtFilePicker");
-#endif
-}
-
-nsFilePicker::~nsFilePicker()
-{
-}
-
-NS_IMETHODIMP
-nsFilePicker::Init(nsIDOMWindow* parent, const nsAString& title, int16_t mode)
-{
- return nsBaseFilePicker::Init(parent, title, mode);
-}
-
-/* void appendFilters (in long filterMask); */
-NS_IMETHODIMP
-nsFilePicker::AppendFilters(int32_t filterMask)
-{
- return nsBaseFilePicker::AppendFilters(filterMask);
-}
-
-/* void appendFilter (in AString title, in AString filter); */
-NS_IMETHODIMP
-nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter)
-{
- if (aFilter.Equals(NS_LITERAL_STRING("..apps"))) {
- // No platform specific thing we can do here, really....
- return NS_OK;
- }
-
- nsAutoCString filter, name;
- CopyUTF16toUTF8(aFilter, filter);
- CopyUTF16toUTF8(aTitle, name);
-
- mFilters.AppendElement(filter);
- mFilterNames.AppendElement(name);
-
- return NS_OK;
-}
-
-/* attribute AString defaultString; */
-NS_IMETHODIMP
-nsFilePicker::GetDefaultString(nsAString& aDefaultString)
-{
- return NS_ERROR_FAILURE;
-}
-
-NS_IMETHODIMP
-nsFilePicker::SetDefaultString(const nsAString& aDefaultString)
-{
- mDefault = aDefaultString;
-
- return NS_OK;
-}
-
-/* attribute AString defaultExtension; */
-NS_IMETHODIMP
-nsFilePicker::GetDefaultExtension(nsAString& aDefaultExtension)
-{
- aDefaultExtension = mDefaultExtension;
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsFilePicker::SetDefaultExtension(const nsAString& aDefaultExtension)
-{
- mDefaultExtension = aDefaultExtension;
-
- return NS_OK;
-}
-
-/* attribute long filterIndex; */
-NS_IMETHODIMP
-nsFilePicker::GetFilterIndex(int32_t* aFilterIndex)
-{
- *aFilterIndex = mSelectedType;
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsFilePicker::SetFilterIndex(int32_t aFilterIndex)
-{
- mSelectedType = aFilterIndex;
-
- return NS_OK;
-}
-
-/* readonly attribute nsIFile file; */
-NS_IMETHODIMP
-nsFilePicker::GetFile(nsIFile* *aFile)
-{
- NS_ENSURE_ARG_POINTER(aFile);
-
- *aFile = nullptr;
- if (mFile.IsEmpty()) {
- return NS_OK;
- }
-
- nsCOMPtr<nsIFile> file(do_CreateInstance("@mozilla.org/file/local;1"));
- NS_ENSURE_TRUE(file, NS_ERROR_FAILURE);
-
- file->InitWithNativePath(mFile);
-
- NS_ADDREF(*aFile = file);
-
- return NS_OK;
-}
-
-/* readonly attribute nsIFileURL fileURL; */
-NS_IMETHODIMP
-nsFilePicker::GetFileURL(nsIURI* *aFileURL)
-{
- nsCOMPtr<nsIFile> file;
- GetFile(getter_AddRefs(file));
-
- nsCOMPtr<nsIURI> uri;
- NS_NewFileURI(getter_AddRefs(uri), file);
- NS_ENSURE_TRUE(uri, NS_ERROR_FAILURE);
-
- return CallQueryInterface(uri, aFileURL);
-}
-
-/* readonly attribute nsISimpleEnumerator files; */
-NS_IMETHODIMP
-nsFilePicker::GetFiles(nsISimpleEnumerator* *aFiles)
-{
- NS_ENSURE_ARG_POINTER(aFiles);
-
- if (mMode == nsIFilePicker::modeOpenMultiple) {
- return NS_NewArrayEnumerator(aFiles, mFiles);
- }
-
- return NS_ERROR_FAILURE;
-}
-
-/* short show (); */
-NS_IMETHODIMP
-nsFilePicker::Show(int16_t* aReturn)
-{
- nsAutoCString directory;
- if (mDisplayDirectory) {
- mDisplayDirectory->GetNativePath(directory);
- }
-
- QStringList filters;
- uint32_t count = mFilters.Length();
- for (uint32_t i = 0; i < count; ++i) {
- filters.append(mFilters[i].get());
- }
-
- QGraphicsWidget* parentWidget = 0;
- if (mParent) {
- parentWidget = static_cast<QGraphicsWidget*>
- (mParent->GetNativeData(NS_NATIVE_WIDGET));
- }
-
- QWidget* parentQWidget = 0;
- if (parentWidget && parentWidget->scene()) {
- if (parentWidget->scene()->views().size()>0) {
- parentQWidget = parentWidget->scene()->views()[0];
- }
- }
-
- QStringList files;
- QString selected;
-
- switch (mMode) {
- case nsIFilePicker::modeOpen:
- selected = MozFileDialog::getOpenFileName(parentQWidget, mCaption,
- directory.get(), filters.join(";"));
- if (selected.isNull()) {
- *aReturn = nsIFilePicker::returnCancel;
- return NS_OK;
- }
- break;
- case nsIFilePicker::modeOpenMultiple:
- files = MozFileDialog::getOpenFileNames(parentQWidget, mCaption,
- directory.get(), filters.join(";"));
- if (files.empty()) {
- *aReturn = nsIFilePicker::returnCancel;
- return NS_OK;
- }
- selected = files[0];
- break;
- case nsIFilePicker::modeSave:
- {
- nsCOMPtr<nsIFile> targetFile;
- NS_GetSpecialDirectory(NS_UNIX_XDG_DOCUMENTS_DIR,
- getter_AddRefs(targetFile));
- if (!targetFile) {
- // failed to get the XDG directory, using $HOME for now
- NS_GetSpecialDirectory(NS_UNIX_HOME_DIR,
- getter_AddRefs(targetFile));
- }
-
- if (targetFile) {
- targetFile->Append(mDefault);
- nsString targetPath;
- targetFile->GetPath(targetPath);
-
- bool exists = false;
- targetFile->Exists(&exists);
- if (exists) {
- // file exists already create temporary filename
- QTemporaryFile temp(QString::fromUtf16(targetPath.get()));
- temp.open();
- selected = temp.fileName();
- temp.close();
- } else {
- selected = QString::fromUtf16(targetPath.get());
- }
- }
- }
- break;
- case nsIFilePicker::modeGetFolder:
- selected = MozFileDialog::getExistingDirectory(parentQWidget, mCaption,
- directory.get());
- if (selected.isNull()) {
- *aReturn = nsIFilePicker::returnCancel;
- return NS_OK;
- }
- break;
- default:
- break;
- }
-
- if (!selected.isEmpty()) {
- QString path = QFile::encodeName(selected);
- mFile.Assign(path.toUtf8().data());
- }
-
- *aReturn = nsIFilePicker::returnOK;
- if (mMode == modeSave) {
- nsCOMPtr<nsIFile> file;
- GetFile(getter_AddRefs(file));
- if (file) {
- bool exists = false;
- file->Exists(&exists);
- if (exists) {
- *aReturn = nsIFilePicker::returnReplace;
- }
- }
- }
-
- return NS_OK;
-}
-
-void nsFilePicker::InitNative(nsIWidget *aParent, const nsAString &aTitle)
-{
- PR_LOG(sFilePickerLog, PR_LOG_DEBUG, ("nsFilePicker::InitNative"));
- nsAutoString str(aTitle);
- mCaption = QString::fromUtf16(str.get());
- mParent = aParent;
-}
deleted file mode 100644
--- a/widget/qt/nsFilePicker.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#ifndef NSFILEPICKER_H
-#define NSFILEPICKER_H
-
-#include <QPointer>
-#include "nsBaseFilePicker.h"
-#include "nsCOMArray.h"
-#include "nsString.h"
-
-class QFileDialog;
-
-class nsFilePicker : public nsBaseFilePicker
-{
-public:
- nsFilePicker();
-
- NS_DECL_ISUPPORTS
-
- // nsIFilePicker (less what's in nsBaseFilePicker)
- NS_IMETHODIMP Init(nsIDOMWindow* parent, const nsAString& title, int16_t mode);
- NS_IMETHODIMP AppendFilters(int32_t filterMask);
- NS_IMETHODIMP AppendFilter(const nsAString& aTitle, const nsAString& aFilter);
- NS_IMETHODIMP GetDefaultString(nsAString& aDefaultString);
- NS_IMETHODIMP SetDefaultString(const nsAString& aDefaultString);
- NS_IMETHODIMP GetDefaultExtension(nsAString& aDefaultExtension);
- NS_IMETHODIMP SetDefaultExtension(const nsAString& aDefaultExtension);
- NS_IMETHODIMP GetFilterIndex(int32_t* aFilterIndex);
- NS_IMETHODIMP SetFilterIndex(int32_t aFilterIndex);
- NS_IMETHODIMP GetFile(nsIFile* *aFile);
- NS_IMETHODIMP GetFileURL(nsIURI* *aFileURL);
- NS_IMETHODIMP GetFiles(nsISimpleEnumerator* *aFiles);
- NS_IMETHODIMP Show(int16_t* aReturn);
-
-private:
- ~nsFilePicker();
- void InitNative(nsIWidget*, const nsAString&);
-
-protected:
- QPointer<QFileDialog> mDialog;
- nsCOMArray<nsIFile> mFiles;
-
- int16_t mSelectedType;
- nsCString mFile;
- nsString mTitle;
- nsString mDefault;
- nsString mDefaultExtension;
-
- nsTArray<nsCString> mFilters;
- nsTArray<nsCString> mFilterNames;
-
- QString mCaption;
- nsIWidget* mParent;
-};
-
-#endif // NSFILEPICKER_H
--- a/widget/qt/nsLookAndFeel.cpp
+++ b/widget/qt/nsLookAndFeel.cpp
@@ -1,521 +1,460 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* Copyright 2012 Mozilla Foundation and Mozilla contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
-// Qt headers must be included before anything that might pull in our
-// malloc wrappers.
-#include <QApplication>
+#include <QGuiApplication>
#include <QFont>
-#include <QPalette>
-#include <QStyle>
-
-#undef NS_LOOKANDFEEL_DEBUG
-#ifdef NS_LOOKANDFEEL_DEBUG
-#include <QDebug>
-#endif
+#include <QScreen>
#include "nsLookAndFeel.h"
#include "nsStyleConsts.h"
-
-#include <qglobal.h>
+#include "gfxFont.h"
+#include "gfxFontConstants.h"
+#include "mozilla/gfx/2D.h"
-#define QCOLOR_TO_NS_RGB(c) \
- ((nscolor)NS_RGB(c.red(),c.green(),c.blue()))
+static const char16_t UNICODE_BULLET = 0x2022;
nsLookAndFeel::nsLookAndFeel()
- : nsXPLookAndFeel(),
- mDefaultFontCached(false), mButtonFontCached(false),
- mFieldFontCached(false), mMenuFontCached(false)
+ : nsXPLookAndFeel()
{
}
nsLookAndFeel::~nsLookAndFeel()
{
}
nsresult
nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
{
- nsresult res = NS_OK;
-
- if (!qApp)
- return NS_ERROR_FAILURE;
-
- QPalette palette = qApp->palette();
-
- switch (aID) {
- case eColorID_WindowBackground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
+ nsresult rv = NS_OK;
- case eColorID_WindowForeground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
- case eColorID_WidgetBackground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
- case eColorID_WidgetForeground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::WindowText));
- break;
+#define BASE_ACTIVE_COLOR NS_RGB(0xaa,0xaa,0xaa)
+#define BASE_NORMAL_COLOR NS_RGB(0xff,0xff,0xff)
+#define BASE_SELECTED_COLOR NS_RGB(0xaa,0xaa,0xaa)
+#define BG_ACTIVE_COLOR NS_RGB(0xff,0xff,0xff)
+#define BG_INSENSITIVE_COLOR NS_RGB(0xaa,0xaa,0xaa)
+#define BG_NORMAL_COLOR NS_RGB(0xff,0xff,0xff)
+#define BG_PRELIGHT_COLOR NS_RGB(0xee,0xee,0xee)
+#define BG_SELECTED_COLOR NS_RGB(0x99,0x99,0x99)
+#define DARK_NORMAL_COLOR NS_RGB(0x88,0x88,0x88)
+#define FG_INSENSITIVE_COLOR NS_RGB(0x44,0x44,0x44)
+#define FG_NORMAL_COLOR NS_RGB(0x00,0x00,0x00)
+#define FG_PRELIGHT_COLOR NS_RGB(0x77,0x77,0x77)
+#define FG_SELECTED_COLOR NS_RGB(0xaa,0xaa,0xaa)
+#define LIGHT_NORMAL_COLOR NS_RGB(0xaa,0xaa,0xaa)
+#define TEXT_ACTIVE_COLOR NS_RGB(0x99,0x99,0x99)
+#define TEXT_NORMAL_COLOR NS_RGB(0x00,0x00,0x00)
+#define TEXT_SELECTED_COLOR NS_RGB(0x00,0x00,0x00)
+ switch (aID) {
+ // These colors don't seem to be used for anything anymore in Mozilla
+ // (except here at least TextSelectBackground and TextSelectForeground)
+ // The CSS2 colors below are used.
+ case eColorID_WindowBackground:
+ aColor = BASE_NORMAL_COLOR;
+ break;
+ case eColorID_WindowForeground:
+ aColor = TEXT_NORMAL_COLOR;
+ break;
+ case eColorID_WidgetBackground:
+ aColor = BG_NORMAL_COLOR;
+ break;
+ case eColorID_WidgetForeground:
+ aColor = FG_NORMAL_COLOR;
+ break;
case eColorID_WidgetSelectBackground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ aColor = BG_SELECTED_COLOR;
+ break;
case eColorID_WidgetSelectForeground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::WindowText));
- break;
-
+ aColor = FG_SELECTED_COLOR;
+ break;
case eColorID_Widget3DHighlight:
- aColor = NS_RGB(0xa0,0xa0,0xa0);
- break;
-
+ aColor = NS_RGB(0xa0,0xa0,0xa0);
+ break;
case eColorID_Widget3DShadow:
- aColor = NS_RGB(0x40,0x40,0x40);
- break;
-
+ aColor = NS_RGB(0x40,0x40,0x40);
+ break;
case eColorID_TextBackground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ // not used?
+ aColor = BASE_NORMAL_COLOR;
+ break;
case eColorID_TextForeground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::WindowText));
- break;
-
+ // not used?
+ aColor = TEXT_NORMAL_COLOR;
+ break;
case eColorID_TextSelectBackground:
case eColorID_IMESelectedRawTextBackground:
case eColorID_IMESelectedConvertedTextBackground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Highlight));
- break;
-
+ // still used
+ aColor = BASE_SELECTED_COLOR;
+ break;
case eColorID_TextSelectForeground:
case eColorID_IMESelectedRawTextForeground:
case eColorID_IMESelectedConvertedTextForeground:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::HighlightedText));
- break;
-
+ // still used
+ aColor = TEXT_SELECTED_COLOR;
+ break;
case eColorID_IMERawInputBackground:
case eColorID_IMEConvertedTextBackground:
- aColor = NS_TRANSPARENT;
- break;
-
+ aColor = NS_TRANSPARENT;
+ break;
case eColorID_IMERawInputForeground:
case eColorID_IMEConvertedTextForeground:
- aColor = NS_SAME_AS_FOREGROUND_COLOR;
- break;
-
+ aColor = NS_SAME_AS_FOREGROUND_COLOR;
+ break;
case eColorID_IMERawInputUnderline:
case eColorID_IMEConvertedTextUnderline:
- aColor = NS_SAME_AS_FOREGROUND_COLOR;
- break;
-
+ aColor = NS_SAME_AS_FOREGROUND_COLOR;
+ break;
case eColorID_IMESelectedRawTextUnderline:
case eColorID_IMESelectedConvertedTextUnderline:
- aColor = NS_TRANSPARENT;
- break;
-
+ aColor = NS_TRANSPARENT;
+ break;
case eColorID_SpellCheckerUnderline:
aColor = NS_RGB(0xff, 0, 0);
break;
+ // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
case eColorID_activeborder:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ // active window border
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_activecaption:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ // active window caption background
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_appworkspace:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ // MDI background color
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_background:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ // desktop background
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_captiontext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Text));
- break;
-
+ // text in active window caption, size box, and scrollbar arrow box (!)
+ aColor = FG_NORMAL_COLOR;
+ break;
case eColorID_graytext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Disabled, QPalette::Text));
- break;
-
+ // disabled text in windows, menus, etc.
+ aColor = FG_INSENSITIVE_COLOR;
+ break;
case eColorID_highlight:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Highlight));
- break;
-
+ // background of selected item
+ aColor = BASE_SELECTED_COLOR;
+ break;
case eColorID_highlighttext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::HighlightedText));
- break;
-
+ // text of selected item
+ aColor = TEXT_SELECTED_COLOR;
+ break;
case eColorID_inactiveborder:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Disabled, QPalette::Window));
- break;
-
+ // inactive window border
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_inactivecaption:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Disabled, QPalette::Window));
- break;
-
+ // inactive window caption
+ aColor = BG_INSENSITIVE_COLOR;
+ break;
case eColorID_inactivecaptiontext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Disabled, QPalette::Text));
- break;
-
+ // text in inactive window caption
+ aColor = FG_INSENSITIVE_COLOR;
+ break;
case eColorID_infobackground:
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::ToolTipBase));
-#else
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Base));
-#endif
- break;
-
+ // tooltip background color
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_infotext:
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::ToolTipText));
-#else
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Text));
-#endif
- break;
-
+ // tooltip text color
+ aColor = TEXT_NORMAL_COLOR;
+ break;
case eColorID_menu:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
+ // menu background
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_menutext:
- case eColorID__moz_menubartext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Text));
- break;
-
+ // menu text
+ aColor = TEXT_NORMAL_COLOR;
+ break;
case eColorID_scrollbar:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Mid));
- break;
+ // scrollbar gray area
+ aColor = BG_ACTIVE_COLOR;
+ break;
case eColorID_threedface:
case eColorID_buttonface:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Button));
- break;
-
- case eColorID_buttonhighlight:
- case eColorID_threedhighlight:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Dark));
- break;
+ // 3-D face color
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_buttontext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::ButtonText));
- break;
+ // text on push buttons
+ aColor = TEXT_NORMAL_COLOR;
+ break;
+
+ case eColorID_buttonhighlight:
+ // 3-D highlighted edge color
+ case eColorID_threedhighlight:
+ // 3-D highlighted outer edge color
+ aColor = LIGHT_NORMAL_COLOR;
+ break;
+
+ case eColorID_threedlightshadow:
+ // 3-D highlighted inner edge color
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_buttonshadow:
+ // 3-D shadow edge color
case eColorID_threedshadow:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Dark));
- break;
+ // 3-D shadow inner edge color
+ aColor = DARK_NORMAL_COLOR;
+ break;
case eColorID_threeddarkshadow:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Shadow));
- break;
-
- case eColorID_threedlightshadow:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Light));
- break;
+ // 3-D shadow outer edge color
+ aColor = NS_RGB(0,0,0);
+ break;
case eColorID_window:
case eColorID_windowframe:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
+ aColor = BG_NORMAL_COLOR;
+ break;
case eColorID_windowtext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Text));
- break;
-
- // from the CSS3 working draft (not yet finalized)
- // http://www.w3.org/tr/2000/wd-css3-userint-20000216.html#color
-
- case eColorID__moz_buttondefault:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Button));
- break;
-
- case eColorID__moz_field:
- case eColorID__moz_combobox:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Base));
- break;
-
- case eColorID__moz_fieldtext:
- case eColorID__moz_comboboxtext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Text));
- break;
-
- case eColorID__moz_dialog:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
- case eColorID__moz_dialogtext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::WindowText));
- break;
-
- case eColorID__moz_dragtargetzone:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Window));
- break;
-
- case eColorID__moz_buttonhovertext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::ButtonText));
- break;
-
- case eColorID__moz_menuhovertext:
- case eColorID__moz_menubarhovertext:
- aColor = QCOLOR_TO_NS_RGB(palette.color(QPalette::Normal, QPalette::Text));
- break;
+ aColor = FG_NORMAL_COLOR;
+ break;
+ case eColorID__moz_eventreerow:
+ case eColorID__moz_field:
+ aColor = BASE_NORMAL_COLOR;
+ break;
+ case eColorID__moz_fieldtext:
+ aColor = TEXT_NORMAL_COLOR;
+ break;
+ case eColorID__moz_dialog:
+ aColor = BG_NORMAL_COLOR;
+ break;
+ case eColorID__moz_dialogtext:
+ aColor = FG_NORMAL_COLOR;
+ break;
+ case eColorID__moz_dragtargetzone:
+ aColor = BG_SELECTED_COLOR;
+ break;
+ case eColorID__moz_buttondefault:
+ // default button border color
+ aColor = NS_RGB(0,0,0);
+ break;
+ case eColorID__moz_buttonhoverface:
+ aColor = BG_PRELIGHT_COLOR;
+ break;
+ case eColorID__moz_buttonhovertext:
+ aColor = FG_PRELIGHT_COLOR;
+ break;
+ case eColorID__moz_cellhighlight:
+ case eColorID__moz_html_cellhighlight:
+ aColor = BASE_ACTIVE_COLOR;
+ break;
+ case eColorID__moz_cellhighlighttext:
+ case eColorID__moz_html_cellhighlighttext:
+ aColor = TEXT_ACTIVE_COLOR;
+ break;
+ case eColorID__moz_menuhover:
+ aColor = BG_PRELIGHT_COLOR;
+ break;
+ case eColorID__moz_menuhovertext:
+ aColor = FG_PRELIGHT_COLOR;
+ break;
+ case eColorID__moz_oddtreerow:
+ aColor = NS_TRANSPARENT;
+ break;
+ case eColorID__moz_nativehyperlinktext:
+ aColor = NS_SAME_AS_FOREGROUND_COLOR;
+ break;
+ case eColorID__moz_comboboxtext:
+ aColor = TEXT_NORMAL_COLOR;
+ break;
+ case eColorID__moz_combobox:
+ aColor = BG_NORMAL_COLOR;
+ break;
+ case eColorID__moz_menubartext:
+ aColor = TEXT_NORMAL_COLOR;
+ break;
+ case eColorID__moz_menubarhovertext:
+ aColor = FG_PRELIGHT_COLOR;
+ break;
default:
- aColor = 0;
- res = NS_ERROR_FAILURE;
- break;
- }
- return res;
-}
+ /* default color is BLACK */
+ aColor = 0;
+ rv = NS_ERROR_FAILURE;
+ break;
+ }
-#ifdef NS_LOOKANDFEEL_DEBUG
-static const char *metricToString[] = {
- "eIntID_CaretBlinkTime",
- "eIntID_CaretWidth",
- "eIntID_ShowCaretDuringSelection",
- "eIntID_SelectTextfieldsOnKeyFocus",
- "eIntID_SubmenuDelay",
- "eIntID_MenusCanOverlapOSBar",
- "eIntID_SkipNavigatingDisabledMenuItem",
- "eIntID_DragThresholdX",
- "eIntID_DragThresholdY",
- "eIntID_UseAccessibilityTheme",
- "eIntID_ScrollArrowStyle",
- "eIntID_ScrollSliderStyle",
- "eIntID_ScrollButtonLeftMouseButtonAction",
- "eIntID_ScrollButtonMiddleMouseButtonAction",
- "eIntID_ScrollButtonRightMouseButtonAction",
- "eIntID_TreeOpenDelay",
- "eIntID_TreeCloseDelay",
- "eIntID_TreeLazyScrollDelay",
- "eIntID_TreeScrollDelay",
- "eIntID_TreeScrollLinesMax",
- "eIntID_TabFocusModel",
- "eIntID_WindowsDefaultTheme",
- "eIntID_AlertNotificationOrigin",
- "eIntID_ScrollToClick",
- "eIntID_IMERawInputUnderlineStyle",
- "eIntID_IMESelectedRawTextUnderlineStyle",
- "eIntID_IMEConvertedTextUnderlineStyle",
- "eIntID_IMESelectedConvertedTextUnderline",
- "eIntID_ImagesInMenus"
-};
-#endif
+ return rv;
+}
nsresult
nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
{
-#ifdef NS_LOOKANDFEEL_DEBUG
- qDebug("nsLookAndFeel::GetIntImpl aID = %s", metricToString[aID]);
-#endif
+ nsresult rv = nsXPLookAndFeel::GetIntImpl(aID, aResult);
+ if (NS_SUCCEEDED(rv))
+ return rv;
+
+ rv = NS_OK;
- nsresult res = nsXPLookAndFeel::GetIntImpl(aID, aResult);
- if (NS_SUCCEEDED(res))
- return res;
+ switch (aID) {
+ case eIntID_CaretBlinkTime:
+ aResult = 500;
+ break;
- res = NS_OK;
+ case eIntID_CaretWidth:
+ aResult = 1;
+ break;
- switch (aID) {
- case eIntID_CaretBlinkTime:
- aResult = 500;
- break;
+ case eIntID_ShowCaretDuringSelection:
+ aResult = 0;
+ break;
- case eIntID_CaretWidth:
- aResult = 1;
- break;
-
- case eIntID_ShowCaretDuringSelection:
- aResult = 0;
- break;
+ case eIntID_SelectTextfieldsOnKeyFocus:
+ // Select textfield content when focused by kbd
+ // used by nsEventStateManager::sTextfieldSelectModel
+ aResult = 1;
+ break;
- case eIntID_SelectTextfieldsOnKeyFocus:
- // Select textfield content when focused by kbd
- // used by nsEventStateManager::sTextfieldSelectModel
- aResult = 1;
- break;
+ case eIntID_SubmenuDelay:
+ aResult = 200;
+ break;
- case eIntID_SubmenuDelay:
- aResult = 200;
- break;
+ case eIntID_TooltipDelay:
+ aResult = 500;
+ break;
- case eIntID_TooltipDelay:
- aResult = 500;
- break;
+ case eIntID_MenusCanOverlapOSBar:
+ // we want XUL popups to be able to overlap the task bar.
+ aResult = 1;
+ break;
- case eIntID_MenusCanOverlapOSBar:
- // we want XUL popups to be able to overlap the task bar.
- aResult = 1;
- break;
+ case eIntID_ScrollArrowStyle:
+ aResult = eScrollArrowStyle_Single;
+ break;
- case eIntID_ScrollArrowStyle:
- aResult = eScrollArrowStyle_Single;
- break;
+ case eIntID_ScrollSliderStyle:
+ aResult = eScrollThumbStyle_Proportional;
+ break;
- case eIntID_ScrollSliderStyle:
- aResult = eScrollThumbStyle_Proportional;
- break;
+ case eIntID_TouchEnabled:
+ aResult = 1;
+ break;
- case eIntID_TouchEnabled:
- aResult = 0;
- res = NS_ERROR_NOT_IMPLEMENTED;
- break;
+ case eIntID_WindowsDefaultTheme:
+ case eIntID_WindowsThemeIdentifier:
+ case eIntID_OperatingSystemVersionIdentifier:
+ aResult = 0;
+ rv = NS_ERROR_NOT_IMPLEMENTED;
+ break;
- case eIntID_WindowsDefaultTheme:
- aResult = 0;
- res = NS_ERROR_NOT_IMPLEMENTED;
- break;
+ case eIntID_IMERawInputUnderlineStyle:
+ case eIntID_IMEConvertedTextUnderlineStyle:
+ aResult = NS_STYLE_TEXT_DECORATION_STYLE_SOLID;
+ break;
- case eIntID_SpellCheckerUnderlineStyle:
- aResult = NS_STYLE_TEXT_DECORATION_STYLE_WAVY;
- break;
-
- case eIntID_ScrollbarButtonAutoRepeatBehavior:
- aResult = 1;
- break;
+ case eIntID_IMESelectedRawTextUnderlineStyle:
+ case eIntID_IMESelectedConvertedTextUnderline:
+ aResult = NS_STYLE_TEXT_DECORATION_STYLE_NONE;
+ break;
- default:
- aResult = 0;
- res = NS_ERROR_FAILURE;
- }
- return res;
+ case eIntID_SpellCheckerUnderlineStyle:
+ aResult = NS_STYLE_TEXT_DECORATION_STYLE_WAVY;
+ break;
+
+ case eIntID_ScrollbarButtonAutoRepeatBehavior:
+ aResult = 0;
+ break;
+
+ default:
+ aResult = 0;
+ rv = NS_ERROR_FAILURE;
+ }
+
+ return rv;
}
-#ifdef NS_LOOKANDFEEL_DEBUG
-static const char *floatMetricToString[] = {
- "eFloatID_IMEUnderlineRelativeSize"
-};
-#endif
-
nsresult
nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult)
{
-#ifdef NS_LOOKANDFEEL_DEBUG
- qDebug("nsLookAndFeel::GetFloatImpl aID = %s", floatMetricToString[aID]);
-#endif
-
nsresult res = nsXPLookAndFeel::GetFloatImpl(aID, aResult);
if (NS_SUCCEEDED(res))
return res;
res = NS_OK;
switch (aID) {
case eFloatID_IMEUnderlineRelativeSize:
- aResult = 1.0f;
- break;
-
+ aResult = 1.0f;
+ break;
case eFloatID_SpellCheckerUnderlineRelativeSize:
- aResult = 1.0f;
- break;
-
+ aResult = 1.0f;
+ break;
default:
- aResult = -1.0;
- res = NS_ERROR_FAILURE;
- break;
- }
+ aResult = -1.0;
+ res = NS_ERROR_FAILURE;
+ }
return res;
}
-static void
-GetSystemFontInfo(const char *aClassName, nsString *aFontName,
- gfxFontStyle *aFontStyle)
-{
- QFont qFont = QApplication::font(aClassName);
-
- NS_NAMED_LITERAL_STRING(quote, "\"");
- nsString family((char16_t*)qFont.family().data());
- *aFontName = quote + family + quote;
-
- aFontStyle->systemFont = true;
- aFontStyle->style = NS_FONT_STYLE_NORMAL;
- aFontStyle->weight = qFont.weight();
- // FIXME: Set aFontStyle->stretch correctly!
- aFontStyle->stretch = NS_FONT_STRETCH_NORMAL;
- // use pixel size directly if it is set, otherwise compute from point size
- if (qFont.pixelSize() != -1) {
- aFontStyle->size = qFont.pixelSize();
- } else {
- aFontStyle->size = qFont.pointSizeF() * 96.0f / 72.0f;
- }
-}
-
+/*virtual*/
bool
nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName,
gfxFontStyle& aFontStyle,
float aDevPixPerCSSPixel)
{
- const char *className = nullptr;
- nsString *cachedFontName = nullptr;
- gfxFontStyle *cachedFontStyle = nullptr;
- bool *isCached = nullptr;
+ QFont qFont = QGuiApplication::font();
- switch (aID) {
- case eFont_Menu: // css2
- case eFont_PullDownMenu: // css3
- cachedFontName = &mMenuFontName;
- cachedFontStyle = &mMenuFontStyle;
- isCached = &mMenuFontCached;
- className = "QAction";
- break;
-
- case eFont_Field: // css3
- case eFont_List: // css3
- cachedFontName = &mFieldFontName;
- cachedFontStyle = &mFieldFontStyle;
- isCached = &mFieldFontCached;
- className = "QlineEdit";
- break;
+ NS_NAMED_LITERAL_STRING(quote, "\"");
+ nsString family((char16_t*)qFont.family().data());
+ aFontName = quote + family + quote;
- case eFont_Button: // css3
- cachedFontName = &mButtonFontName;
- cachedFontStyle = &mButtonFontStyle;
- isCached = &mButtonFontCached;
- className = "QPushButton";
- break;
-
- case eFont_Caption: // css2
- case eFont_Icon: // css2
- case eFont_MessageBox: // css2
- case eFont_SmallCaption: // css2
- case eFont_StatusBar: // css2
- case eFont_Window: // css3
- case eFont_Document: // css3
- case eFont_Workspace: // css3
- case eFont_Desktop: // css3
- case eFont_Info: // css3
- case eFont_Dialog: // css3
- case eFont_Tooltips: // moz
- case eFont_Widget: // moz
- cachedFontName = &mDefaultFontName;
- cachedFontStyle = &mDefaultFontStyle;
- isCached = &mDefaultFontCached;
- className = "Qlabel";
- break;
+ aFontStyle.systemFont = true;
+ aFontStyle.style = qFont.style();
+ aFontStyle.weight = qFont.weight();
+ aFontStyle.stretch = qFont.stretch();
+ // use pixel size directly if it is set, otherwise compute from point size
+ if (qFont.pixelSize() != -1) {
+ aFontStyle.size = qFont.pixelSize();
+ } else {
+ aFontStyle.size = qFont.pointSizeF() * qApp->primaryScreen()->logicalDotsPerInch() / 72.0f;
}
- if (!*isCached) {
- GetSystemFontInfo(className, cachedFontName, cachedFontStyle);
- *isCached = true;
- }
-
- aFontName = *cachedFontName;
- aFontStyle = *cachedFontStyle;
return true;
}
-void
-nsLookAndFeel::RefreshImpl()
+/*virtual*/
+bool
+nsLookAndFeel::GetEchoPasswordImpl() {
+ return true;
+}
+
+/*virtual*/
+uint32_t
+nsLookAndFeel::GetPasswordMaskDelayImpl()
{
- nsXPLookAndFeel::RefreshImpl();
- mDefaultFontCached = false;
- mButtonFontCached = false;
- mFieldFontCached = false;
- mMenuFontCached = false;
+ // Same value on Android framework
+ return 1500;
}
+
+/* virtual */
+char16_t
+nsLookAndFeel::GetPasswordCharacterImpl()
+{
+ return UNICODE_BULLET;
+}
--- a/widget/qt/nsLookAndFeel.h
+++ b/widget/qt/nsLookAndFeel.h
@@ -1,40 +1,40 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+/* Copyright 2012 Mozilla Foundation and Mozilla contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
#ifndef __nsLookAndFeel
#define __nsLookAndFeel
#include "nsXPLookAndFeel.h"
-#include "gfxFont.h"
-class nsLookAndFeel: public nsXPLookAndFeel
+class nsLookAndFeel : public nsXPLookAndFeel
{
public:
nsLookAndFeel();
virtual ~nsLookAndFeel();
- virtual nsresult NativeGetColor(ColorID aID, nscolor &aResult);
+ virtual bool GetFontImpl(FontID aID, nsString& aName, gfxFontStyle& aStyle,
+ float aDevPixPerCSSPixel);
virtual nsresult GetIntImpl(IntID aID, int32_t &aResult);
virtual nsresult GetFloatImpl(FloatID aID, float &aResult);
- virtual bool GetFontImpl(FontID aID, nsString& aFontName,
- gfxFontStyle& aFontStyle,
- float aDevPixPerCSSPixel);
- virtual void RefreshImpl();
+ virtual bool GetEchoPasswordImpl();
+ virtual uint32_t GetPasswordMaskDelayImpl();
+ virtual char16_t GetPasswordCharacterImpl();
-private:
- bool mDefaultFontCached;
- bool mButtonFontCached;
- bool mFieldFontCached;
- bool mMenuFontCached;
- nsString mDefaultFontName;
- nsString mButtonFontName;
- nsString mFieldFontName;
- nsString mMenuFontName;
- gfxFontStyle mDefaultFontStyle;
- gfxFontStyle mButtonFontStyle;
- gfxFontStyle mFieldFontStyle;
- gfxFontStyle mMenuFontStyle;
+protected:
+ virtual nsresult NativeGetColor(ColorID aID, nscolor &aColor);
};
#endif
deleted file mode 100644
--- a/widget/qt/nsMFilePicker.cpp
+++ /dev/null
@@ -1,284 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim: sw=2 ts=4 et :
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-#include <QWidget>
-#include "nsMFilePicker.h"
-
-
-// Use Qt Tracker API to get attachment data from tracker:
-#include <QtSparql/QSparqlConnection>
-#include <QtSparql/QSparqlQuery>
-#include <QtSparql/QSparqlResult>
-
-#include <MApplication>
-#include <MApplicationPage>
-#include <MApplicationWindow>
-#include <MSceneManager>
-
-#include <QFileInfo>
-#include <QPointer>
-
-#include <SelectSingleContentItemPage.h>
-#include <SelectMultipleContentItemsPage.h>
-
-MeegoFileDialog::MeegoFileDialog(QObject* aParent)
- : QObject(aParent)
- , mMode(Mode_Unknown)
-{
-}
-
-MeegoFileDialog::~MeegoFileDialog()
-{
-}
-
-int
-MeegoFileDialog::exec()
-{
- MApplicationPage* page = nullptr;
- switch(mMode) {
- case Mode_OpenFile:
- page = createOpenFilePage();
- break;
- case Mode_OpenFiles:
- page = createOpenFilesPage();
- break;
- case Mode_OpenDirectory:
- page = createOpenDirectoryPage();
- break;
- default:
- return 0;
- }
-
- page->setTitle(mCaption);
-
- QPointer<MApplicationWindow> appWindow = new MApplicationWindow(MApplication::activeWindow());
- QObject::connect(MApplication::activeWindow(), SIGNAL(switcherEntered()), this, SLOT(backButtonClicked()));
- appWindow->show();
-
- // a not so pretty Hack to build up a back button
- // by using a empty scene window for a pseudo history stack
- MSceneWindow* fakeWindow = new MSceneWindow();
- // tell fake window to disappear when page back was clicked.
- connect(page, SIGNAL(backButtonClicked()), fakeWindow, SLOT(disappear()));
- // let new page appear on pseudo Application Window
- appWindow->sceneManager()->appearSceneWindowNow(page);
-
- // get, manipulate and set history stack
- QList<MSceneWindow*> sceneWindowHistory = appWindow->sceneManager()->pageHistory();
- sceneWindowHistory.insert(0, fakeWindow);
- appWindow->sceneManager()->setPageHistory(sceneWindowHistory);
-
- // start own eventloop
- QEventLoop eventLoop;
- mEventLoop = &eventLoop;
- QPointer<MeegoFileDialog> guard = this;
- (void) eventLoop.exec(QEventLoop::DialogExec);
- if (guard.isNull()) {
- return 0;
- }
- if (page) {
- page->disappear();
- delete page;
- }
- if (appWindow) {
- delete appWindow;
- }
- mEventLoop = 0;
- return 0;
-}
-
-MApplicationPage*
-MeegoFileDialog::createOpenFilePage()
-{
- QStringList itemType("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject");
-
- SelectSingleContentItemPage* page =
- new SelectSingleContentItemPage(QString(),
- itemType);
-
- connect(page, SIGNAL(contentItemSelected(const QString&)),
- this, SLOT (contentItemSelected(const QString&)));
-
- connect(page, SIGNAL(backButtonClicked()),
- this, SLOT (backButtonClicked()));
-
- return page;
-}
-
-MApplicationPage*
-MeegoFileDialog::createOpenFilesPage()
-{
- QStringList itemType("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Folder");
-
- SelectMultipleContentItemsPage* page = new SelectMultipleContentItemsPage(QString(), itemType);
- connect(page, SIGNAL(contentItemsSelected(const QStringList&)),
- this, SLOT (contentItemsSelected(const QStringList&)));
-
- connect(page, SIGNAL(backButtonClicked()),
- this, SLOT (backButtonClicked()));
-
- return page;
-}
-
-MApplicationPage*
-MeegoFileDialog::createOpenDirectoryPage()
-{
- QStringList itemType("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Folder");
-
- SelectSingleContentItemPage* page = new SelectSingleContentItemPage(QString(), itemType);
- connect(page, SIGNAL(contentItemSelected(const QString&)),
- this, SLOT (contentItemSelected(const QString&)));
-
- connect(page, SIGNAL(backButtonClicked()),
- this, SLOT (backButtonClicked()));
-
- return page;
-}
-
-QStringList
-MeegoFileDialog::selectedFileNames() const
-{
- return mSelectedFileNames;
-}
-
-bool
-MeegoFileDialog::hasSelectedFileNames() const
-{
- return !mSelectedFileNames.isEmpty();
-}
-
-void
-MeegoFileDialog::contentItemSelected(const QString& aContentItem)
-{
- mSelectedFileNames.clear();
-
- if (aContentItem.isEmpty()) {
- finishEventLoop();
- return;
- }
-
- QUrl fileUrl = trackerIdToFilename(aContentItem);
- QFileInfo fileInfo(fileUrl.toLocalFile());
- if (fileInfo.isFile()) {
- mSelectedFileNames << fileInfo.canonicalFilePath();
- }
-
- finishEventLoop();
-}
-
-void
-MeegoFileDialog::contentItemsSelected(const QStringList& aContentItems)
-{
- mSelectedFileNames.clear();
-
- foreach (QString contentItem, aContentItems) {
- QUrl fileUrl = trackerIdToFilename(contentItem);
- QFileInfo fileInfo(fileUrl.toLocalFile());
- if (fileInfo.isFile()) {
- mSelectedFileNames << fileInfo.canonicalFilePath();
- }
- }
-
- finishEventLoop();
-}
-
-void
-MeegoFileDialog::backButtonClicked()
-{
- mSelectedFileNames.clear();
- finishEventLoop();
-}
-
-/* static */ QString
-MeegoFileDialog::getOpenFileName(QWidget* parent,
- const QString& caption,
- const QString& dir,
- const QString& filter)
-{
- QPointer<MeegoFileDialog> picker = new MeegoFileDialog(parent);
-
- QString result;
- picker->mMode = MeegoFileDialog::Mode_OpenFile;
- picker->mCaption = caption;
- picker->exec();
-
- // Need separate 'if' because picker might have been destroyed by its parent during exec()
- if (picker) {
- if (picker->hasSelectedFileNames()) {
- result = picker->selectedFileNames().first();
- }
- delete picker;
- }
-
- return result;
-}
-
-/* static */ QString
-MeegoFileDialog::getExistingDirectory(QWidget* parent,const QString& caption, const QString& dir)
-{
- QPointer<MeegoFileDialog> picker = new MeegoFileDialog(parent);
-
- QString result;
- picker->mMode = MeegoFileDialog::Mode_OpenDirectory;
- picker->mCaption = caption;
- picker->exec();
-
- // Need separate 'if' because picker might have been destroyed by its parent during exec()
- if (picker) {
- if (picker->hasSelectedFileNames()) {
- result = picker->selectedFileNames().first();
- }
- delete picker;
- }
-
- return result;
-}
-
-/* static */ QStringList
-MeegoFileDialog::getOpenFileNames(QWidget* parent,
- const QString& caption,
- const QString& dir,
- const QString& filter)
-{
- QPointer<MeegoFileDialog> picker = new MeegoFileDialog(parent);
-
- QStringList result;
- picker->mMode = MeegoFileDialog::Mode_OpenFiles;
- picker->mCaption = caption;
- picker->exec();
-
- // Need separate 'if' because picker might have been destroyed by its parent during exec()
- if (picker) {
- if (picker->hasSelectedFileNames()) {
- result = picker->selectedFileNames();
- }
- delete picker;
- }
-
- return result;
-}
-
-QUrl
-MeegoFileDialog::trackerIdToFilename(const QString& trackerId)
-{
- QSparqlQuery query("SELECT ?u WHERE { ?:tUri nie:url ?u . }");
- query.bindValue("tUri", QUrl(trackerId)); // That puts <trackerId> into the query
- QSparqlConnection connection("QTRACKER"); // Exact string needed to make connection to tracker
- QSparqlResult* result = connection.exec(query);
-
- result->waitForFinished();
- result->first();
-
- QUrl resultFile;
- if (result->isValid()) {
- resultFile = QUrl(result->binding(0).value().toString());
- }
- delete result;
-
- return resultFile;
-}
deleted file mode 100644
--- a/widget/qt/nsMFilePicker.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim: sw=2 ts=4 et :
- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef NSMFILEDIALOG_H
-#define NSMFILEDIALOG_H
-
-#include <QEventLoop>
-#include <QStringList>
-#include <QUrl>
-
-class MApplicationPage;
-class MeegoFileDialog : public QObject
-{
- Q_OBJECT
-public:
-
- enum MeegoFileDialogMode {
- Mode_Unknown = -1,
- Mode_OpenFile = 0,
- Mode_OpenFiles = 1,
- Mode_OpenDirectory = 2
- // No Mode_SaveFile - the content picker can't handle that
- };
-
- MeegoFileDialog(QObject* aParent = 0);
- virtual ~MeegoFileDialog();
-
- QStringList selectedFileNames() const;
- bool hasSelectedFileNames() const;
-
- static QString getOpenFileName(QWidget* parent, const QString &caption, const QString& dir, const QString& filter);
- static QStringList getOpenFileNames(QWidget* parent, const QString& caption, const QString& dir, const QString& filter);
- static QString getExistingDirectory(QWidget* parent, const QString& caption, const QString& dir);
-
- int exec();
-
-private Q_SLOTS:
- void contentItemSelected(const QString& aItem);
- void contentItemsSelected(const QStringList& aItems);
- void backButtonClicked();
-
-private:
- QUrl trackerIdToFilename(const QString& trackerId);
- MApplicationPage* createOpenFilePage();
- MApplicationPage* createOpenFilesPage();
- MApplicationPage* createOpenDirectoryPage();
- void finishEventLoop() {
- if (!mEventLoop)
- return;
- mEventLoop->exit(0);
- mEventLoop = 0;
- }
-
- QEventLoop* mEventLoop;
- MeegoFileDialogMode mMode;
- QString mCaption;
- QStringList mSelectedFileNames;
-};
-
-#endif // NSMFILEDIALOG_H
deleted file mode 100644
--- a/widget/qt/nsNativeThemeQt.cpp
+++ /dev/null
@@ -1,688 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <QApplication>
-#include <QStyle>
-#include <QPalette>
-#include <QRect>
-#include <QPainter>
-#include <QStyleOption>
-#include <QStyleOptionFrameV2>
-#include <QStyleOptionButton>
-#include <QFlags>
-#include <QStyleOptionComboBox>
-
-#include "nsIFrame.h"
-
-#include "nsCoord.h"
-#include "nsNativeThemeQt.h"
-#include "nsPresContext.h"
-
-#include "nsRect.h"
-#include "nsSize.h"
-#include "nsTransform2D.h"
-#include "nsThemeConstants.h"
-#include "nsIServiceManager.h"
-#include "nsIDOMHTMLInputElement.h"
-
-
-#include "gfxASurface.h"
-#include "gfxContext.h"
-#include "gfxQtPlatform.h"
-#include "gfxQPainterSurface.h"
-#ifdef MOZ_X11
-#include "gfxXlibSurface.h"
-#endif
-#include "nsRenderingContext.h"
-
-nsNativeThemeQt::nsNativeThemeQt()
-{
- mNoBackgroundPalette.setColor(QPalette::Window, Qt::transparent);
- ThemeChanged();
-}
-
-nsNativeThemeQt::~nsNativeThemeQt()
-{
-}
-
-NS_IMPL_ISUPPORTS_INHERITED1(nsNativeThemeQt, nsNativeTheme, nsITheme)
-
-static inline QRect qRectInPixels(const nsRect &aRect,
- const int32_t p2a)
-{
- return QRect(NSAppUnitsToIntPixels(aRect.x, p2a),
- NSAppUnitsToIntPixels(aRect.y, p2a),
- NSAppUnitsToIntPixels(aRect.width, p2a),
- NSAppUnitsToIntPixels(aRect.height, p2a));
-}
-
-static inline QImage::Format
-_qimage_from_gfximage_format (gfxImageFormat aFormat)
-{
- switch (aFormat) {
- case gfxImageFormat::ARGB32:
- return QImage::Format_ARGB32_Premultiplied;
- case gfxImageFormat::RGB24:
- return QImage::Format_RGB32;
- case gfxImageFormat::RGB16_565:
- return QImage::Format_RGB16;
- case gfxImageFormat::A8:
- return QImage::Format_Indexed8;
- case gfxImageFormat::A1:
-#ifdef WORDS_BIGENDIAN
- return QImage::Format_Mono;
-#else
- return QImage::Format_MonoLSB;
-#endif
- default:
- return QImage::Format_Invalid;
- }
-
- return QImage::Format_Mono;
-}
-
-NS_IMETHODIMP
-nsNativeThemeQt::DrawWidgetBackground(nsRenderingContext* aContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- const nsRect& aRect,
- const nsRect& aClipRect)
-{
- gfxContext* context = aContext->ThebesContext();
- nsRefPtr<gfxASurface> surface = context->CurrentSurface();
-
-#ifdef CAIRO_HAS_QT_SURFACE
- if (surface->GetType() == gfxSurfaceType::QPainter) {
- gfxQPainterSurface* qSurface = (gfxQPainterSurface*) (surface.get());
- QPainter *painter = qSurface->GetQPainter();
- NS_ASSERTION(painter, "Where'd my QPainter go?");
- if (!painter)
- return NS_ERROR_FAILURE;
- return DrawWidgetBackground(painter, aContext,
- aFrame, aWidgetType,
- aRect, aClipRect);
- } else
-#endif
- if (surface->GetType() == gfxSurfaceType::Image) {
- gfxImageSurface* qSurface = (gfxImageSurface*) (surface.get());
- QImage tempQImage(qSurface->Data(),
- qSurface->Width(),
- qSurface->Height(),
- qSurface->Stride(),
- _qimage_from_gfximage_format(qSurface->Format()));
- QPainter painter(&tempQImage);
- return DrawWidgetBackground(&painter, aContext,
- aFrame, aWidgetType,
- aRect, aClipRect);
- }
-#if defined(MOZ_X11) && defined(Q_WS_X11)
- else if (surface->GetType() == gfxSurfaceType::Xlib) {
- gfxXlibSurface* qSurface = (gfxXlibSurface*) (surface.get());
- QPixmap pixmap(QPixmap::fromX11Pixmap(qSurface->XDrawable()));
- QPainter painter(&pixmap);
- return DrawWidgetBackground(&painter, aContext,
- aFrame, aWidgetType,
- aRect, aClipRect);
- }
-#endif
-
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-nsresult
-nsNativeThemeQt::DrawWidgetBackground(QPainter *qPainter,
- nsRenderingContext* aContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- const nsRect& aRect,
- const nsRect& aClipRect)
-
-{
- gfxContext* context = aContext->ThebesContext();
- nsRefPtr<gfxASurface> surface = context->CurrentSurface();
-
- context->UpdateSurfaceClip();
-
- QStyle* style = qApp->style();
-
- qPainter->save();
-
- gfxPoint offs = surface->GetDeviceOffset();
- qPainter->translate(offs.x, offs.y);
-
- gfxMatrix ctm = context->CurrentMatrix();
- if (!ctm.HasNonTranslation()) {
- ctm.x0 = NSToCoordRound(ctm.x0);
- ctm.y0 = NSToCoordRound(ctm.y0);
- }
-
- QMatrix qctm(ctm.xx, ctm.yx, ctm.xy, ctm.yy, ctm.x0, ctm.y0);
- qPainter->setWorldMatrix(qctm, true);
-
- int32_t p2a = aContext->AppUnitsPerDevPixel();
-
- QRect r = qRectInPixels(aRect, p2a);
- QRect cr = qRectInPixels(aClipRect, p2a);
-
- QStyle::State extraFlags = QStyle::State_None;
-
- switch (aWidgetType) {
- case NS_THEME_RADIO:
- case NS_THEME_CHECKBOX: {
- QStyleOptionButton opt;
- InitButtonStyle (aWidgetType, aFrame, r, opt);
-
- if (aWidgetType == NS_THEME_CHECKBOX)
- {
- style->drawPrimitive (QStyle::PE_IndicatorCheckBox, &opt, qPainter);
- } else {
- style->drawPrimitive (QStyle::PE_IndicatorRadioButton, &opt, qPainter);
- }
- break;
- }
- case NS_THEME_BUTTON:
- case NS_THEME_BUTTON_BEVEL: {
- QStyleOptionButton opt;
- InitButtonStyle (aWidgetType, aFrame, r, opt);
-
- if (aWidgetType == NS_THEME_BUTTON) {
- style->drawPrimitive(QStyle::PE_PanelButtonCommand, &opt, qPainter);
- if (IsDefaultButton(aFrame))
- style->drawPrimitive(QStyle::PE_FrameDefaultButton, &opt, qPainter);
- } else {
- style->drawPrimitive(QStyle::PE_PanelButtonBevel, &opt, qPainter);
- style->drawPrimitive(QStyle::PE_FrameButtonBevel, &opt, qPainter);
- }
- break;
- }
- case NS_THEME_SCROLLBAR: {
- qPainter->fillRect(r, qApp->palette().brush(QPalette::Normal, QPalette::Window));
- break;
- }
- case NS_THEME_SCROLLBAR_TRACK_HORIZONTAL: {
- qPainter->fillRect(r, qApp->palette().brush(QPalette::Active, QPalette::Window));
- break;
- }
- case NS_THEME_SCROLLBAR_TRACK_VERTICAL: {
- qPainter->fillRect(r, qApp->palette().brush(QPalette::Active, QPalette::Window));
- break;
- }
- case NS_THEME_SCROLLBAR_BUTTON_LEFT: {
- QStyleOptionSlider opt;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt, QStyle::State_Horizontal);
- opt.orientation = Qt::Horizontal;
- style->drawControl(QStyle::CE_ScrollBarSubLine, &opt, qPainter, nullptr);
- break;
- }
- case NS_THEME_SCROLLBAR_BUTTON_RIGHT: {
- QStyleOptionSlider opt;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt, QStyle::State_Horizontal);
- opt.orientation = Qt::Horizontal;
- style->drawControl(QStyle::CE_ScrollBarAddLine, &opt, qPainter, nullptr);
- break;
- }
- case NS_THEME_SCROLLBAR_BUTTON_UP: {
- QStyleOptionSlider opt;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt);
- opt.orientation = Qt::Vertical;
- style->drawControl(QStyle::CE_ScrollBarSubLine, &opt, qPainter, nullptr);
- break;
- }
- case NS_THEME_SCROLLBAR_BUTTON_DOWN: {
- QStyleOptionSlider opt;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt);
- opt.orientation = Qt::Vertical;
- style->drawControl(QStyle::CE_ScrollBarAddLine, &opt, qPainter, nullptr);
- break;
- }
- case NS_THEME_SCROLLBAR_THUMB_HORIZONTAL: {
- extraFlags |= QStyle::State_Horizontal;
- QStyleOptionSlider option;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)option, extraFlags);
- option.orientation = Qt::Horizontal;
- style->drawControl(QStyle::CE_ScrollBarSlider, &option, qPainter, nullptr);
- break;
- }
- case NS_THEME_SCROLLBAR_THUMB_VERTICAL: {
- QStyleOptionSlider option;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)option, extraFlags);
- option.orientation = Qt::Vertical;
- style->drawControl(QStyle::CE_ScrollBarSlider, &option, qPainter, nullptr);
- break;
- }
- case NS_THEME_DROPDOWN: {
- QStyleOptionComboBox comboOpt;
-
- InitComboStyle(aWidgetType, aFrame, r, comboOpt);
-
- style->drawComplexControl(QStyle::CC_ComboBox, &comboOpt, qPainter);
- break;
- }
- case NS_THEME_DROPDOWN_BUTTON: {
- QStyleOptionComboBox option;
-
- InitComboStyle(aWidgetType, aFrame, r, option);
-
- style->drawPrimitive(QStyle::PE_FrameDefaultButton, &option, qPainter);
- style->drawPrimitive(QStyle::PE_IndicatorSpinDown, &option, qPainter);
- break;
- }
- case NS_THEME_DROPDOWN_TEXT:
- case NS_THEME_DROPDOWN_TEXTFIELD:
- case NS_THEME_NUMBER_INPUT:
- case NS_THEME_TEXTFIELD:
- case NS_THEME_TEXTFIELD_MULTILINE:
- case NS_THEME_LISTBOX: {
- QStyleOptionFrameV2 frameOpt;
- nsEventStates eventState = GetContentState(aFrame, aWidgetType);
-
- if (!IsDisabled(aFrame, eventState))
- frameOpt.state |= QStyle::State_Enabled;
-
- frameOpt.rect = r;
- frameOpt.features = QStyleOptionFrameV2::Flat;
-
- if (aWidgetType == NS_THEME_NUMBER_INPUT ||
- aWidgetType == NS_THEME_TEXTFIELD ||
- aWidgetType == NS_THEME_TEXTFIELD_MULTILINE) {
- QRect contentRect = style->subElementRect(QStyle::SE_LineEditContents, &frameOpt);
- contentRect.adjust(mFrameWidth, mFrameWidth, -mFrameWidth, -mFrameWidth);
- qPainter->fillRect(contentRect, QBrush(Qt::white));
- }
-
- frameOpt.palette = mNoBackgroundPalette;
- style->drawPrimitive(QStyle::PE_FrameLineEdit, &frameOpt, qPainter, nullptr);
- break;
- }
- case NS_THEME_MENUPOPUP: {
- QStyleOptionMenuItem option;
- InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)option, extraFlags);
- style->drawPrimitive(QStyle::PE_FrameMenu, &option, qPainter, nullptr);
- break;
- }
- default:
- break;
- }
-
- qPainter->restore();
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsNativeThemeQt::GetWidgetBorder(nsDeviceContext* ,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- nsIntMargin* aResult)
-{
- (*aResult).top = (*aResult).bottom = (*aResult).left = (*aResult).right = 0;
-
- QStyle* style = qApp->style();
- switch(aWidgetType) {
-// case NS_THEME_TEXTFIELD:
-// case NS_THEME_LISTBOX:
- case NS_THEME_MENUPOPUP: {
- (*aResult).top = (*aResult).bottom = (*aResult).left = (*aResult).right = style->pixelMetric(QStyle::PM_MenuPanelWidth);
- break;
- }
- default:
- break;
- }
-
- return NS_OK;
-}
-
-bool
-nsNativeThemeQt::GetWidgetPadding(nsDeviceContext* ,
- nsIFrame*, uint8_t aWidgetType,
- nsIntMargin* aResult)
-{
- // XXX: Where to get padding values, framewidth?
- if (aWidgetType == NS_THEME_NUMBER_INPUT ||
- aWidgetType == NS_THEME_TEXTFIELD ||
- aWidgetType == NS_THEME_TEXTFIELD_MULTILINE ||
- aWidgetType == NS_THEME_DROPDOWN) {
- aResult->SizeTo(2, 2, 2, 2);
- return true;
- }
-
- return false;
-}
-
-NS_IMETHODIMP
-nsNativeThemeQt::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* aFrame,
- uint8_t aWidgetType,
- nsIntSize* aResult, bool* aIsOverridable)
-{
- (*aResult).width = (*aResult).height = 0;
- *aIsOverridable = true;
-
- QStyle *s = qApp->style();
-
- int32_t p2a = aContext->AppUnitsPerDevPixel();
-
- switch (aWidgetType) {
- case NS_THEME_RADIO:
- case NS_THEME_CHECKBOX: {
- nsRect frameRect = aFrame->GetRect();
-
- QRect qRect = qRectInPixels(frameRect, p2a);
-
- QStyleOptionButton option;
-
- InitButtonStyle(aWidgetType, aFrame, qRect, option);
-
- QRect rect = s->subElementRect(
- (aWidgetType == NS_THEME_CHECKBOX) ?
- QStyle::SE_CheckBoxIndicator :
- QStyle::SE_RadioButtonIndicator,
- &option,
- nullptr);
-
- (*aResult).width = rect.width();
- (*aResult).height = rect.height();
- break;
- }
- case NS_THEME_BUTTON: {
- nsRect frameRect = aFrame->GetRect();
-
- QRect qRect = qRectInPixels(frameRect, p2a);
-
- QStyleOptionButton option;
-
- InitButtonStyle(aWidgetType, aFrame, qRect, option);
-
- QRect rect = s->subElementRect(
- QStyle::SE_PushButtonFocusRect,
- &option,
- nullptr);
-
- (*aResult).width = rect.width();
- (*aResult).height = rect.height();
- break;
- }
- case NS_THEME_SCROLLBAR_BUTTON_UP:
- case NS_THEME_SCROLLBAR_BUTTON_DOWN: {
- (*aResult).width = s->pixelMetric(QStyle::PM_ScrollBarExtent);
- (*aResult).height = (*aResult).width;
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_SCROLLBAR_BUTTON_LEFT:
- case NS_THEME_SCROLLBAR_BUTTON_RIGHT: {
- (*aResult).height = s->pixelMetric(QStyle::PM_ScrollBarExtent);
- (*aResult).width = (*aResult).height;
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_SCROLLBAR_THUMB_VERTICAL: {
- (*aResult).width = s->pixelMetric(QStyle::PM_ScrollBarExtent);
- (*aResult).height = s->pixelMetric(QStyle::PM_ScrollBarSliderMin);
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_SCROLLBAR_THUMB_HORIZONTAL: {
- (*aResult).width = s->pixelMetric(QStyle::PM_ScrollBarSliderMin);
- (*aResult).height = s->pixelMetric(QStyle::PM_ScrollBarExtent);
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_SCROLLBAR_TRACK_VERTICAL: {
- (*aResult).width = s->pixelMetric(QStyle::PM_ScrollBarExtent);
- (*aResult).height = s->pixelMetric(QStyle::PM_SliderLength);
- break;
- }
- case NS_THEME_SCROLLBAR_TRACK_HORIZONTAL: {
- (*aResult).width = s->pixelMetric(QStyle::PM_SliderLength);
- (*aResult).height = s->pixelMetric(QStyle::PM_ScrollBarExtent);
- break;
- }
- case NS_THEME_DROPDOWN_BUTTON: {
- QStyleOptionComboBox comboOpt;
-
- nsRect frameRect = aFrame->GetRect();
- QRect qRect = qRectInPixels(frameRect, p2a);
- comboOpt.rect = qRect;
-
- InitComboStyle(aWidgetType, aFrame, qRect, comboOpt);
-
- QRect subRect = s->subControlRect(QStyle::CC_ComboBox, &comboOpt,
- QStyle::SC_ComboBoxArrow, nullptr);
-
- (*aResult).width = subRect.width();
- (*aResult).height = subRect.height();
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_DROPDOWN: {
- QStyleOptionComboBox comboOpt;
-
- nsRect frameRect = aFrame->GetRect();
- QRect qRect = qRectInPixels(frameRect, p2a);
- comboOpt.rect = qRect;
-
- InitComboStyle(aWidgetType, aFrame, qRect, comboOpt);
-
- QRect subRect = s->subControlRect(QStyle::CC_ComboBox,
- &comboOpt,
- QStyle::SC_ComboBoxFrame,
- nullptr);
-
- (*aResult).width = subRect.width();
- (*aResult).height = subRect.height();
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_DROPDOWN_TEXT: {
- QStyleOptionComboBox comboOpt;
-
- nsRect frameRect = aFrame->GetRect();
-
- QRect qRect = qRectInPixels(frameRect, p2a);
-
- comboOpt.rect = qRect;
-
- QRect subRect = s->subControlRect(QStyle::CC_ComboBox, &comboOpt,
- QStyle::SC_ComboBoxEditField, nullptr);
-
- (*aResult).width = subRect.width();
- (*aResult).height = subRect.height();
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_DROPDOWN_TEXTFIELD: {
- QStyleOptionComboBox comboOpt;
-
- nsRect frameRect = aFrame->GetRect();
-
- QRect qRect = qRectInPixels(frameRect, p2a);
-
- comboOpt.rect = qRect;
-
- QRect subRect = s->subControlRect(QStyle::CC_ComboBox, &comboOpt,
- QStyle::SC_ComboBoxArrow, nullptr);
- QRect subRect2 = s->subControlRect(QStyle::CC_ComboBox, &comboOpt,
- QStyle::SC_ComboBoxFrame, nullptr);
-
- (*aResult).width = subRect.width() + subRect2.width();
- (*aResult).height = std::max(subRect.height(), subRect2.height());
- //*aIsOverridable = false;
- break;
- }
- case NS_THEME_NUMBER_INPUT:
- case NS_THEME_TEXTFIELD:
- case NS_THEME_TEXTFIELD_MULTILINE:
- break;
- }
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsNativeThemeQt::WidgetStateChanged(nsIFrame* aFrame, uint8_t aWidgetType,
- nsIAtom* aAttribute, bool* aShouldRepaint)
-{
- *aShouldRepaint = true;
- return NS_OK;
-}
-
-
-NS_IMETHODIMP
-nsNativeThemeQt::ThemeChanged()
-{
- QStyle *s = qApp->style();
- if (s)
- mFrameWidth = s->pixelMetric(QStyle::PM_DefaultFrameWidth);
- return NS_OK;
-}
-
-bool
-nsNativeThemeQt::ThemeSupportsWidget(nsPresContext* aPresContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType)
-{
- switch (aWidgetType) {
- case NS_THEME_SCROLLBAR:
- case NS_THEME_SCROLLBAR_BUTTON_UP:
- case NS_THEME_SCROLLBAR_BUTTON_DOWN:
- case NS_THEME_SCROLLBAR_BUTTON_LEFT:
- case NS_THEME_SCROLLBAR_BUTTON_RIGHT:
- case NS_THEME_SCROLLBAR_THUMB_HORIZONTAL:
- case NS_THEME_SCROLLBAR_THUMB_VERTICAL:
- //case NS_THEME_SCROLLBAR_GRIPPER_HORIZONTAL:
- //case NS_THEME_SCROLLBAR_GRIPPER_VERTICAL:
- case NS_THEME_SCROLLBAR_TRACK_HORIZONTAL:
- case NS_THEME_SCROLLBAR_TRACK_VERTICAL:
- case NS_THEME_RADIO:
- case NS_THEME_CHECKBOX:
- case NS_THEME_BUTTON_BEVEL:
- case NS_THEME_BUTTON:
- case NS_THEME_DROPDOWN:
- case NS_THEME_DROPDOWN_BUTTON:
- case NS_THEME_DROPDOWN_TEXT:
- case NS_THEME_DROPDOWN_TEXTFIELD:
- case NS_THEME_NUMBER_INPUT:
- case NS_THEME_TEXTFIELD:
- case NS_THEME_TEXTFIELD_MULTILINE:
- case NS_THEME_LISTBOX:
- case NS_THEME_MENUPOPUP:
- return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
- default:
- break;
- }
- return false;
-}
-
-bool
-nsNativeThemeQt::WidgetIsContainer(uint8_t aWidgetType)
-{
-// if (aWidgetType == NS_THEME_DROPDOWN_BUTTON ||
-// aWidgetType == NS_THEME_RADIO ||
-// aWidgetType == NS_THEME_CHECKBOX) {
-// return false;
-// }
-
- return true;
-}
-
-bool
-nsNativeThemeQt::ThemeDrawsFocusForWidget(uint8_t aWidgetType)
-{
- if (aWidgetType == NS_THEME_DROPDOWN ||
- aWidgetType == NS_THEME_BUTTON ||
- aWidgetType == NS_THEME_TREEVIEW_HEADER_CELL) {
- return true;
- }
-
- return false;
-}
-
-bool
-nsNativeThemeQt::ThemeNeedsComboboxDropmarker()
-{
- return true;
-}
-
-void
-nsNativeThemeQt::InitButtonStyle(uint8_t aWidgetType,
- nsIFrame* aFrame,
- QRect rect,
- QStyleOptionButton &opt)
-{
- nsEventStates eventState = GetContentState(aFrame, aWidgetType);
-
- opt.rect = rect;
- opt.palette = mNoBackgroundPalette;
-
- bool isDisabled = IsDisabled(aFrame, eventState);
-
- if (!isDisabled)
- opt.state |= QStyle::State_Enabled;
- if (eventState.HasState(NS_EVENT_STATE_HOVER))
- opt.state |= QStyle::State_MouseOver;
- if (eventState.HasState(NS_EVENT_STATE_FOCUS))
- opt.state |= QStyle::State_HasFocus;
- if (!isDisabled && eventState.HasState(NS_EVENT_STATE_ACTIVE))
- // Don't allow sunken when disabled
- opt.state |= QStyle::State_Sunken;
-
- switch (aWidgetType) {
- case NS_THEME_RADIO:
- case NS_THEME_CHECKBOX:
- if (IsChecked(aFrame))
- opt.state |= QStyle::State_On;
- else
- opt.state |= QStyle::State_Off;
-
- break;
- default:
- if (!eventState.HasState(NS_EVENT_STATE_ACTIVE))
- opt.state |= QStyle::State_Raised;
- break;
- }
-}
-
-void
-nsNativeThemeQt::InitPlainStyle(uint8_t aWidgetType,
- nsIFrame* aFrame,
- QRect rect,
- QStyleOption &opt,
- QStyle::State extraFlags)
-{
- nsEventStates eventState = GetContentState(aFrame, aWidgetType);
-
- opt.rect = rect;
-
- if (!IsDisabled(aFrame, eventState))
- opt.state |= QStyle::State_Enabled;
- if (eventState.HasState(NS_EVENT_STATE_HOVER))
- opt.state |= QStyle::State_MouseOver;
- if (eventState.HasState(NS_EVENT_STATE_FOCUS))
- opt.state |= QStyle::State_HasFocus;
-
- opt.state |= extraFlags;
-}
-
-void
-nsNativeThemeQt::InitComboStyle(uint8_t aWidgetType,
- nsIFrame* aFrame,
- QRect rect,
- QStyleOptionComboBox &opt)
-{
- nsEventStates eventState = GetContentState(aFrame, aWidgetType);
- bool isDisabled = IsDisabled(aFrame, eventState);
-
- if (!isDisabled)
- opt.state |= QStyle::State_Enabled;
- if (eventState.HasState(NS_EVENT_STATE_HOVER))
- opt.state |= QStyle::State_MouseOver;
- if (eventState.HasState(NS_EVENT_STATE_FOCUS))
- opt.state |= QStyle::State_HasFocus;
- if (!eventState.HasState(NS_EVENT_STATE_ACTIVE))
- opt.state |= QStyle::State_Raised;
- if (!isDisabled && eventState.HasState(NS_EVENT_STATE_ACTIVE))
- // Don't allow sunken when disabled
- opt.state |= QStyle::State_Sunken;
-
- opt.rect = rect;
- opt.palette = mNoBackgroundPalette;
-}
deleted file mode 100644
--- a/widget/qt/nsNativeThemeQt.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <QStyle>
-#include <QPalette>
-
-#include "nsITheme.h"
-#include "nsCOMPtr.h"
-#include "nsIAtom.h"
-#include "nsNativeTheme.h"
-
-class QComboBox;
-class QStyleOptionButton;
-class QStyleOptionComboBox;
-class QRect;
-class nsIFrame;
-class nsDeviceContext;
-
-class nsNativeThemeQt : private nsNativeTheme,
- public nsITheme
-{
-public:
- NS_DECL_ISUPPORTS_INHERITED
-
- // The nsITheme interface.
- NS_IMETHOD DrawWidgetBackground(nsRenderingContext* aContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- const nsRect& aRect,
- const nsRect& aClipRect);
-
- NS_IMETHOD GetWidgetBorder(nsDeviceContext* aContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- nsIntMargin* aResult);
-
- NS_IMETHOD GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* aFrame,
- uint8_t aWidgetType,
- nsIntSize* aResult,
- bool* aIsOverridable);
-
- NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, uint8_t aWidgetType,
- nsIAtom* aAttribute, bool* aShouldRepaint);
-
- NS_IMETHOD ThemeChanged();
-
- bool ThemeSupportsWidget(nsPresContext* aPresContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType);
-
- bool WidgetIsContainer(uint8_t aWidgetType);
-
- virtual NS_HIDDEN_(bool) GetWidgetPadding(nsDeviceContext* aContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- nsIntMargin* aResult);
-
- NS_IMETHOD_(bool) ThemeDrawsFocusForWidget(uint8_t aWidgetType) MOZ_OVERRIDE;
-
- bool ThemeNeedsComboboxDropmarker();
-
- nsNativeThemeQt();
- virtual ~nsNativeThemeQt();
-
-private:
-
- inline nsresult DrawWidgetBackground(QPainter *qPainter,
- nsRenderingContext* aContext,
- nsIFrame* aFrame,
- uint8_t aWidgetType,
- const nsRect& aRect,
- const nsRect& aClipRect);
-
- void InitButtonStyle(uint8_t widgetType,
- nsIFrame* aFrame,
- QRect rect,
- QStyleOptionButton &opt);
-
- void InitPlainStyle(uint8_t aWidgetType,
- nsIFrame* aFrame,
- QRect rect,
- QStyleOption &opt,
- QStyle::State extraFlags = QStyle::State_None);
-
- void InitComboStyle(uint8_t aWidgetType,
- nsIFrame* aFrame,
- QRect rect,
- QStyleOptionComboBox &opt);
-
-private:
-
- int32_t mFrameWidth;
-
- QPalette mNoBackgroundPalette;
-};
-
--- a/widget/qt/nsQtKeyUtils.cpp
+++ b/widget/qt/nsQtKeyUtils.cpp
@@ -1,14 +1,15 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include <qnamespace.h>
#include "mozilla/ArrayUtils.h"
#include "mozilla/TextEvents.h"
#include "nsWindow.h"
#include "nsQtKeyUtils.h"
using namespace mozilla;
using namespace mozilla::widget;
@@ -466,23 +467,19 @@ QtKeyCodeToDOMKeyNameIndex(int aKeysym)
case Qt::Key_AudioCycleTrack:
case Qt::Key_Time:
case Qt::Key_Hibernate:
case Qt::Key_View:
case Qt::Key_TopMenu:
case Qt::Key_PowerDown:
case Qt::Key_Suspend:
case Qt::Key_ContrastAdjust:
-
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
case Qt::Key_TouchpadToggle:
case Qt::Key_TouchpadOn:
case Qt::Key_TouchpadOff:
-#endif
-
case Qt::Key_unknown:
case Qt::Key_Call:
case Qt::Key_CameraFocus:
case Qt::Key_Context1:
case Qt::Key_Context2:
case Qt::Key_Context3:
case Qt::Key_Context4:
case Qt::Key_Flip:
--- a/widget/qt/nsScreenManagerQt.cpp
+++ b/widget/qt/nsScreenManagerQt.cpp
@@ -1,66 +1,67 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include "qdesktopwidget.h"
-#include "qapplication.h"
+#include <QGuiApplication>
+#include <QScreen>
#include "nsScreenManagerQt.h"
#include "nsScreenQt.h"
nsScreenManagerQt::nsScreenManagerQt()
{
+ mInitialized = false;
desktop = 0;
screens = 0;
}
nsScreenManagerQt::~nsScreenManagerQt()
{
delete [] screens;
}
// addref, release, QI
NS_IMPL_ISUPPORTS1(nsScreenManagerQt, nsIScreenManager)
void nsScreenManagerQt::init()
{
- if (desktop)
+ if (mInitialized)
return;
- desktop = QApplication::desktop();
- nScreens = desktop->numScreens();
+ nScreens = QGuiApplication::screens().size();
screens = new nsCOMPtr<nsIScreen>[nScreens];
for (int i = 0; i < nScreens; ++i)
screens[i] = new nsScreenQt(i);
+ mInitialized = true;
}
//
// ScreenForRect
//
// Returns the screen that contains the rectangle. If the rect overlaps
// multiple screens, it picks the screen with the greatest area of intersection.
//
// The coordinates are in pixels (not twips) and in screen coordinates.
//
NS_IMETHODIMP
nsScreenManagerQt::ScreenForRect(int32_t inLeft, int32_t inTop,
- int32_t inWidth, int32_t inHeight,
- nsIScreen **outScreen)
+ int32_t inWidth, int32_t inHeight,
+ nsIScreen **outScreen)
{
- if (!desktop)
+ if (!mInitialized)
init();
QRect r(inLeft, inTop, inWidth, inHeight);
int best = 0;
int area = 0;
for (int i = 0; i < nScreens; ++i) {
- const QRect& rect = desktop->screenGeometry(i);
+ const QRect& rect = QGuiApplication::screens()[i]->geometry();
QRect intersection = r▭
int a = intersection.width()*intersection.height();
if (a > area) {
best = i;
area = a;
}
}
@@ -90,27 +91,27 @@ nsScreenManagerQt::GetPrimaryScreen(nsIS
// Returns how many physical screens are available.
//
NS_IMETHODIMP
nsScreenManagerQt::GetNumberOfScreens(uint32_t *aNumberOfScreens)
{
if (!desktop)
init();
- *aNumberOfScreens = desktop->numScreens();
+ *aNumberOfScreens = nScreens;
return NS_OK;
}
NS_IMETHODIMP
nsScreenManagerQt::GetSystemDefaultScale(float *aDefaultScale)
{
*aDefaultScale = 1.0f;
return NS_OK;
}
NS_IMETHODIMP
-nsScreenManagerQt :: ScreenForNativeWidget (void *aWidget, nsIScreen **outScreen)
+nsScreenManagerQt::ScreenForNativeWidget(void *aWidget, nsIScreen **outScreen)
{
// I don't know how to go from GtkWindow to nsIScreen, especially
// given xinerama and stuff, so let's just do this
- QRect rect = static_cast<QWidget*>(aWidget)->geometry();
+ QRect rect(0, 0, 1, 1);
return ScreenForRect(rect.x(), rect.y(), rect.width(), rect.height(), outScreen);
}
--- a/widget/qt/nsScreenManagerQt.h
+++ b/widget/qt/nsScreenManagerQt.h
@@ -24,11 +24,12 @@ public:
private:
void init ();
nsCOMPtr<nsIScreen> *screens;
QDesktopWidget *desktop;
int nScreens;
+ bool mInitialized;
};
#endif // nsScreenManagerQt_h___
--- a/widget/qt/nsScreenQt.cpp
+++ b/widget/qt/nsScreenQt.cpp
@@ -1,121 +1,67 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include <qcolor.h>
-#include <qcolormap.h>
-#include <qrect.h>
-#include <qdesktopwidget.h>
-#include <qapplication.h>
+#include <QColor>
+#include <QRect>
+#include <QGuiApplication>
#include <QTransform>
+#include <QScreen>
#include "nsScreenQt.h"
#include "nsXULAppAPI.h"
-#ifdef MOZ_ENABLE_QTMOBILITY
-#include "mozqorientationsensorfilter.h"
-#endif
-
-#ifdef MOZ_ENABLE_QMSYSTEM2
-#include <qmdisplaystate.h>
-using namespace mozilla;
-
-const int DISPLAY_BLANK_TIMEOUT = 10800; /*3 * 60 * 60 seconds*/
-const int DISPLAY_DIM_TIMEOUT = 10620; /*3 * 59 * 60 seconds*/
-
-#endif
-
nsScreenQt::nsScreenQt(int aScreen)
: mScreen(aScreen)
-#ifdef MOZ_ENABLE_QMSYSTEM2
- , mDisplayState(nullptr)
-#endif
{
// nothing else to do. I guess we could cache a bunch of information
// here, but we want to ask the device at runtime in case anything
// has changed.
}
nsScreenQt::~nsScreenQt()
{
-#ifdef MOZ_ENABLE_QMSYSTEM2
- delete mDisplayState;
- mDisplayState = nullptr;
-#endif
}
NS_IMETHODIMP
nsScreenQt::GetRect(int32_t *outLeft,int32_t *outTop,
int32_t *outWidth,int32_t *outHeight)
{
- QRect r = QApplication::desktop()->screenGeometry(mScreen);
-#ifdef MOZ_ENABLE_QTMOBILITY
- r = MozQOrientationSensorFilter::GetRotationTransform().mapRect(r);
- // just rotating gives us weird negative coordinates, but we want to return
- // sensible logical coordinates
- r.moveTo(0, 0);
-#endif
+ QRect r = QGuiApplication::screens()[mScreen]->geometry();
*outTop = r.x();
*outLeft = r.y();
*outWidth = r.width();
*outHeight = r.height();
return NS_OK;
}
NS_IMETHODIMP
nsScreenQt::GetAvailRect(int32_t *outLeft,int32_t *outTop,
int32_t *outWidth,int32_t *outHeight)
{
- QRect r = QApplication::desktop()->screenGeometry(mScreen);
-#ifdef MOZ_ENABLE_QTMOBILITY
- r = MozQOrientationSensorFilter::GetRotationTransform().mapRect(r);
-#endif
+ QRect r = QGuiApplication::screens()[mScreen]->geometry();
*outTop = r.x();
*outLeft = r.y();
*outWidth = r.width();
*outHeight = r.height();
return NS_OK;
}
NS_IMETHODIMP
nsScreenQt::GetPixelDepth(int32_t *aPixelDepth)
{
// #############
- *aPixelDepth = (int32_t)QColormap::instance().depth();
+ *aPixelDepth = QGuiApplication::primaryScreen()->depth();
return NS_OK;
}
NS_IMETHODIMP
nsScreenQt::GetColorDepth(int32_t *aColorDepth)
{
// ###############
return GetPixelDepth(aColorDepth);
}
-
-#ifdef MOZ_ENABLE_QMSYSTEM2
-void
-nsScreenQt::ApplyMinimumBrightness(uint32_t aType)
-{
- // resets all we did before,
- // 1) there is no interface to get default values
- // 2) user might have changed system settings while fennec is running
- // there is no notification about that.
- delete mDisplayState;
- mDisplayState = nullptr;
-
- if( aType == BRIGHTNESS_FULL) {
- mDisplayState = new MeeGo::QmDisplayState();
-
- // no way to keep display from blanking than setting a huge timeout
- // parameter is seconds. setting timeout to huge time this should work for 99.9% of our usecases
- mDisplayState->setDisplayBlankTimeout( DISPLAY_BLANK_TIMEOUT /*in seconds*/ );
- mDisplayState->setDisplayDimTimeout( DISPLAY_DIM_TIMEOUT /*in seconds*/ );
- mDisplayState->setDisplayBrightnessValue( mDisplayState->getMaxDisplayBrightnessValue() );
- mDisplayState->set(MeeGo::QmDisplayState::On);
- }
-}
-#endif
--- a/widget/qt/nsScreenQt.h
+++ b/widget/qt/nsScreenQt.h
@@ -3,40 +3,26 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsScreenQt_h___
#define nsScreenQt_h___
#include "nsBaseScreen.h"
-#ifdef MOZ_ENABLE_QMSYSTEM2
-namespace MeeGo
-{
- class QmDisplayState;
-}
-#endif
-
-
//------------------------------------------------------------------------
class nsScreenQt : public nsBaseScreen
{
public:
nsScreenQt (int aScreen);
virtual ~nsScreenQt();
NS_IMETHOD GetRect(int32_t* aLeft, int32_t* aTop, int32_t* aWidth, int32_t* aHeight);
NS_IMETHOD GetAvailRect(int32_t* aLeft, int32_t* aTop, int32_t* aWidth, int32_t* aHeight);
NS_IMETHOD GetPixelDepth(int32_t* aPixelDepth);
NS_IMETHOD GetColorDepth(int32_t* aColorDepth);
-#ifdef MOZ_ENABLE_QMSYSTEM2
-protected:
- virtual void ApplyMinimumBrightness(uint32_t aType) MOZ_OVERRIDE;
-private:
- MeeGo::QmDisplayState* mDisplayState;
-#endif
private:
int mScreen;
};
#endif // nsScreenQt_h___
deleted file mode 100644
--- a/widget/qt/nsSound.cpp
+++ /dev/null
@@ -1,380 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <QApplication>
-
-#include <string.h>
-#include <unistd.h>
-
-#include "nscore.h"
-#include "plstr.h"
-#include "prlink.h"
-
-#include "nsSound.h"
-#include "nsString.h"
-
-#include "nsIURL.h"
-#include "nsIFileURL.h"
-#include "nsNetUtil.h"
-#include "nsCOMPtr.h"
-#include "nsNativeCharsetUtils.h"
-#include "nsAutoPtr.h"
-
-/* used with esd_open_sound */
-static int esdref = -1;
-static PRLibrary *elib = nullptr;
-
-// the following from esd.h
-
-#define ESD_BITS8 (0x0000)
-#define ESD_BITS16 (0x0001)
-#define ESD_MONO (0x0010)
-#define ESD_STEREO (0x0020)
-#define ESD_STREAM (0x0000)
-#define ESD_PLAY (0x1000)
-
-#define WAV_MIN_LENGTH 44
-
-typedef int (*EsdOpenSoundType)(const char *host);
-typedef int (*EsdCloseType)(int);
-
-/* used to play the sounds from the find symbol call */
-typedef int (*EsdPlayStreamType) (int, int, const char *, const char *);
-typedef int (*EsdAudioOpenType) (void);
-typedef int (*EsdAudioWriteType) (const void *, int);
-typedef void (*EsdAudioCloseType) (void);
-
-NS_IMPL_ISUPPORTS2(nsSound, nsISound, nsIStreamLoaderObserver)
-
-nsSound::nsSound()
- : mInited( false )
-{
-}
-
-nsSound::~nsSound()
-{
- /* see above comment */
- if (esdref != -1) {
- EsdCloseType EsdClose = (EsdCloseType) PR_FindFunctionSymbol(elib, "esd_close");
- if (EsdClose)
- (*EsdClose)(esdref);
- esdref = -1;
- }
-}
-
-
-/**
-* unload esd library
-*/
-void
-nsSound::Shutdown()
-{
- if (elib) {
- PR_UnloadLibrary(elib);
- elib = nullptr;
- }
-}
-
-NS_IMETHODIMP
-nsSound::Init()
-{
- /* we don't need to do esd_open_sound if we are only going to play files
- but we will if we want to do things like streams, etc
- */
- if (mInited)
- return NS_OK;
- if (elib)
- return NS_OK;
-
- EsdOpenSoundType EsdOpenSound;
-
- elib = PR_LoadLibrary("libesd.so.0");
- if (!elib) return NS_ERROR_NOT_AVAILABLE;
-
- EsdOpenSound = (EsdOpenSoundType) PR_FindFunctionSymbol(elib, "esd_open_sound");
-
- if (!EsdOpenSound)
- return NS_ERROR_FAILURE;
-
- esdref = (*EsdOpenSound)("localhost");
-
- if (!esdref)
- return NS_ERROR_FAILURE;
-
- mInited = true;
-
- return NS_OK;
-}
-
-NS_METHOD nsSound::Beep()
-{
- QApplication::beep();
- return NS_OK;
-}
-
-
-/**
-* This can't be implemented directly with QT.
-* (We can use QSound to play local files but that was not enough.
-* Also support of media formats is limited)
-*
-* Current implementation is copied from GTK side and implementation uses ESD interface.
-*
-* If we have Qtopia then we can drop ESD implementation and use Qtopia "Multimedia API"
-*/
-NS_IMETHODIMP nsSound::OnStreamComplete(nsIStreamLoader *aLoader,
- nsISupports *context,
- nsresult aStatus,
- uint32_t dataLen,
- const uint8_t *data)
-{
-
-#define GET_WORD(s, i) (s[i+1] << 8) | s[i]
-#define GET_DWORD(s, i) (s[i+3] << 24) | (s[i+2] << 16) | (s[i+1] << 8) | s[i]
-
- // print a load error on bad status, and return
- if (NS_FAILED(aStatus)) {
-#ifdef DEBUG
- if (aLoader) {
- nsCOMPtr<nsIRequest> request;
- aLoader->GetRequest(getter_AddRefs(request));
- if (request) {
- nsCOMPtr<nsIURI> uri;
- nsCOMPtr<nsIChannel> channel = do_QueryInterface(request);
- if (channel) {
- channel->GetURI(getter_AddRefs(uri));
- if (uri) {
- nsAutoCString uriSpec;
- uri->GetSpec(uriSpec);
- printf("Failed to load %s\n", uriSpec.get());
- }
- }
- }
- }
-#endif
- return aStatus;
- }
-
- int fd, mask = 0;
- uint32_t samples_per_sec = 0, avg_bytes_per_sec = 0, chunk_len = 0;
- uint16_t format, channels = 1, bits_per_sample = 0;
- const uint8_t *audio = nullptr;
- size_t audio_len = 0;
-
- if (dataLen < 4) {
- NS_WARNING("Sound stream too short to determine its type");
- return NS_ERROR_FAILURE;
- }
-
- if (memcmp(data, "RIFF", 4)) {
-#ifdef DEBUG
- printf("We only support WAV files currently.\n");
-#endif
- return NS_ERROR_FAILURE;
- }
-
- if (dataLen <= WAV_MIN_LENGTH) {
- NS_WARNING("WAV files should be longer than 44 bytes.");
- return NS_ERROR_FAILURE;
- }
-
- uint32_t i = 12;
- while (i + 7 < dataLen) {
- if (!memcmp(data + i, "fmt ", 4) && !chunk_len) {
- i += 4;
-
- /* length of the rest of this subblock (should be 16 for PCM data */
- chunk_len = GET_DWORD(data, i);
- i += 4;
-
- if (chunk_len < 16 || i + chunk_len >= dataLen) {
- NS_WARNING("Invalid WAV file: bad fmt chunk.");
- return NS_ERROR_FAILURE;
- }
-
- format = GET_WORD(data, i);
- i += 2;
-
- channels = GET_WORD(data, i);
- i += 2;
-
- samples_per_sec = GET_DWORD(data, i);
- i += 4;
-
- avg_bytes_per_sec = GET_DWORD(data, i);
- i += 4;
-
- // block align
- i += 2;
-
- bits_per_sample = GET_WORD(data, i);
- i += 2;
-
- /* we don't support WAVs with odd compression codes */
- if (chunk_len != 16)
- NS_WARNING("Extra format bits found in WAV. Ignoring");
-
- i += chunk_len - 16;
- } else if (!memcmp(data + i, "data", 4)) {
- i += 4;
- if (!chunk_len) {
- NS_WARNING("Invalid WAV file: no fmt chunk found");
- return NS_ERROR_FAILURE;
- }
-
- audio_len = GET_DWORD(data, i);
- i += 4;
-
- /* try to play truncated WAVs */
- if (i + audio_len > dataLen)
- audio_len = dataLen - i;
-
- audio = data + i;
- break;
- } else {
- i += 4;
- i += GET_DWORD(data, i);
- i += 4;
- }
- }
-
- if (!audio) {
- NS_WARNING("Invalid WAV file: no data chunk found");
- return NS_ERROR_FAILURE;
- }
-
- /* No audio data? well, at least the WAV was valid. */
- if (!audio_len)
- return NS_OK;
-
-#if 0
- printf("f: %d | c: %d | sps: %li | abps: %li | ba: %d | bps: %d | rate: %li\n",
- format, channels, samples_per_sec, avg_bytes_per_sec, block_align, bits_per_sample, rate);
-#endif
-
- /* open up connection to esd */
- EsdPlayStreamType EsdPlayStream =
- (EsdPlayStreamType) PR_FindFunctionSymbol(elib,
- "esd_play_stream");
- if (!EsdPlayStream)
- return NS_ERROR_FAILURE;
-
- mask = ESD_PLAY | ESD_STREAM;
-
- if (bits_per_sample == 8)
- mask |= ESD_BITS8;
- else
- mask |= ESD_BITS16;
-
- if (channels == 1)
- mask |= ESD_MONO;
- else
- mask |= ESD_STEREO;
-
- nsAutoArrayPtr<uint8_t> buf;
-
- // ESD only handle little-endian data.
- // Swap the byte order if we're on a big-endian architecture.
-#ifdef IS_BIG_ENDIAN
- if (bits_per_sample != 8) {
- buf = new uint8_t[audio_len];
- if (!buf)
- return NS_ERROR_OUT_OF_MEMORY;
- for (uint32_t j = 0; j + 2 < audio_len; j += 2) {
- buf[j] = audio[j + 1];
- buf[j + 1] = audio[j];
- }
-
- audio = buf;
- }
-#endif
-
- fd = (*EsdPlayStream)(mask, samples_per_sec, nullptr, "mozillaSound");
-
- if (fd < 0) {
- int *esd_audio_format = (int *) PR_FindSymbol(elib, "esd_audio_format");
- int *esd_audio_rate = (int *) PR_FindSymbol(elib, "esd_audio_rate");
- EsdAudioOpenType EsdAudioOpen = (EsdAudioOpenType) PR_FindFunctionSymbol(elib, "esd_audio_open");
- EsdAudioWriteType EsdAudioWrite = (EsdAudioWriteType) PR_FindFunctionSymbol(elib, "esd_audio_write");
- EsdAudioCloseType EsdAudioClose = (EsdAudioCloseType) PR_FindFunctionSymbol(elib, "esd_audio_close");
-
- if (!esd_audio_format || !esd_audio_rate ||
- !EsdAudioOpen || !EsdAudioWrite || !EsdAudioClose)
- return NS_ERROR_FAILURE;
-
- *esd_audio_format = mask;
- *esd_audio_rate = samples_per_sec;
- fd = (*EsdAudioOpen)();
-
- if (fd < 0)
- return NS_ERROR_FAILURE;
-
- (*EsdAudioWrite)(audio, audio_len);
- (*EsdAudioClose)();
- } else {
- while (audio_len > 0) {
- size_t written = write(fd, audio, audio_len);
- if (written <= 0)
- break;
- audio += written;
- audio_len -= written;
- }
- close(fd);
- }
-
- return NS_OK;
-}
-
-NS_METHOD nsSound::Play(nsIURL *aURL)
-{
- nsresult rv;
-
- if (!mInited)
- Init();
-
- if (!elib)
- return NS_ERROR_NOT_AVAILABLE;
-
- nsCOMPtr<nsIStreamLoader> loader;
- rv = NS_NewStreamLoader(getter_AddRefs(loader), aURL, this);
-
- return rv;
-}
-
-NS_IMETHODIMP nsSound::PlaySystemSound(const nsAString &aSoundAlias)
-{
- if (NS_IsMozAliasSound(aSoundAlias)) {
- NS_WARNING("nsISound::playSystemSound is called with \"_moz_\" events, they are obsolete, use nsISound::playEventSound instead");
- if (aSoundAlias.Equals(NS_SYSSOUND_MAIL_BEEP))
- return Beep();
- return NS_OK;
- }
-
- nsresult rv;
- nsCOMPtr <nsIURI> fileURI;
-
- // create a nsIFile and then a nsIFileURL from that
- nsCOMPtr <nsIFile> soundFile;
- rv = NS_NewLocalFile(aSoundAlias, true,
- getter_AddRefs(soundFile));
- NS_ENSURE_SUCCESS(rv,rv);
-
- rv = NS_NewFileURI(getter_AddRefs(fileURI), soundFile);
- NS_ENSURE_SUCCESS(rv,rv);
-
- nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(fileURI,&rv);
- NS_ENSURE_SUCCESS(rv,rv);
-
- rv = Play(fileURL);
- return rv;
-
-}
-
-NS_IMETHODIMP nsSound::PlayEventSound(uint32_t aEventId)
-{
- return aEventId == EVENT_NEW_MAIL_RECEIVED ? Beep() : NS_OK;
-}
-
deleted file mode 100644
--- a/widget/qt/nsSound.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef __nsSound_h__
-#define __nsSound_h__
-
-#include "nsISound.h"
-#include "nsIStreamLoader.h"
-
-class nsSound : public nsISound,
- public nsIStreamLoaderObserver
-{
- public:
-
- nsSound();
- virtual ~nsSound();
-
- static void Shutdown();
-
- NS_DECL_ISUPPORTS
- NS_DECL_NSISOUND
- NS_DECL_NSISTREAMLOADEROBSERVER
-
-private:
- bool mInited;
-
-};
-
-#endif /* __nsSound_h__ */
--- a/widget/qt/nsWidgetFactory.cpp
+++ b/widget/qt/nsWidgetFactory.cpp
@@ -1,82 +1,67 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+/* Copyright 2012 Mozilla Foundation and Mozilla contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
-#include "nsWindow.h"
-#include "nsAppShell.h"
+#include "base/basictypes.h"
#include "mozilla/ModuleUtils.h"
-#include "nsIModule.h"
#include "nsCOMPtr.h"
#include "nsWidgetsCID.h"
-#include "nsHTMLFormatConverter.h"
-#include "nsTransferable.h"
+#include "nsAppShell.h"
+
+#include "nsWindow.h"
#include "nsLookAndFeel.h"
#include "nsAppShellSingleton.h"
#include "nsScreenManagerQt.h"
-#include "nsFilePicker.h"
-#include "nsClipboard.h"
-#include "nsClipboardHelper.h"
#include "nsIdleServiceQt.h"
-#include "nsDragService.h"
-#include "nsSound.h"
+#include "nsTransferable.h"
#include "nsBidiKeyboard.h"
-#include "nsNativeThemeQt.h"
+
+#include "nsHTMLFormatConverter.h"
+#include "nsXULAppAPI.h"
+
#ifdef NS_PRINTING
#include "nsDeviceContextSpecQt.h"
#include "nsPrintSession.h"
#include "nsPrintOptionsQt.h"
#include "nsPrintDialogQt.h"
#endif
-#include "nsFilePickerProxy.h"
-#include "nsXULAppAPI.h"
+
+#include "nsClipboard.h"
+#include "nsClipboardHelper.h"
#if defined(MOZ_X11)
#include "GfxInfoX11.h"
#endif
-// from nsWindow.cpp
-extern bool gDisableNativeTheme;
+using namespace mozilla::widget;
NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsChildWindow)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsPopupWindow)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerQt)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter)
+NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceQt, nsIdleServiceQt::GetInstance)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerQt)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboard)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard)
-NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceQt, nsIdleServiceQt::GetInstance)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound)
-
-static nsresult
-nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
- void **aResult)
-{
- *aResult = nullptr;
- if (aOuter != nullptr) {
- return NS_ERROR_NO_AGGREGATION;
- }
- nsCOMPtr<nsIFilePicker> picker;
-
- if (XRE_GetProcessType() == GeckoProcessType_Content)
- picker = new nsFilePickerProxy();
- else
- picker = new nsFilePicker;
-
- return picker->QueryInterface(aIID, aResult);
-}
-
-
#ifdef NS_PRINTING
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecQt)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsQt, Init)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorQt)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceQt, Init)
#endif
@@ -85,132 +70,89 @@ namespace mozilla {
namespace widget {
// This constructor should really be shared with all platforms.
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init)
}
}
#endif
-static nsresult
-nsNativeThemeQtConstructor(nsISupports *aOuter, REFNSIID aIID,
- void **aResult)
-{
- nsresult rv;
- nsNativeThemeQt *inst;
-
- if (gDisableNativeTheme)
- return NS_ERROR_NO_INTERFACE;
-
- *aResult = nullptr;
- if (nullptr != aOuter)
- return NS_ERROR_NO_AGGREGATION;
-
- inst = new nsNativeThemeQt();
- if (nullptr == inst)
- return NS_ERROR_OUT_OF_MEMORY;
-
- NS_ADDREF(inst);
- rv = inst->QueryInterface(aIID, aResult);
- NS_RELEASE(inst);
-
- return rv;
-}
-
+NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
+NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
NS_DEFINE_NAMED_CID(NS_WINDOW_CID);
NS_DEFINE_NAMED_CID(NS_CHILD_CID);
-NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
-NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
-NS_DEFINE_NAMED_CID(NS_SOUND_CID);
+NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
+NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
+NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
-NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
-NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
-NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
-NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
-NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID);
-NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
-NS_DEFINE_NAMED_CID(NS_POPUP_CID);
+#if defined(MOZ_X11)
+NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
+#endif
#ifdef NS_PRINTING
NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID);
#endif
-#if defined(MOZ_X11)
-NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
-#endif
-
static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
- { &kNS_WINDOW_CID, false, nullptr, nsWindowConstructor },
- { &kNS_CHILD_CID, false, nullptr, nsChildWindowConstructor },
{ &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor },
- { &kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor },
- { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor },
- { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor },
+ { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor },
+ { &kNS_CHILD_CID, false, nullptr, nsWindowConstructor },
{ &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor },
{ &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor },
- { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor },
{ &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor },
- { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor },
+ { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceQtConstructor },
{ &kNS_SCREENMANAGER_CID, false, nullptr, nsScreenManagerQtConstructor },
- { &kNS_THEMERENDERER_CID, false, nullptr, nsNativeThemeQtConstructor },
- { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceQtConstructor },
- { &kNS_POPUP_CID, false, nullptr, nsPopupWindowConstructor },
+ { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor },
+ { &kNS_WINDOW_CID, false, nullptr, nsWindowConstructor },
+#if defined(MOZ_X11)
+ { &kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor },
+#endif
#ifdef NS_PRINTING
- { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsQtConstructor },
+ { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecQtConstructor },
+ { &kNS_PRINTDIALOGSERVICE_CID, false, nullptr, nsPrintDialogServiceQtConstructor },
{ &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorQtConstructor },
{ &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor },
- { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecQtConstructor },
- { &kNS_PRINTDIALOGSERVICE_CID, false, nullptr, nsPrintDialogServiceQtConstructor },
-#endif
-#if defined(MOZ_X11)
- { &kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor },
+ { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsQtConstructor },
#endif
{ nullptr }
};
static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
- { "@mozilla.org/widget/window/qt;1", &kNS_WINDOW_CID },
- { "@mozilla.org/widgets/child_window/qt;1", &kNS_CHILD_CID },
+ { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID },
{ "@mozilla.org/widget/appshell/qt;1", &kNS_APPSHELL_CID },
- { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID },
- { "@mozilla.org/sound;1", &kNS_SOUND_CID },
- { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID },
+ { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID },
{ "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID },
{ "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID },
- { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID },
{ "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID },
- { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID },
- { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID },
- { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID },
{ "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID },
- { "@mozilla.org/widgets/popup_window/qt;1", &kNS_POPUP_CID },
+ { "@mozilla.org/widgets/child_window/qt;1", &kNS_CHILD_CID },
+ { "@mozilla.org/widgets/window/qt;1", &kNS_WINDOW_CID },
+ { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID },
+#if defined(MOZ_X11)
+ { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID },
+#endif
#ifdef NS_PRINTING
- { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID },
+ { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID },
{ "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID },
{ "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID },
- { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID },
+ { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID },
{ NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID },
#endif
-#if defined(MOZ_X11)
- { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID },
-#endif
{ nullptr }
};
static void
nsWidgetQtModuleDtor()
{
nsLookAndFeel::Shutdown();
- nsSound::Shutdown();
- nsWindow::ReleaseGlobals();
nsAppShellShutdown();
}
static const mozilla::Module kWidgetModule = {
mozilla::Module::kVersion,
kWidgetCIDs,
kWidgetContracts,
nullptr,
--- a/widget/qt/nsWindow.cpp
+++ b/widget/qt/nsWindow.cpp
@@ -6,324 +6,595 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/ArrayUtils.h"
#include "mozilla/MiscEvents.h"
#include "mozilla/MouseEvents.h"
#include "mozilla/TextEvents.h"
#include "mozilla/TouchEvents.h"
-#include <QApplication>
-#include <QDesktopWidget>
+#include <QGuiApplication>
#include <QtGui/QCursor>
#include <QIcon>
-#include <QGraphicsScene>
-#include <QGraphicsView>
-#include <QGraphicsSceneContextMenuEvent>
-#include <QGraphicsSceneDragDropEvent>
-#include <QGraphicsSceneMouseEvent>
-#include <QGraphicsSceneHoverEvent>
-#include <QGraphicsSceneWheelEvent>
-#include <QGraphicsSceneResizeEvent>
-#include <QStyleOptionGraphicsItem>
+#include <QMouseEvent>
+#include <QWheelEvent>
+#include <QResizeEvent>
#include <QPaintEngine>
#include <QMimeData>
-#include "mozqglwidgetwrapper.h"
+#include <QScreen>
#include <QtCore/QDebug>
#include <QtCore/QEvent>
#include <QtCore/QVariant>
#include <algorithm>
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0))
-#include <QPinchGesture>
-#include <QGestureRecognizer>
-#include "mozSwipeGesture.h"
-static Qt::GestureType gSwipeGestureId = Qt::CustomGesture;
-
-// How many milliseconds mouseevents are blocked after receiving
-// multitouch.
-static const float GESTURES_BLOCK_MOUSE_FOR = 200;
-#ifdef MOZ_ENABLE_QTMOBILITY
-#include <QtSensors/QOrientationSensor>
-using namespace QtMobility;
-#endif // MOZ_ENABLE_QTMOBILITY
-#endif // QT version check 4.6
#ifdef MOZ_X11
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#endif //MOZ_X11
#include "nsXULAppAPI.h"
#include "prlink.h"
#include "nsWindow.h"
#include "mozqwidget.h"
-#ifdef MOZ_ENABLE_QTMOBILITY
-#include "mozqorientationsensorfilter.h"
-#endif
-
#include "nsIdleService.h"
#include "nsRenderingContext.h"
#include "nsIRollupListener.h"
#include "nsWidgetsCID.h"
#include "nsQtKeyUtils.h"
#include "mozilla/Services.h"
#include "mozilla/Preferences.h"
#include "mozilla/Likely.h"
#include "mozilla/layers/LayersTypes.h"
#include "nsIWidgetListener.h"
+#include "ClientLayerManager.h"
+#include "BasicLayers.h"
#include "nsIStringBundle.h"
#include "nsGfxCIID.h"
#include "imgIContainer.h"
#include "nsGfxCIID.h"
#include "nsIInterfaceRequestorUtils.h"
#include "nsAutoPtr.h"
#include "gfxQtPlatform.h"
-#ifdef MOZ_X11
-#include "gfxXlibSurface.h"
-#endif
-#include "gfxQPainterSurface.h"
#include "gfxContext.h"
#include "gfxImageSurface.h"
-#include "nsIDOMSimpleGestureEvent.h" //Gesture support
#include "nsIDOMWheelEvent.h"
+#include "GLContext.h"
+
#ifdef MOZ_X11
#include "keysym2ucs.h"
#endif
#include "gfxUtils.h"
#include "Layers.h"
#include "GLContextProvider.h"
-#include "nsFastStartupQt.h"
-
-// If embedding clients want to create widget without real parent window
-// then nsIBaseWindow->Init() should have parent argument equal to PARENTLESS_WIDGET
-#define PARENTLESS_WIDGET (void*)0x13579
-
-#include "nsShmImage.h"
-extern "C" {
-#define PIXMAN_DONT_DEFINE_STDINT
-#include "pixman.h"
-}
using namespace mozilla;
+using namespace mozilla::gl;
using namespace mozilla::widget;
+using namespace mozilla::gfx;
+using namespace mozilla::layers;
using mozilla::gl::GLContext;
-// Cached offscreen surface
-static nsRefPtr<gfxASurface> gBufferSurface;
-#ifdef MOZ_HAVE_SHMIMAGE
-// If we're using xshm rendering, mThebesSurface wraps gShmImage
-nsRefPtr<nsShmImage> gShmImage;
-#endif
-
-static int gBufferPixmapUsageCount = 0;
-static gfxIntSize gBufferMaxSize(0, 0);
-
-// initialization static functions
-static nsresult initialize_prefs (void);
-
-static NS_DEFINE_IID(kCDragServiceCID, NS_DRAGSERVICE_CID);
-
-#define NS_WINDOW_TITLE_MAX_LENGTH 4095
-
#define kWindowPositionSlop 20
// Qt
static const int WHEEL_DELTA = 120;
static bool gGlobalsInitialized = false;
-
-static bool
-is_mouse_in_window (MozQWidget* aWindow, double aMouseX, double aMouseY);
-
static bool sAltGrModifier = false;
-#ifdef MOZ_ENABLE_QTMOBILITY
-static QOrientationSensor *gOrientation = nullptr;
-static MozQOrientationSensorFilter gOrientationFilter;
-#endif
-
-static bool
-isContextMenuKeyEvent(const QKeyEvent *qe)
-{
- uint32_t kc = QtKeyCodeToDOMKeyCode(qe->key());
- if (qe->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier))
- return false;
-
- bool isShift = qe->modifiers() & Qt::ShiftModifier;
- return (kc == NS_VK_F10 && isShift) ||
- (kc == NS_VK_CONTEXT_MENU && !isShift);
-}
-
-static void
-InitKeyEvent(WidgetKeyboardEvent &aEvent, QKeyEvent *aQEvent)
-{
- aEvent.InitBasicModifiers(aQEvent->modifiers() & Qt::ControlModifier,
- aQEvent->modifiers() & Qt::AltModifier,
- aQEvent->modifiers() & Qt::ShiftModifier,
- aQEvent->modifiers() & Qt::MetaModifier);
- aEvent.mIsRepeat =
- (aEvent.message == NS_KEY_DOWN || aEvent.message == NS_KEY_PRESS) &&
- aQEvent->isAutoRepeat();
- aEvent.time = 0;
-
- if (sAltGrModifier) {
- aEvent.modifiers |= (MODIFIER_CONTROL | MODIFIER_ALT);
- }
-
- // The transformations above and in qt for the keyval are not invertible
- // so link to the QKeyEvent (which will vanish soon after return from the
- // event callback) to give plugins access to hardware_keycode and state.
- // (An XEvent would be nice but the QKeyEvent is good enough.)
- aEvent.pluginEvent = (void *)aQEvent;
-}
+static void find_first_visible_parent(QWindow* aItem, QWindow*& aVisibleItem);
+static bool is_mouse_in_window (MozQWidget* aWindow, double aMouseX, double aMouseY);
+static bool isContextMenuKeyEvent(const QKeyEvent *qe);
+static void InitKeyEvent(WidgetKeyboardEvent &aEvent, QKeyEvent *aQEvent);
nsWindow::nsWindow()
{
LOG(("%s [%p]\n", __PRETTY_FUNCTION__, (void *)this));
mIsTopLevel = false;
mIsDestroyed = false;
mIsShown = false;
mEnabled = true;
mWidget = nullptr;
- mIsVisible = false;
+ mVisible = false;
mActivatePending = false;
mWindowType = eWindowType_child;
mSizeState = nsSizeMode_Normal;
mLastSizeMode = nsSizeMode_Normal;
- mPluginType = PluginType_NONE;
mQCursor = Qt::ArrowCursor;
mNeedsResize = false;
mNeedsMove = false;
mListenForResizes = false;
mNeedsShow = false;
- mGesturesCancelled = false;
mTimerStarted = false;
- mPinchEvent.needDispatch = false;
mMoveEvent.needDispatch = false;
-
+
if (!gGlobalsInitialized) {
gfxPlatform::GetPlatform();
gGlobalsInitialized = true;
-
- // It's OK if either of these fail, but it may not be one day.
- initialize_prefs();
}
memset(mKeyDownFlags, 0, sizeof(mKeyDownFlags));
mIsTransparent = false;
mCursor = eCursor_standard;
-
- gBufferPixmapUsageCount++;
-
-#if (QT_VERSION > QT_VERSION_CHECK(4,6,0))
- if (gSwipeGestureId == Qt::CustomGesture) {
- // QGestureRecognizer takes ownership
- MozSwipeGestureRecognizer* swipeRecognizer = new MozSwipeGestureRecognizer;
- gSwipeGestureId = QGestureRecognizer::registerRecognizer(swipeRecognizer);
- }
-#endif
-}
-
-static inline gfxImageFormat
-_depth_to_gfximage_format(int32_t aDepth)
-{
- switch (aDepth) {
- case 32:
- return gfxImageFormat::ARGB32;
- case 24:
- return gfxImageFormat::RGB24;
- case 16:
- return gfxImageFormat::RGB16_565;
- default:
- return gfxImageFormat::Unknown;
- }
-}
-
-static inline QImage::Format
-_gfximage_to_qformat(gfxImageFormat aFormat)
-{
- switch (aFormat) {
- case gfxImageFormat::ARGB32:
- return QImage::Format_ARGB32_Premultiplied;
- case gfxImageFormat::RGB24:
- return QImage::Format_ARGB32;
- case gfxImageFormat::RGB16_565:
- return QImage::Format_RGB16;
- default:
- return QImage::Format_Invalid;
- }
-}
-
-static bool
-UpdateOffScreenBuffers(int aDepth, QSize aSize, QWidget* aWidget = nullptr)
-{
- gfxIntSize size(aSize.width(), aSize.height());
- if (gBufferSurface) {
- if (gBufferMaxSize.width < size.width ||
- gBufferMaxSize.height < size.height) {
- gBufferSurface = nullptr;
- } else
- return true;
- }
-
- gBufferMaxSize.width = std::max(gBufferMaxSize.width, size.width);
- gBufferMaxSize.height = std::max(gBufferMaxSize.height, size.height);
-
- // Check if system depth has related gfxImage format
- gfxImageFormat format =
- _depth_to_gfximage_format(aDepth);
-
- // Use fallback RGB24 format, Qt will do conversion for us
- if (format == gfxImageFormat::Unknown)
- format = gfxImageFormat::RGB24;
-
-#ifdef MOZ_HAVE_SHMIMAGE
- if (aWidget) {
- if (gfxPlatform::GetPlatform()->ScreenReferenceSurface()->GetType() ==
- gfxSurfaceType::Image) {
- gShmImage = nsShmImage::Create(gBufferMaxSize,
- DefaultVisualOfScreen(gfxQtPlatform::GetXScreen(aWidget)),
- aDepth);
- gBufferSurface = gShmImage->AsSurface();
- return true;
- }
- }
-#endif
-
- gBufferSurface = gfxPlatform::GetPlatform()->
- CreateOffscreenSurface(gBufferMaxSize.ToIntSize(),
- gfxASurface::ContentFromFormat(format));
-
- return true;
}
nsWindow::~nsWindow()
{
LOG(("%s [%p]\n", __PRETTY_FUNCTION__, (void *)this));
Destroy();
}
-/* static */ void
-nsWindow::ReleaseGlobals()
+nsresult
+nsWindow::Create(nsIWidget *aParent,
+ nsNativeWidget aNativeParent,
+ const nsIntRect &aRect,
+ nsDeviceContext *aContext,
+ nsWidgetInitData *aInitData)
+{
+ // only set the base parent if we're not going to be a dialog or a
+ // toplevel
+ nsIWidget *baseParent = aParent;
+
+ // initialize all the common bits of this class
+ BaseCreate(baseParent, aRect, aContext, aInitData);
+
+ mVisible = true;
+
+ // and do our common creation
+ mParent = (nsWindow *)aParent;
+
+ // save our bounds
+ mBounds = aRect;
+
+ // find native parent
+ MozQWidget *parent = nullptr;
+
+ if (aParent != nullptr) {
+ parent = static_cast<MozQWidget*>(aParent->GetNativeData(NS_NATIVE_WIDGET));
+ } else if (aNativeParent != nullptr) {
+ parent = static_cast<MozQWidget*>(aNativeParent);
+ if (parent && mParent == nullptr) {
+ mParent = parent->getReceiver();
+ }
+ }
+
+ LOG(("Create: nsWindow [%p] mWidget:[%p] parent:[%p], natPar:[%p] mParent:%p\n", (void *)this, (void*)mWidget, parent, aNativeParent, mParent));
+
+ // ok, create our QGraphicsWidget
+ mWidget = createQWidget(parent, aInitData);
+
+ if (!mWidget) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+
+ // resize so that everything is set to the right dimensions
+ Resize(mBounds.x, mBounds.y, mBounds.width, mBounds.height, false);
+
+ // check if we should listen for resizes
+ mListenForResizes = (aNativeParent ||
+ (aInitData && aInitData->mListenForResizes));
+
+ return NS_OK;
+}
+
+MozQWidget*
+nsWindow::createQWidget(MozQWidget* parent,
+ nsWidgetInitData* aInitData)
{
+ const char *windowName = nullptr;
+ Qt::WindowFlags flags = Qt::Widget;
+
+ // ok, create our windows
+ switch (mWindowType) {
+ case eWindowType_dialog:
+ windowName = "topLevelDialog";
+ flags = Qt::Dialog;
+ break;
+ case eWindowType_popup:
+ windowName = "topLevelPopup";
+ flags = Qt::Popup;
+ break;
+ case eWindowType_toplevel:
+ windowName = "topLevelWindow";
+ flags = Qt::Window;
+ break;
+ case eWindowType_invisible:
+ windowName = "topLevelInvisible";
+ break;
+ case eWindowType_child:
+ case eWindowType_plugin:
+ default: // sheet
+ windowName = "paintArea";
+ break;
+ }
+
+ MozQWidget* widget = new MozQWidget(this, parent);
+ if (!widget) {
+ return nullptr;
+ }
+
+ widget->setObjectName(QString(windowName));
+ if (mWindowType == eWindowType_invisible) {
+ widget->setVisibility(QWindow::Hidden);
+ }
+ if (mWindowType == eWindowType_dialog) {
+ widget->setModality(Qt::WindowModal);
+ }
+
+ widget->create();
+
+ // create a QGraphicsView if this is a new toplevel window
+ LOG(("nsWindow::%s [%p] Created Window: %s, widget:%p, par:%p\n", __FUNCTION__, (void *)this, windowName, widget, parent));
+
+ return widget;
+}
+
+NS_IMETHODIMP
+nsWindow::Destroy(void)
+{
+ if (mIsDestroyed || !mWidget) {
+ return NS_OK;
+ }
+
+ LOG(("nsWindow::Destroy [%p]\n", (void *)this));
+ mIsDestroyed = true;
+
+ /** Need to clean our LayerManager up while still alive */
+ if (mLayerManager) {
+ mLayerManager->Destroy();
+ }
+ mLayerManager = nullptr;
+
+ // It is safe to call DestroyeCompositor several times (here and
+ // in the parent class) since it will take effect only once.
+ // The reason we call it here is because on gtk platforms we need
+ // to destroy the compositor before we destroy the gdk window (which
+ // destroys the the gl context attached to it).
+ DestroyCompositor();
+
+ ClearCachedResources();
+
+ nsIRollupListener* rollupListener = nsBaseWidget::GetActiveRollupListener();
+ if (rollupListener) {
+ nsCOMPtr<nsIWidget> rollupWidget = rollupListener->GetRollupWidget();
+ if (static_cast<nsIWidget *>(this) == rollupWidget) {
+ rollupListener->Rollup(0, nullptr, nullptr);
+ }
+ }
+
+ Show(false);
+
+ // walk the list of children and call destroy on them. Have to be
+ // careful, though -- calling destroy on a kid may actually remove
+ // it from our child list, losing its sibling links.
+ for (nsIWidget* kid = mFirstChild; kid; ) {
+ nsIWidget* next = kid->GetNextSibling();
+ kid->Destroy();
+ kid = next;
+ }
+
+ // Destroy thebes surface now. Badness can happen if we destroy
+ // the surface after its X Window.
+ if (mWidget) {
+ mWidget->dropReceiver();
+
+ // Call deleteLater instead of delete; Qt still needs the object
+ // to be valid even after sending it a Close event. We could
+ // also set WA_DeleteOnClose, but this gives us more control.
+ mWidget->deleteLater();
+ }
+ mWidget = nullptr;
+
+ OnDestroy();
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsWindow::Show(bool aState)
+{
+ LOG(("nsWindow::Show [%p] state %d\n", (void *)this, aState));
+ if (aState == mIsShown) {
+ return NS_OK;
+ }
+
+ // Clear our cached resources when the window is hidden.
+ if (mIsShown && !aState) {
+ ClearCachedResources();
+ }
+
+ mIsShown = aState;
+
+ if ((aState && !AreBoundsSane()) || !mWidget) {
+ LOG(("\tbounds are insane or window hasn't been created yet\n"));
+ mNeedsShow = true;
+ return NS_OK;
+ }
+
+ if (aState) {
+ if (mNeedsMove) {
+ NativeResize(mBounds.x, mBounds.y, mBounds.width, mBounds.height,
+ false);
+ } else if (mNeedsResize) {
+ NativeResize(mBounds.width, mBounds.height, false);
+ }
+ }
+ else {
+ // If someone is hiding this widget, clear any needing show flag.
+ mNeedsShow = false;
+ }
+
+ NativeShow(aState);
+
+ return NS_OK;
+}
+
+bool
+nsWindow::IsVisible() const
+{
+ return mIsShown;
}
-NS_IMPL_ISUPPORTS_INHERITED1(nsWindow, nsBaseWidget, nsISupportsWeakReference)
+NS_IMETHODIMP
+nsWindow::ConstrainPosition(bool aAllowSlop, int32_t *aX, int32_t *aY)
+{
+ if (!mWidget) {
+ return NS_ERROR_FAILURE;
+ }
+
+ int32_t screenWidth = qApp->primaryScreen()->size().width();
+ int32_t screenHeight = qApp->primaryScreen()->size().height();
+
+ if (aAllowSlop) {
+ if (*aX < (kWindowPositionSlop - mBounds.width))
+ *aX = kWindowPositionSlop - mBounds.width;
+ if (*aX > (screenWidth - kWindowPositionSlop))
+ *aX = screenWidth - kWindowPositionSlop;
+ if (*aY < (kWindowPositionSlop - mBounds.height))
+ *aY = kWindowPositionSlop - mBounds.height;
+ if (*aY > (screenHeight - kWindowPositionSlop))
+ *aY = screenHeight - kWindowPositionSlop;
+ } else {
+ if (*aX < 0)
+ *aX = 0;
+ if (*aX > (screenWidth - mBounds.width))
+ *aX = screenWidth - mBounds.width;
+ if (*aY < 0)
+ *aY = 0;
+ if (*aY > (screenHeight - mBounds.height))
+ *aY = screenHeight - mBounds.height;
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsWindow::Move(double aX, double aY)
+{
+ LOG(("nsWindow::Move [%p] %f %f\n", (void *)this,
+ aX, aY));
+
+ int32_t x = NSToIntRound(aX);
+ int32_t y = NSToIntRound(aY);
+
+ if (mIsTopLevel) {
+ SetSizeMode(nsSizeMode_Normal);
+ }
+
+ if (x == mBounds.x && y == mBounds.y) {
+ return NS_OK;
+ }
+
+ mNeedsMove = false;
+
+ // update the bounds
+ QPoint pos(x, y);
+ if (mIsTopLevel) {
+ mWidget->setPosition(x, y);
+ }
+ else if (mWidget) {
+ // the position of the widget is set relative to the parent
+ // so we map the coordinates accordingly
+ pos = mWidget->mapToGlobal(pos);
+ mWidget->setPosition(pos);
+ }
+
+ mBounds.x = pos.x();
+ mBounds.y = pos.y();
+
+ NotifyRollupGeometryChange();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsWindow::Resize(double aWidth, double aHeight, bool aRepaint)
+{
+ mBounds.width = NSToIntRound(aWidth);
+ mBounds.height = NSToIntRound(aHeight);
+
+ if (!mWidget)
+ return NS_OK;
+
+ if (mIsShown) {
+ if (AreBoundsSane()) {
+ if (mIsTopLevel || mNeedsShow)
+ NativeResize(mBounds.x, mBounds.y,
+ mBounds.width, mBounds.height, aRepaint);
+ else
+ NativeResize(mBounds.width, mBounds.height, aRepaint);
+
+ // Does it need to be shown because it was previously insane?
+ if (mNeedsShow) {
+ NativeShow(true);
+ }
+ }
+ else {
+ // If someone has set this so that the needs show flag is false
+ // and it needs to be hidden, update the flag and hide the
+ // window. This flag will be cleared the next time someone
+ // hides the window or shows it. It also prevents us from
+ // calling NativeShow(false) excessively on the window which
+ // causes unneeded X traffic.
+ if (!mNeedsShow) {
+ mNeedsShow = true;
+ NativeShow(false);
+ }
+ }
+ }
+ else if (AreBoundsSane() && mListenForResizes) {
+ // For widgets that we listen for resizes for (widgets created
+ // with native parents) we apparently _always_ have to resize. I
+ // dunno why, but apparently we're lame like that.
+ NativeResize(mBounds.width, mBounds.height, aRepaint);
+ }
+ else {
+ mNeedsResize = true;
+ }
+
+ // synthesize a resize event if this isn't a toplevel
+ if (mIsTopLevel || mListenForResizes) {
+ nsEventStatus status;
+ DispatchResizeEvent(mBounds, status);
+ }
+
+ NotifyRollupGeometryChange();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsWindow::Resize(double aX, double aY, double aWidth, double aHeight,
+ bool aRepaint)
+{
+ mBounds.x = NSToIntRound(aX);
+ mBounds.y = NSToIntRound(aY);
+ mBounds.width = NSToIntRound(aWidth);
+ mBounds.height = NSToIntRound(aHeight);
+
+ mPlaced = true;
+
+ if (!mWidget) {
+ return NS_OK;
+ }
+
+ // Has this widget been set to visible?
+ if (mIsShown) {
+ // Are the bounds sane?
+ if (AreBoundsSane()) {
+ // Yep? Resize the window
+ NativeResize(mBounds.x, mBounds.y, mBounds.width, mBounds.height,
+ aRepaint);
+ // Does it need to be shown because it was previously insane?
+ if (mNeedsShow)
+ NativeShow(true);
+ }
+ else {
+ // If someone has set this so that the needs show flag is false
+ // and it needs to be hidden, update the flag and hide the
+ // window. This flag will be cleared the next time someone
+ // hides the window or shows it. It also prevents us from
+ // calling NativeShow(false) excessively on the window which
+ // causes unneeded X traffic.
+ if (!mNeedsShow) {
+ mNeedsShow = true;
+ NativeShow(false);
+ }
+ }
+ }
+ // If the widget hasn't been shown, mark the widget as needing to be
+ // resized before it is shown
+ else if (AreBoundsSane() && mListenForResizes) {
+ // For widgets that we listen for resizes for (widgets created
+ // with native parents) we apparently _always_ have to resize. I
+ // dunno why, but apparently we're lame like that.
+ NativeResize(mBounds.x, mBounds.y, mBounds.width, mBounds.height,
+ aRepaint);
+ }
+ else {
+ mNeedsResize = true;
+ mNeedsMove = true;
+ }
+
+ if (mIsTopLevel || mListenForResizes) {
+ // synthesize a resize event
+ nsEventStatus status;
+ DispatchResizeEvent(mBounds, status);
+ }
+
+ if (aRepaint) {
+ mWidget->renderLater();
+ }
+
+ NotifyRollupGeometryChange();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsWindow::Enable(bool aState)
+{
+ mEnabled = aState;
+
+ return NS_OK;
+}
+
+bool
+nsWindow::IsEnabled() const
+{
+ return mEnabled;
+}
+
+NS_IMETHODIMP
+nsWindow::SetFocus(bool aRaise)
+{
+ // Make sure that our owning widget has focus. If it doesn't try to
+ // grab it. Note that we don't set our focus flag in this case.
+ LOGFOCUS((" SetFocus [%p]\n", (void *)this));
+
+ if (!mWidget) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (mWidget->focusObject()) {
+ return NS_OK;
+ }
+
+ // Because QGraphicsItem cannot get the focus if they are
+ // invisible, we look up the chain, for the lowest visible
+ // parent and focus that one
+ QWindow* realFocusItem = nullptr;
+ find_first_visible_parent(mWidget, realFocusItem);
+
+ if (!realFocusItem || realFocusItem->focusObject()) {
+ return NS_OK;
+ }
+
+ if (aRaise && mWidget) {
+ // the raising has to happen on the view widget
+ mWidget->raise();
+ }
+
+ // XXXndeakin why is this here? It should dispatch only when the OS
+ // notifies us.
+ DispatchActivateEvent();
+
+ return NS_OK;
+}
NS_IMETHODIMP
nsWindow::ConfigureChildren(const nsTArray<nsIWidget::Configuration>& aConfigurations)
{
for (uint32_t i = 0; i < aConfigurations.Length(); ++i) {
const Configuration& configuration = aConfigurations[i];
nsWindow* w = static_cast<nsWindow*>(configuration.mChild);
@@ -337,837 +608,261 @@ nsWindow::ConfigureChildren(const nsTArr
} else if (w->mBounds.TopLeft() != configuration.mBounds.TopLeft()) {
w->Move(configuration.mBounds.x, configuration.mBounds.y);
}
}
return NS_OK;
}
NS_IMETHODIMP
-nsWindow::Destroy(void)
+nsWindow::Invalidate(const nsIntRect &aRect)
{
- if (mIsDestroyed || !mWidget)
- return NS_OK;
-
- LOG(("nsWindow::Destroy [%p]\n", (void *)this));
- mIsDestroyed = true;
-
- if (gBufferPixmapUsageCount &&
- --gBufferPixmapUsageCount == 0) {
+ LOGDRAW(("Invalidate (rect) [%p,%p]: %d %d %d %d\n", (void *)this,
+ (void*)mWidget,aRect.x, aRect.y, aRect.width, aRect.height));
- gBufferSurface = nullptr;
-#ifdef MOZ_HAVE_SHMIMAGE
- gShmImage = nullptr;
-#endif
-#ifdef MOZ_ENABLE_QTMOBILITY
- if (gOrientation) {
- gOrientation->removeFilter(&gOrientationFilter);
- gOrientation->stop();
- delete gOrientation;
- gOrientation = nullptr;
- }
-#endif
+ if (!mWidget) {
+ return NS_OK;
}
- /** Need to clean our LayerManager up while still alive */
- if (mLayerManager) {
- mLayerManager->Destroy();
- }
- mLayerManager = nullptr;
-
- // It is safe to call DestroyeCompositor several times (here and
- // in the parent class) since it will take effect only once.
- // The reason we call it here is because on gtk platforms we need
- // to destroy the compositor before we destroy the gdk window (which
- // destroys the the gl context attached to it).
- DestroyCompositor();
-
- ClearCachedResources();
-
- nsIRollupListener* rollupListener = nsBaseWidget::GetActiveRollupListener();
- if (rollupListener) {
- nsCOMPtr<nsIWidget> rollupWidget = rollupListener->GetRollupWidget();
- if (static_cast<nsIWidget *>(this) == rollupWidget) {
- rollupListener->Rollup(0, nullptr);
- }
- }
-
- Show(false);
-
- // walk the list of children and call destroy on them. Have to be
- // careful, though -- calling destroy on a kid may actually remove
- // it from our child list, losing its sibling links.
- for (nsIWidget* kid = mFirstChild; kid; ) {
- nsIWidget* next = kid->GetNextSibling();
- kid->Destroy();
- kid = next;
- }
-
- // Destroy thebes surface now. Badness can happen if we destroy
- // the surface after its X Window.
- mThebesSurface = nullptr;
-
- QWidget *view = nullptr;
- QGraphicsScene *scene = nullptr;
- if (mWidget) {
- if (mIsTopLevel) {
- view = GetViewWidget();
- scene = mWidget->scene();
- }
-
- mWidget->dropReceiver();
-
- // Call deleteLater instead of delete; Qt still needs the object
- // to be valid even after sending it a Close event. We could
- // also set WA_DeleteOnClose, but this gives us more control.
- mWidget->deleteLater();
- }
- mWidget = nullptr;
-
- OnDestroy();
-
- // tear down some infrastructure after all event handling is finished
- delete scene;
- delete view;
+ mWidget->renderLater();
return NS_OK;
}
-void
-nsWindow::ClearCachedResources()
+nsIntPoint
+nsWindow::WidgetToScreenOffset()
+{
+ NS_ENSURE_TRUE(mWidget, nsIntPoint(0,0));
+
+ QPoint origin(0, 0);
+ origin = mWidget->mapToGlobal(origin);
+
+ return nsIntPoint(origin.x(), origin.y());
+}
+
+void*
+nsWindow::GetNativeData(uint32_t aDataType)
{
- if (mLayerManager &&
- mLayerManager->GetBackendType() == mozilla::layers::LayersBackend::LAYERS_BASIC) {
- statimLayerManager->ClearCachedResources();
+ switch (aDataType) {
+ case NS_NATIVE_WINDOW:
+ case NS_NATIVE_WIDGET: {
+ return mWidget;
+ }
+ case NS_NATIVE_SHAREABLE_WINDOW: {
+ return mWidget ? (void*)mWidget->winId() : nullptr;
+ }
+ case NS_NATIVE_DISPLAY: {
+#ifdef MOZ_X11
+ return gfxQtPlatform::GetXDisplay(mWidget);
+#endif
+ break;
+ }
+ case NS_NATIVE_PLUGIN_PORT:
+ case NS_NATIVE_GRAPHIC:
+ case NS_NATIVE_SHELLWIDGET: {
+ break;
+ }
+ default:
+ NS_WARNING("nsWindow::GetNativeData called with bad value");
+ return nullptr;
}
- for (nsIWidget* kid = mFirstChild; kid; ) {
- nsIWidget* next = kid->GetNextSibling();
- static_cast<nsWindow*>(kid)->ClearCachedResources();
- kid = next;
+ LOG(("nsWindow::%s [%p] aDataType:%i\n", __FUNCTION__, (void *)this, aDataType));
+ return nullptr;
+}
+
+NS_IMETHODIMP
+nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
+{
+#ifdef DEBUG
+ debug_DumpEvent(stdout, aEvent->widget, aEvent,
+ nsAutoCString("something"), 0);
+#endif
+
+ aStatus = nsEventStatus_eIgnore;
+
+ // send it to the standard callback
+ if (mWidgetListener) {
+ aStatus = mWidgetListener->HandleEvent(aEvent, mUseAttachedEvents);
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP_(void)
+nsWindow::SetInputContext(const InputContext& aContext,
+ const InputContextAction& aAction)
+{
+ NS_ENSURE_TRUE_VOID(mWidget);
+
+ // SetSoftwareKeyboardState uses mInputContext,
+ // so, before calling that, record aContext in mInputContext.
+ mInputContext = aContext;
+
+ switch (mInputContext.mIMEState.mEnabled) {
+ case IMEState::ENABLED:
+ case IMEState::PASSWORD:
+ case IMEState::PLUGIN:
+ SetSoftwareKeyboardState(true, aAction);
+ break;
+ default:
+ SetSoftwareKeyboardState(false, aAction);
+ break;
}
}
-NS_IMETHODIMP
-nsWindow::SetParent(nsIWidget *aNewParent)
+NS_IMETHODIMP_(InputContext)
+nsWindow::GetInputContext()
{
- NS_ENSURE_ARG_POINTER(aNewParent);
- nsCOMPtr<nsIWidget> kungFuDeathGrip(this);
- nsIWidget* parent = GetParent();
- if (parent) {
- parent->RemoveChild(this);
- }
- ReparentNativeWidget(aNewParent);
- aNewParent->AddChild(this);
- return NS_OK;
+ mInputContext.mIMEState.mOpen = IMEState::OPEN_STATE_NOT_SUPPORTED;
+ // Our qt widget looks like using only one context per process.
+ // However, it's better to set the context's pointer.
+ mInputContext.mNativeIMEContext = qApp->inputMethod();
+
+ return mInputContext;
}
NS_IMETHODIMP
nsWindow::ReparentNativeWidget(nsIWidget *aNewParent)
{
NS_PRECONDITION(aNewParent, "");
MozQWidget* newParent = static_cast<MozQWidget*>(aNewParent->GetNativeData(NS_NATIVE_WINDOW));
NS_ASSERTION(newParent, "Parent widget has a null native window handle");
if (mWidget) {
- mWidget->setParentItem(newParent);
+ mWidget->setParent(newParent);
}
return NS_OK;
}
NS_IMETHODIMP
-nsWindow::SetModal(bool aModal)
-{
- LOG(("nsWindow::SetModal [%p] %d, widget[%p]\n", (void *)this, aModal, mWidget));
- if (mWidget)
- mWidget->setModal(aModal);
-
- return NS_OK;
-}
-
-bool
-nsWindow::IsVisible() const
-{
- return mIsShown;
-}
-
-NS_IMETHODIMP
-nsWindow::ConstrainPosition(bool aAllowSlop, int32_t *aX, int32_t *aY)
+nsWindow::MakeFullScreen(bool aFullScreen)
{
- if (mWidget) {
- int32_t screenWidth = QApplication::desktop()->width();
- int32_t screenHeight = QApplication::desktop()->height();
+ NS_ENSURE_TRUE(mWidget, NS_ERROR_FAILURE);
+
+ if (aFullScreen) {
+ if (mSizeMode != nsSizeMode_Fullscreen) {
+ mLastSizeMode = mSizeMode;
+ }
+
+ mSizeMode = nsSizeMode_Fullscreen;
+ mWidget->showFullScreen();
+ }
+ else {
+ mSizeMode = mLastSizeMode;
- if (aAllowSlop) {
- if (*aX < (kWindowPositionSlop - mBounds.width))
- *aX = kWindowPositionSlop - mBounds.width;
- if (*aX > (screenWidth - kWindowPositionSlop))
- *aX = screenWidth - kWindowPositionSlop;
- if (*aY < (kWindowPositionSlop - mBounds.height))
- *aY = kWindowPositionSlop - mBounds.height;
- if (*aY > (screenHeight - kWindowPositionSlop))
- *aY = screenHeight - kWindowPositionSlop;
- } else {
- if (*aX < 0)
- *aX = 0;
- if (*aX > (screenWidth - mBounds.width))
- *aX = screenWidth - mBounds.width;
- if (*aY < 0)
- *aY = 0;
- if (*aY > (screenHeight - mBounds.height))
- *aY = screenHeight - mBounds.height;
+ switch (mSizeMode) {
+ case nsSizeMode_Maximized:
+ mWidget->showMaximized();
+ break;
+ case nsSizeMode_Minimized:
+ mWidget->showMinimized();
+ break;
+ case nsSizeMode_Normal:
+ mWidget->showNormal();
+ break;
+ default:
+ mWidget->showNormal();
+ break;
}
}
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::Move(double aX, double aY)
-{
- LOG(("nsWindow::Move [%p] %f %f\n", (void *)this,
- aX, aY));
-
- int32_t x = NSToIntRound(aX);
- int32_t y = NSToIntRound(aY);
-
- if (mIsTopLevel) {
- SetSizeMode(nsSizeMode_Normal);
- }
-
- if (x == mBounds.x && y == mBounds.y)
- return NS_OK;
-
- mNeedsMove = false;
-
- // update the bounds
- QPointF pos( x, y );
- if (mIsTopLevel) {
- QWidget *widget = GetViewWidget();
- NS_ENSURE_TRUE(widget, NS_OK);
- widget->move(x, y);
- }
- else if (mWidget) {
- // the position of the widget is set relative to the parent
- // so we map the coordinates accordingly
- pos = mWidget->mapFromScene(pos);
- pos = mWidget->mapToParent(pos);
- mWidget->setPos(pos);
- }
-
- mBounds.x = pos.x();
- mBounds.y = pos.y();
-
- NotifyRollupGeometryChange();
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::PlaceBehind(nsTopLevelWidgetZPlacement aPlacement,
- nsIWidget *aWidget,
- bool aActivate)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
+ NS_ASSERTION(mLastSizeMode != nsSizeMode_Fullscreen,
+ "mLastSizeMode should never be fullscreen");
+ return nsBaseWidget::MakeFullScreen(aFullScreen);
}
-NS_IMETHODIMP
-nsWindow::SetSizeMode(int32_t aMode)
+LayerManager*
+nsWindow::GetLayerManager(PLayerTransactionChild* aShadowManager,
+ LayersBackend aBackendHint,
+ LayerManagerPersistence aPersistence,
+ bool* aAllowRetaining)
{
- nsresult rv;
-
- LOG(("nsWindow::SetSizeMode [%p] %d\n", (void *)this, aMode));
- if (aMode != nsSizeMode_Minimized) {
- GetViewWidget()->activateWindow();
- }
-
- // Save the requested state.
- rv = nsBaseWidget::SetSizeMode(aMode);
-
- // return if there's no shell or our current state is the same as
- // the mode we were just set to.
- if (!mWidget || mSizeState == mSizeMode) {
- return rv;
+ if (!mLayerManager && eTransparencyTransparent == GetTransparencyMode()) {
+ mLayerManager = CreateBasicLayerManager();
}
- QWidget *widget = GetViewWidget();
- NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);
+ return nsBaseWidget::GetLayerManager(aShadowManager, aBackendHint,
+ aPersistence, aAllowRetaining);
+}
- switch (aMode) {
- case nsSizeMode_Maximized:
- widget->showMaximized();
- break;
- case nsSizeMode_Minimized:
- widget->showMinimized();
- break;
- case nsSizeMode_Fullscreen:
- widget->showFullScreen();
- break;
-
- default:
- // nsSizeMode_Normal, really.
- widget->showNormal();
- break;
+void
+nsWindow::UserActivity()
+{
+ if (!mIdleService) {
+ mIdleService = do_GetService("@mozilla.org/widget/idleservice;1");
}
- mSizeState = mSizeMode;
-
- return rv;
-}
-
-// Helper function to recursively find the first parent item that
-// is still visible (QGraphicsItem can be hidden even if they are
-// set to visible if one of their ancestors is invisible)
-static void find_first_visible_parent(QGraphicsItem* aItem, QGraphicsItem*& aVisibleItem)
-{
- NS_ENSURE_TRUE_VOID(aItem);
-
- aVisibleItem = nullptr;
- QGraphicsItem* parItem = nullptr;
- while (!aVisibleItem) {
- if (aItem->isVisible())
- aVisibleItem = aItem;
- else {
- parItem = aItem->parentItem();
- if (parItem)
- aItem = parItem;
- else {
- aItem->setVisible(true);
- aVisibleItem = aItem;
- }
- }
+ if (mIdleService) {
+ mIdleService->ResetIdleTimeOut(0);
}
}
-NS_IMETHODIMP
-nsWindow::SetFocus(bool aRaise)
+uint32_t
+nsWindow::GetGLFrameBufferFormat()
{
- // Make sure that our owning widget has focus. If it doesn't try to
- // grab it. Note that we don't set our focus flag in this case.
- LOGFOCUS((" SetFocus [%p]\n", (void *)this));
-
- if (!mWidget)
- return NS_ERROR_FAILURE;
-
- if (mWidget->hasFocus())
- return NS_OK;
-
- // Because QGraphicsItem cannot get the focus if they are
- // invisible, we look up the chain, for the lowest visible
- // parent and focus that one
- QGraphicsItem* realFocusItem = nullptr;
- find_first_visible_parent(mWidget, realFocusItem);
-
- if (!realFocusItem || realFocusItem->hasFocus())
- return NS_OK;
-
- if (aRaise) {
- // the raising has to happen on the view widget
- QWidget *widget = GetViewWidget();
- if (widget)
- widget->raise();
- realFocusItem->setFocus(Qt::ActiveWindowFocusReason);
+ if (mLayerManager &&
+ mLayerManager->GetBackendType() == mozilla::layers::LayersBackend::LAYERS_OPENGL) {
+ return LOCAL_GL_RGB;
}
- else
- realFocusItem->setFocus(Qt::OtherFocusReason);
-
- // XXXndeakin why is this here? It should dispatch only when the OS
- // notifies us.
- DispatchActivateEvent();
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::GetScreenBounds(nsIntRect &aRect)
-{
- aRect = nsIntRect(nsIntPoint(0, 0), mBounds.Size());
- if (mIsTopLevel) {
- QWidget *widget = GetViewWidget();
- NS_ENSURE_TRUE(widget, NS_OK);
- QPoint pos = widget->pos();
- aRect.MoveTo(pos.x(), pos.y());
- }
- else {
- aRect.MoveTo(WidgetToScreenOffset());
- }
- LOG(("GetScreenBounds %d %d | %d %d | %d %d\n",
- aRect.x, aRect.y,
- mBounds.width, mBounds.height,
- aRect.width, aRect.height));
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::SetForegroundColor(const nscolor &aColor)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-nsWindow::SetBackgroundColor(const nscolor &aColor)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
+ return LOCAL_GL_NONE;
}
NS_IMETHODIMP
nsWindow::SetCursor(nsCursor aCursor)
{
- if (mCursor == aCursor)
+ if (mCursor == aCursor) {
return NS_OK;
+ }
mCursor = aCursor;
- if (mWidget)
+ if (mWidget) {
mWidget->SetCursor(mCursor);
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::SetCursor(imgIContainer* aCursor,
- uint32_t aHotspotX, uint32_t aHotspotY)
-{
- return NS_ERROR_NOT_AVAILABLE;
-}
-
-NS_IMETHODIMP
-nsWindow::Invalidate(const nsIntRect &aRect)
-{
- LOGDRAW(("Invalidate (rect) [%p,%p]: %d %d %d %d\n", (void *)this,
- (void*)mWidget,aRect.x, aRect.y, aRect.width, aRect.height));
-
- if (!mWidget)
- return NS_OK;
-
- mDirtyScrollArea = mDirtyScrollArea.united(QRect(aRect.x, aRect.y, aRect.width, aRect.height));
-
- mWidget->update(aRect.x, aRect.y, aRect.width, aRect.height);
-
+ }
return NS_OK;
}
-// Returns the graphics view widget for this nsWindow by iterating
-// the chain of parents until a toplevel window with a view/scene is found.
-// (This function always returns something or asserts if the precondition
-// is not met)
-QWidget* nsWindow::GetViewWidget()
-{
- NS_ASSERTION(mWidget, "Calling GetViewWidget without mWidget created");
- if (!mWidget || !mWidget->scene() || !mWidget->scene()->views().size())
- return nullptr;
-
- NS_ASSERTION(mWidget->scene()->views().size() == 1, "Not exactly one view for our scene!");
- return mWidget->scene()->views()[0];
-}
-
-void*
-nsWindow::GetNativeData(uint32_t aDataType)
-{
- switch (aDataType) {
- case NS_NATIVE_WINDOW:
- case NS_NATIVE_WIDGET: {
- if (!mWidget)
- return nullptr;
-
- return mWidget;
- break;
- }
-
- case NS_NATIVE_PLUGIN_PORT:
- return SetupPluginPort();
- break;
-
- case NS_NATIVE_DISPLAY:
- {
-#ifdef MOZ_X11
- return gfxQtPlatform::GetXDisplay(GetViewWidget());
-#else
- return nullptr;
-#endif
- }
- break;
-
- case NS_NATIVE_GRAPHIC: {
- return nullptr;
- break;
- }
-
- case NS_NATIVE_SHELLWIDGET: {
- QWidget* widget = nullptr;
- if (mWidget && mWidget->scene())
- widget = mWidget->scene()->views()[0]->viewport();
- return (void *) widget;
- }
-
- case NS_NATIVE_SHAREABLE_WINDOW: {
- QWidget *widget = GetViewWidget();
- return widget ? (void*)widget->winId() : nullptr;
- }
-
- default:
- NS_WARNING("nsWindow::GetNativeData called with bad value");
- return nullptr;
- }
-}
-
NS_IMETHODIMP
nsWindow::SetTitle(const nsAString& aTitle)
{
- QString qStr(QString::fromUtf16(aTitle.BeginReading(), aTitle.Length()));
- if (mIsTopLevel) {
- QWidget *widget = GetViewWidget();
- if (widget)
- widget->setWindowTitle(qStr);
- }
- else if (mWidget)
- mWidget->setWindowTitle(qStr);
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::SetIcon(const nsAString& aIconSpec)
-{
- if (!mWidget)
- return NS_OK;
-
- nsCOMPtr<nsIFile> iconFile;
- nsAutoCString path;
- nsTArray<nsCString> iconList;
-
- // Look for icons with the following suffixes appended to the base name.
- // The last two entries (for the old XPM format) will be ignored unless
- // no icons are found using the other suffixes. XPM icons are depricated.
-
- const char extensions[6][7] = { ".png", "16.png", "32.png", "48.png",
- ".xpm", "16.xpm" };
-
- for (uint32_t i = 0; i < ArrayLength(extensions); i++) {
- // Don't bother looking for XPM versions if we found a PNG.
- if (i == ArrayLength(extensions) - 2 && iconList.Length())
- break;
-
- nsAutoString extension;
- extension.AppendASCII(extensions[i]);
+ QString qStr(QString::fromUtf16((const ushort*)aTitle.BeginReading(), aTitle.Length()));
- ResolveIconName(aIconSpec, extension, getter_AddRefs(iconFile));
- if (iconFile) {
- iconFile->GetNativePath(path);
- iconList.AppendElement(path);
- }
- }
-
- // leave the default icon intact if no matching icons were found
- if (iconList.Length() == 0)
- return NS_OK;
-
- return SetWindowIconList(iconList);
-}
-
-nsIntPoint
-nsWindow::WidgetToScreenOffset()
-{
- NS_ENSURE_TRUE(mWidget, nsIntPoint(0,0));
-
- QPointF origin(0, 0);
- origin = mWidget->mapToScene(origin);
-
- return nsIntPoint(origin.x(), origin.y());
-}
-
-NS_IMETHODIMP
-nsWindow::EnableDragDrop(bool aEnable)
-{
- mWidget->setAcceptDrops(aEnable);
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindow::CaptureMouse(bool aCapture)
-{
- LOG(("CaptureMouse %p\n", (void *)this));
-
- if (!mWidget)
- return NS_OK;
-
- QWidget *widget = GetViewWidget();
- NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);
-
- if (aCapture)
- widget->grabMouse();
- else
- widget->releaseMouse();
+ mWidget->setTitle(qStr);
return NS_OK;
}
-NS_IMETHODIMP
-nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
- bool aDoCapture)
-{
- if (!mWidget)
- return NS_OK;
-
- LOG(("CaptureRollupEvents %p\n", (void *)this));
-
- gRollupListener = aDoCapture ? aListener : nullptr;
- return NS_OK;
-}
-
-bool
-nsWindow::CheckForRollup(double aMouseX, double aMouseY,
- bool aIsWheel)
-{
- nsIRollupListener* rollupListener = GetActiveRollupListener();
- nsCOMPtr<nsIWidget> rollupWidget;
- if (rollupListener) {
- rollupWidget = rollupListener->GetRollupWidget();
- }
- if (!rollupWidget) {
- nsBaseWidget::gRollupListener = nullptr;
- return false;
- }
+// EVENTS
- bool retVal = false;
- MozQWidget *currentPopup =
- (MozQWidget *)rollupWidget->GetNativeData(NS_NATIVE_WINDOW);
- if (!is_mouse_in_window(currentPopup, aMouseX, aMouseY)) {
- bool rollup = true;
- if (aIsWheel) {
- rollup = rollupListener->ShouldRollupOnMouseWheelEvent();
- retVal = true;
- }
- // if we're dealing with menus, we probably have submenus and
- // we don't want to rollup if the clickis in a parent menu of
- // the current submenu
- uint32_t popupsToRollup = UINT32_MAX;
- if (rollupListener) {
- nsAutoTArray<nsIWidget*, 5> widgetChain;
- uint32_t sameTypeCount = rollupListener->GetSubmenuWidgetChain(&widgetChain);
- for (uint32_t i=0; i<widgetChain.Length(); ++i) {
- nsIWidget* widget = widgetChain[i];
- MozQWidget* currWindow =
- (MozQWidget*) widget->GetNativeData(NS_NATIVE_WINDOW);
- if (is_mouse_in_window(currWindow, aMouseX, aMouseY)) {
- if (i < sameTypeCount) {
- rollup = false;
- }
- else {
- popupsToRollup = sameTypeCount;
- }
- break;
- }
- } // foreach parent menu widget
- } // if rollup listener knows about menus
-
- // if we've determined that we should still rollup, do it.
- if (rollup) {
- retVal = rollupListener->Rollup(popupsToRollup, nullptr);
- }
- }
-
- return retVal;
-}
-
-/* static */
-bool
-is_mouse_in_window (MozQWidget* aWindow, double aMouseX, double aMouseY)
+void
+nsWindow::OnPaint()
{
- return aWindow->geometry().contains( aMouseX, aMouseY );
-}
-
-NS_IMETHODIMP
-nsWindow::GetAttention(int32_t aCycleCount)
-{
- LOG(("nsWindow::GetAttention [%p]\n", (void *)this));
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-#ifdef MOZ_X11
-static already_AddRefed<gfxASurface>
-GetSurfaceForQWidget(QWidget* aDrawable)
-{
- nsRefPtr<gfxASurface> result =
- new gfxXlibSurface(gfxQtPlatform::GetXDisplay(aDrawable),
- aDrawable->winId(),
- DefaultVisualOfScreen(gfxQtPlatform::GetXScreen(aDrawable)),
- gfxIntSize(aDrawable->size().width(),
- aDrawable->size().height()));
- return result.forget();
-}
-#endif
-
-bool
-nsWindow::DoPaint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption, QWidget* aWidget)
-{
- if (mIsDestroyed) {
- LOG(("Expose event on destroyed window [%p] window %p\n",
- (void *)this, mWidget));
- return false;
- }
-
- // Call WillPaintWindow to allow scripts etc. to run before we paint
- {
- if (mWidgetListener)
- mWidgetListener->WillPaintWindow(this);
+ LOGDRAW(("nsWindow::%s [%p]\n", __FUNCTION__, (void *)this));
+ nsIWidgetListener* listener =
+ mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
+ if (!listener) {
+ return;
}
- if (!mWidget)
- return false;
-
- QRectF r;
- if (aOption)
- r = aOption->exposedRect;
- else
- r = mWidget->boundingRect();
-
- if (r.isEmpty())
- return nsEventStatus_eIgnore;
-
- if (!mDirtyScrollArea.isEmpty())
- mDirtyScrollArea = QRegion();
-
- bool painted = false;
- nsIntRect rect(r.x(), r.y(), r.width(), r.height());
-
- nsFastStartup* startup = nsFastStartup::GetSingleton();
- if (startup) {
- startup->RemoveFakeLayout();
- }
-
- gfxQtPlatform::RenderMode renderMode = gfxQtPlatform::GetPlatform()->GetRenderMode();
- int depth = aPainter->device()->depth();
-
- nsRefPtr<gfxASurface> targetSurface = nullptr;
- if (renderMode == gfxQtPlatform::RENDER_BUFFERED) {
- // Prepare offscreen buffers iamge or xlib, depends from paintEngineType
- if (!UpdateOffScreenBuffers(depth, QSize(r.width(), r.height())))
- return false;
-
- targetSurface = gBufferSurface;
+ listener->WillPaintWindow(this);
-#ifdef CAIRO_HAS_QT_SURFACE
- } else if (renderMode == gfxQtPlatform::RENDER_QPAINTER) {
- targetSurface = new gfxQPainterSurface(aPainter);
-#endif
- } else if (renderMode == gfxQtPlatform::RENDER_DIRECT) {
- if (!UpdateOffScreenBuffers(depth, aWidget->size(), aWidget)) {
- return false;
+ switch (GetLayerManager()->GetBackendType()) {
+ case mozilla::layers::LayersBackend::LAYERS_CLIENT: {
+ nsIntRegion region(nsIntRect(0, 0, mWidget->width(), mWidget->height()));
+ listener->PaintWindow(this, region);
+ break;
}
- targetSurface = gBufferSurface;
- }
-
- if (MOZ_UNLIKELY(!targetSurface))
- return false;
-
- nsRefPtr<gfxContext> ctx = new gfxContext(targetSurface);
-
- // We will paint to 0, 0 position in offscrenn buffer
- if (renderMode == gfxQtPlatform::RENDER_BUFFERED) {
- ctx->Translate(gfxPoint(-r.x(), -r.y()));
- }
- else if (renderMode == gfxQtPlatform::RENDER_DIRECT) {
- gfxMatrix matr;
- matr.Translate(gfxPoint(aPainter->transform().dx(), aPainter->transform().dy()));
-#ifdef MOZ_ENABLE_QTMOBILITY
- // This is needed for rotate transformation on MeeGo
- // This will work very slow if pixman does not handle rotation very well
- matr.Rotate((M_PI/180) * gOrientationFilter.GetWindowRotationAngle());
- NS_ASSERTION(PIXMAN_VERSION > PIXMAN_VERSION_ENCODE(0, 21, 2) ||
- !gOrientationFilter.GetWindowRotationAngle(),
- "Old pixman and rotate transform, it is going to be slow");
-#endif //MOZ_ENABLE_QTMOBILITY
-
- ctx->SetMatrix(matr);
+ default:
+ NS_ERROR("Invalid layer manager");
}
- {
- AutoLayerManagerSetup
- setupLayerManager(this, ctx, mozilla::layers::BufferMode::BUFFER_NONE);
- if (mWidgetListener) {
- nsIntRegion region(rect);
- painted = mWidgetListener->PaintWindow(this, region);
- }
- }
-
- // DispatchEvent can Destroy us (bug 378273), avoid doing any paint
- // operations below if that happened - it will lead to XError and exit().
- if (MOZ_UNLIKELY(mIsDestroyed))
- return painted;
-
- if (!painted)
- return false;
-
- LOGDRAW(("[%p] draw done\n", this));
-
- // Handle buffered painting mode
- if (renderMode == gfxQtPlatform::RENDER_BUFFERED) {
-#if defined(MOZ_X11) && defined(Q_WS_X11)
- if (gBufferSurface->GetType() == gfxSurfaceType::Xlib) {
- // Paint offscreen pixmap to QPainter
- static QPixmap gBufferPixmap;
- Drawable draw = static_cast<gfxXlibSurface*>(gBufferSurface.get())->XDrawable();
- if (gBufferPixmap.handle() != draw)
- gBufferPixmap = QPixmap::fromX11Pixmap(draw, QPixmap::ExplicitlyShared);
- XSync(static_cast<gfxXlibSurface*>(gBufferSurface.get())->XDisplay(), False);
- aPainter->drawPixmap(QPoint(rect.x, rect.y), gBufferPixmap,
- QRect(0, 0, rect.width, rect.height));
-
- } else
-#endif
- if (gBufferSurface->GetType() == gfxSurfaceType::Image) {
- // in raster mode we can just wrap gBufferImage as QImage and paint directly
- gfxImageSurface *imgs = static_cast<gfxImageSurface*>(gBufferSurface.get());
- QImage img(imgs->Data(),
- imgs->Width(),
- imgs->Height(),
- imgs->Stride(),
- _gfximage_to_qformat(imgs->Format()));
- aPainter->drawImage(QPoint(rect.x, rect.y), img,
- QRect(0, 0, rect.width, rect.height));
- }
- } else if (renderMode == gfxQtPlatform::RENDER_DIRECT) {
- QRect trans = aPainter->transform().mapRect(r).toRect();
-#ifdef MOZ_X11
- if (gBufferSurface->GetType() == gfxSurfaceType::Xlib) {
- nsRefPtr<gfxASurface> widgetSurface = GetSurfaceForQWidget(aWidget);
- nsRefPtr<gfxContext> ctx = new gfxContext(widgetSurface);
- ctx->SetSource(gBufferSurface);
- ctx->Rectangle(gfxRect(trans.x(), trans.y(), trans.width(), trans.height()), true);
- ctx->Clip();
- ctx->Fill();
- } else
-#endif
- if (gBufferSurface->GetType() == gfxSurfaceType::Image) {
-#ifdef MOZ_HAVE_SHMIMAGE
- if (gShmImage) {
- gShmImage->Put(aWidget, trans);
- } else
-#endif
- {
- // Qt should take care about optimized rendering on QImage into painter device (gl/fb/image et.c.)
- gfxImageSurface *imgs = static_cast<gfxImageSurface*>(gBufferSurface.get());
- QImage img(imgs->Data(),
- imgs->Width(),
- imgs->Height(),
- imgs->Stride(),
- _gfximage_to_qformat(imgs->Format()));
- aPainter->drawImage(trans, img, trans);
- }
- }
- }
-
- ctx = nullptr;
- targetSurface = nullptr;
- if (mWidgetListener)
- mWidgetListener->DidPaintWindow();
-
- // check the return value!
- return painted;
+ listener->DidPaintWindow();
}
nsEventStatus
-nsWindow::OnMoveEvent(QGraphicsSceneHoverEvent *aEvent)
+nsWindow::moveEvent(QMoveEvent* aEvent)
{
LOG(("configure event [%p] %d %d\n", (void *)this,
aEvent->pos().x(), aEvent->pos().y()));
// can we shortcut?
if (!mWidget || !mWidgetListener)
return nsEventStatus_eIgnore;
@@ -1177,128 +872,59 @@ nsWindow::OnMoveEvent(QGraphicsSceneHove
return nsEventStatus_eIgnore;
}
bool moved = mWidgetListener->WindowMoved(this, aEvent->pos().x(), aEvent->pos().y());
return moved ? nsEventStatus_eConsumeNoDefault : nsEventStatus_eIgnore;
}
nsEventStatus
-nsWindow::OnResizeEvent(QGraphicsSceneResizeEvent *aEvent)
+nsWindow::resizeEvent(QResizeEvent* aEvent)
{
nsIntRect rect;
// Generate XPFE resize event
GetBounds(rect);
- rect.width = aEvent->newSize().width();
- rect.height = aEvent->newSize().height();
+ rect.width = aEvent->size().width();
+ rect.height = aEvent->size().height();
mBounds.width = rect.width;
mBounds.height = rect.height;
nsEventStatus status;
DispatchResizeEvent(rect, status);
return status;
}
nsEventStatus
-nsWindow::OnCloseEvent(QCloseEvent *aEvent)
-{
- if (!mWidgetListener)
- return nsEventStatus_eIgnore;
- mWidgetListener->RequestWindowClose(this);
- return nsEventStatus_eConsumeNoDefault;
-}
-
-nsEventStatus
-nsWindow::OnEnterNotifyEvent(QGraphicsSceneHoverEvent *aEvent)
-{
- WidgetMouseEvent event(true, NS_MOUSE_ENTER, this, WidgetMouseEvent::eReal);
-
- event.refPoint.x = nscoord(aEvent->pos().x());
- event.refPoint.y = nscoord(aEvent->pos().y());
-
- LOG(("OnEnterNotify: %p\n", (void *)this));
-
- return DispatchEvent(&event);
-}
-
-nsEventStatus
-nsWindow::OnLeaveNotifyEvent(QGraphicsSceneHoverEvent *aEvent)
-{
- WidgetMouseEvent event(true, NS_MOUSE_EXIT, this, WidgetMouseEvent::eReal);
-
- event.refPoint.x = nscoord(aEvent->pos().x());
- event.refPoint.y = nscoord(aEvent->pos().y());
-
- LOG(("OnLeaveNotify: %p\n", (void *)this));
-
- return DispatchEvent(&event);
-}
-
-// Block the mouse events if user was recently executing gestures;
-// otherwise there will be also some panning during/after gesture
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0))
-#define CHECK_MOUSE_BLOCKED { \
-if (mLastMultiTouchTime.isValid()) { \
- if (mLastMultiTouchTime.elapsed() < GESTURES_BLOCK_MOUSE_FOR) \
- return nsEventStatus_eIgnore; \
- else \
- mLastMultiTouchTime = QTime(); \
- } \
-}
-#else
-define CHECK_MOUSE_BLOCKED {}
-#endif
-
-nsEventStatus
-nsWindow::OnMotionNotifyEvent(QPointF aPos, Qt::KeyboardModifiers aModifiers)
+nsWindow::mouseMoveEvent(QMouseEvent* aEvent)
{
UserActivity();
- CHECK_MOUSE_BLOCKED
-
- mMoveEvent.pos = aPos;
- mMoveEvent.modifiers = aModifiers;
+ mMoveEvent.pos = aEvent->pos();
+ mMoveEvent.modifiers = aEvent->modifiers();
mMoveEvent.needDispatch = true;
DispatchMotionToMainThread();
return nsEventStatus_eIgnore;
}
-void
-nsWindow::InitButtonEvent(WidgetMouseEvent& aMoveEvent,
- QGraphicsSceneMouseEvent* aEvent,
- int aClickCount)
-{
- aMoveEvent.refPoint.x = nscoord(aEvent->pos().x());
- aMoveEvent.refPoint.y = nscoord(aEvent->pos().y());
-
- aMoveEvent.InitBasicModifiers(aEvent->modifiers() & Qt::ControlModifier,
- aEvent->modifiers() & Qt::AltModifier,
- aEvent->modifiers() & Qt::ShiftModifier,
- aEvent->modifiers() & Qt::MetaModifier);
- aMoveEvent.clickCount = aClickCount;
-}
-
nsEventStatus
-nsWindow::OnButtonPressEvent(QGraphicsSceneMouseEvent *aEvent)
+nsWindow::mousePressEvent(QMouseEvent* aEvent)
{
// The user has done something.
UserActivity();
- CHECK_MOUSE_BLOCKED
-
- QPointF pos = aEvent->pos();
+ QPoint pos = aEvent->pos();
// we check against the widgets geometry, so use parent coordinates
// for the check
if (mWidget)
- pos = mWidget->mapToParent(pos);
+ pos = mWidget->mapToGlobal(pos);
if (CheckForRollup( pos.x(), pos.y(), false))
return nsEventStatus_eIgnore;
uint16_t domButton;
switch (aEvent->button()) {
case Qt::MidButton:
domButton = WidgetMouseEvent::eMiddleButton;
@@ -1328,21 +954,18 @@ nsWindow::OnButtonPressEvent(QGraphicsSc
InitButtonEvent(contextMenuEvent, aEvent, 1);
DispatchEvent(&contextMenuEvent, status);
}
return status;
}
nsEventStatus
-nsWindow::OnButtonReleaseEvent(QGraphicsSceneMouseEvent *aEvent)
+nsWindow::mouseReleaseEvent(QMouseEvent* aEvent)
{
- UserActivity();
- CHECK_MOUSE_BLOCKED
-
// The user has done something.
UserActivity();
uint16_t domButton;
switch (aEvent->button()) {
case Qt::MidButton:
domButton = WidgetMouseEvent::eMiddleButton;
@@ -1363,17 +986,17 @@ nsWindow::OnButtonReleaseEvent(QGraphics
InitButtonEvent(event, aEvent, 1);
nsEventStatus status = DispatchEvent(&event);
return status;
}
nsEventStatus
-nsWindow::OnMouseDoubleClickEvent(QGraphicsSceneMouseEvent *aEvent)
+nsWindow::mouseDoubleClickEvent(QMouseEvent* aEvent)
{
uint32_t eventType;
switch (aEvent->button()) {
case Qt::MidButton:
eventType = WidgetMouseEvent::eMiddleButton;
break;
case Qt::RightButton:
@@ -1389,74 +1012,47 @@ nsWindow::OnMouseDoubleClickEvent(QGraph
event.button = eventType;
InitButtonEvent(event, aEvent, 2);
//pressed
return DispatchEvent(&event);
}
nsEventStatus
-nsWindow::OnFocusInEvent(QEvent *aEvent)
+nsWindow::focusInEvent(QFocusEvent* aEvent)
{
LOGFOCUS(("OnFocusInEvent [%p]\n", (void *)this));
- if (!mWidget)
+ if (!mWidget) {
return nsEventStatus_eIgnore;
+ }
DispatchActivateEventOnTopLevelWindow();
LOGFOCUS(("Events sent from focus in event [%p]\n", (void *)this));
return nsEventStatus_eIgnore;
}
nsEventStatus
-nsWindow::OnFocusOutEvent(QEvent *aEvent)
+nsWindow::focusOutEvent(QFocusEvent* aEvent)
{
LOGFOCUS(("OnFocusOutEvent [%p]\n", (void *)this));
- if (!mWidget)
+ if (!mWidget) {
return nsEventStatus_eIgnore;
+ }
DispatchDeactivateEventOnTopLevelWindow();
LOGFOCUS(("Done with container focus out [%p]\n", (void *)this));
return nsEventStatus_eIgnore;
}
-inline bool
-is_latin_shortcut_key(quint32 aKeyval)
-{
- return ((Qt::Key_0 <= aKeyval && aKeyval <= Qt::Key_9) ||
- (Qt::Key_A <= aKeyval && aKeyval <= Qt::Key_Z));
-}
-
nsEventStatus
-nsWindow::DispatchCommandEvent(nsIAtom* aCommand)
-{
- WidgetCommandEvent event(true, nsGkAtoms::onAppCommand, aCommand, this);
-
- nsEventStatus status;
- DispatchEvent(&event, status);
-
- return status;
-}
-
-nsEventStatus
-nsWindow::DispatchContentCommandEvent(int32_t aMsg)
-{
- WidgetContentCommandEvent event(true, aMsg, this);
-
- nsEventStatus status;
- DispatchEvent(&event, status);
-
- return status;
-}
-
-nsEventStatus
-nsWindow::OnKeyPressEvent(QKeyEvent *aEvent)
+nsWindow::keyPressEvent(QKeyEvent* aEvent)
{
LOGFOCUS(("OnKeyPressEvent [%p]\n", (void *)this));
// The user has done something.
UserActivity();
if (aEvent->key() == Qt::Key_AltGr) {
sAltGrModifier = true;
@@ -1472,17 +1068,17 @@ nsWindow::OnKeyPressEvent(QKeyEvent *aEv
//keyEventToContextMenuEvent(&event, &contextMenuEvent);
return DispatchEvent(&contextMenuEvent);
}
uint32_t domCharCode = 0;
uint32_t domKeyCode = QtKeyCodeToDOMKeyCode(aEvent->key());
// get keymap and modifier map from the Xserver
- Display *display = mozilla::DefaultXDisplay();
+ Display *display = gfxQtPlatform::GetXDisplay(mWidget);
int x_min_keycode = 0, x_max_keycode = 0, xkeysyms_per_keycode;
XDisplayKeycodes(display, &x_min_keycode, &x_max_keycode);
XModifierKeymap *xmodmap = XGetModifierMapping(display);
if (!xmodmap)
return nsEventStatus_eIgnore;
KeySym *xkeymap = XGetKeyboardMapping(display, x_min_keycode, x_max_keycode - x_min_keycode,
&xkeysyms_per_keycode);
@@ -1627,30 +1223,30 @@ nsWindow::OnKeyPressEvent(QKeyEvent *aEv
WidgetKeyboardEvent event(true, NS_KEY_PRESS, this);
InitKeyEvent(event, aEvent);
// If there is no charcode attainable from the text, try to
// generate it from the keycode. Check shift state for case
// Also replace the charcode if ControlModifier is the only
// pressed Modifier
if ((!domCharCode) &&
- (QApplication::keyboardModifiers() &
+ (QGuiApplication::keyboardModifiers() &
(Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier))) {
// get a character from X11 key map
KeySym keysym = aEvent->nativeVirtualKey();
if (keysym) {
domCharCode = (uint32_t) keysym2ucs(keysym);
if (domCharCode == -1 || !QChar((quint32)domCharCode).isPrint()) {
domCharCode = 0;
}
}
// if Ctrl is pressed and domCharCode is not a ASCII character
- if (domCharCode > 0xFF && (QApplication::keyboardModifiers() & Qt::ControlModifier)) {
+ if (domCharCode > 0xFF && (QGuiApplication::keyboardModifiers() & Qt::ControlModifier)) {
// replace Unicode character
int index = (aEvent->nativeScanCode() - x_min_keycode) * xkeysyms_per_keycode;
for (int i = 0; i < xkeysyms_per_keycode; ++i) {
if (xkeymap[index + i] <= 0xFF && !shift_state) {
domCharCode = (uint32_t) QChar::toLower((uint) xkeymap[index + i]);
break;
}
}
@@ -1685,17 +1281,17 @@ nsWindow::OnKeyPressEvent(QKeyEvent *aEv
long ucs = keysym2ucs(keysym);
ucs = ucs == -1 ? 0 : ucs;
QChar shiftedChar((uint)ucs);
// append alternativeCharCodes if modifier is pressed
// append an additional alternativeCharCodes if domCharCode is not a Latin character
// and if one of these modifiers is pressed (i.e. Ctrl, Alt, Meta)
if (domCharCode &&
- (QApplication::keyboardModifiers() &
+ (QGuiApplication::keyboardModifiers() &
(Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier))) {
event.charCode = domCharCode;
event.keyCode = 0;
AlternativeCharCode altCharCode(0, 0);
// if character has a lower and upper representation
if ((unshiftedChar.isUpper() || unshiftedChar.isLower()) &&
unshiftedChar.toLower() == shiftedChar.toLower()) {
@@ -1776,18 +1372,19 @@ nsWindow::OnKeyPressEvent(QKeyEvent *aEv
WidgetMouseEvent::eContextMenuKey);
//keyEventToContextMenuEvent(&event, &contextMenuEvent);
return DispatchEvent(&contextMenuEvent);
}
uint32_t domCharCode = 0;
uint32_t domKeyCode = QtKeyCodeToDOMKeyCode(aEvent->key());
- if (aEvent->text().length() && aEvent->text()[0].isPrint())
+ if (aEvent->text().length() && aEvent->text()[0].isPrint()) {
domCharCode = (int32_t) aEvent->text()[0].unicode();
+ }
KeyNameIndex keyNameIndex =
domCharCode ? KEY_NAME_INDEX_PrintableKey :
QtKeyCodeToDOMKeyNameIndex(aEvent->key());
// If the key isn't autorepeat, we need to send the initial down event
if (!aEvent->isAutoRepeat() && !IsKeyDown(domKeyCode)) {
// send the key down event
@@ -1817,34 +1414,34 @@ nsWindow::OnKeyPressEvent(QKeyEvent *aEv
event.mKeyNameIndex = keyNameIndex;
// send the key press event
return DispatchEvent(&event);
#endif
}
nsEventStatus
-nsWindow::OnKeyReleaseEvent(QKeyEvent *aEvent)
+nsWindow::keyReleaseEvent(QKeyEvent* aEvent)
{
LOGFOCUS(("OnKeyReleaseEvent [%p]\n", (void *)this));
// The user has done something.
UserActivity();
if (isContextMenuKeyEvent(aEvent)) {
// er, what do we do here? DoDefault or NoDefault?
return nsEventStatus_eConsumeDoDefault;
}
uint32_t domKeyCode = QtKeyCodeToDOMKeyCode(aEvent->key());
#ifdef MOZ_X11
if (!domKeyCode) {
// get keymap from the Xserver
- Display *display = mozilla::DefaultXDisplay();
+ Display *display = gfxQtPlatform::GetXDisplay(mWidget);
int x_min_keycode = 0, x_max_keycode = 0, xkeysyms_per_keycode;
XDisplayKeycodes(display, &x_min_keycode, &x_max_keycode);
KeySym *xkeymap = XGetKeyboardMapping(display, x_min_keycode, x_max_keycode - x_min_keycode,
&xkeysyms_per_keycode);
if (aEvent->nativeScanCode() >= (quint32)x_min_keycode &&
aEvent->nativeScanCode() <= (quint32)x_max_keycode) {
int index = (aEvent->nativeScanCode() - x_min_keycode) * xkeysyms_per_keycode;
@@ -1875,17 +1472,17 @@ nsWindow::OnKeyReleaseEvent(QKeyEvent *a
// unset the key down flag
ClearKeyDownFlag(event.keyCode);
return DispatchEvent(&event);
}
nsEventStatus
-nsWindow::OnScrollEvent(QGraphicsSceneWheelEvent *aEvent)
+nsWindow::wheelEvent(QWheelEvent* aEvent)
{
// check to see if we should rollup
WidgetWheelEvent wheelEvent(true, NS_WHEEL_WHEEL, this);
wheelEvent.deltaMode = nsIDOMWheelEvent::DOM_DELTA_LINE;
// negative values for aEvent->delta indicate downward scrolling;
// this is opposite Gecko usage.
// TODO: Store the unused delta values due to fraction round and add it
@@ -1900,392 +1497,552 @@ nsWindow::OnScrollEvent(QGraphicsSceneWh
case Qt::Horizontal:
wheelEvent.deltaX = wheelEvent.lineOrPageDeltaX = delta;
break;
default:
Q_ASSERT(0);
break;
}
- wheelEvent.refPoint.x = nscoord(aEvent->scenePos().x());
- wheelEvent.refPoint.y = nscoord(aEvent->scenePos().y());
+ wheelEvent.refPoint.x = nscoord(aEvent->pos().x());
+ wheelEvent.refPoint.y = nscoord(aEvent->pos().y());
wheelEvent.InitBasicModifiers(aEvent->modifiers() & Qt::ControlModifier,
aEvent->modifiers() & Qt::AltModifier,
aEvent->modifiers() & Qt::ShiftModifier,
aEvent->modifiers() & Qt::MetaModifier);
wheelEvent.time = 0;
return DispatchEvent(&wheelEvent);
}
-
nsEventStatus
nsWindow::showEvent(QShowEvent *)
{
LOG(("%s [%p]\n", __PRETTY_FUNCTION__,(void *)this));
- mIsVisible = true;
+ mVisible = true;
return nsEventStatus_eConsumeDoDefault;
}
nsEventStatus
nsWindow::hideEvent(QHideEvent *)
{
LOG(("%s [%p]\n", __PRETTY_FUNCTION__,(void *)this));
- mIsVisible = false;
+ mVisible = false;
return nsEventStatus_eConsumeDoDefault;
}
-//Gestures are only supported in 4.6.0 >
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0))
-nsEventStatus nsWindow::OnTouchEvent(QTouchEvent *event, bool &handled)
+nsEventStatus nsWindow::touchEvent(QTouchEvent* aEvent)
{
- handled = false;
- const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
-
- if (event->type() == QEvent::TouchBegin) {
- handled = true;
- for (int i = touchPoints.count() -1; i >= 0; i--) {
- QPointF fpos = touchPoints[i].pos();
- WidgetGestureNotifyEvent gestureNotifyEvent(true,
- NS_GESTURENOTIFY_EVENT_START, this);
- gestureNotifyEvent.refPoint = LayoutDeviceIntPoint(fpos.x(), fpos.y());
- DispatchEvent(&gestureNotifyEvent);
- }
- }
- else if (event->type() == QEvent::TouchEnd) {
- mGesturesCancelled = false;
- mPinchEvent.needDispatch = false;
- }
-
- if (touchPoints.count() > 0) {
- // Remember start touch point in order to use it for
- // distance calculation in NS_SIMPLE_GESTURE_MAGNIFY_UPDATE
- mPinchEvent.touchPoint = touchPoints.at(0).pos();
- }
-
return nsEventStatus_eIgnore;
}
nsEventStatus
-nsWindow::OnGestureEvent(QGestureEvent* event, bool &handled) {
-
- handled = false;
- if (mGesturesCancelled) {
- return nsEventStatus_eIgnore;
- }
-
- nsEventStatus result = nsEventStatus_eIgnore;
+nsWindow::tabletEvent(QTabletEvent* aEvent)
+{
+ LOGFOCUS(("nsWindow::%s [%p]\n", __FUNCTION__, (void *)this));
+ return nsEventStatus_eIgnore;
+}
- QGesture* gesture = event->gesture(Qt::PinchGesture);
-
- if (gesture) {
- QPinchGesture* pinch = static_cast<QPinchGesture*>(gesture);
- handled = true;
-
- mPinchEvent.centerPoint =
- mWidget->mapFromScene(event->mapToGraphicsScene(pinch->centerPoint()));
- nsIntPoint centerPoint(mPinchEvent.centerPoint.x(),
- mPinchEvent.centerPoint.y());
+// Helpers
- if (pinch->state() == Qt::GestureStarted) {
- event->accept();
- mPinchEvent.startDistance = DistanceBetweenPoints(mPinchEvent.centerPoint, mPinchEvent.touchPoint) * 2;
- mPinchEvent.prevDistance = mPinchEvent.startDistance;
- result = DispatchGestureEvent(NS_SIMPLE_GESTURE_MAGNIFY_START,
- 0, 0, centerPoint);
- }
- else if (pinch->state() == Qt::GestureUpdated) {
- mPinchEvent.needDispatch = true;
- mPinchEvent.delta = 0;
- DispatchMotionToMainThread();
- }
- else if (pinch->state() == Qt::GestureFinished) {
- double distance = DistanceBetweenPoints(mPinchEvent.centerPoint, mPinchEvent.touchPoint) * 2;
- double delta = distance - mPinchEvent.startDistance;
- result = DispatchGestureEvent(NS_SIMPLE_GESTURE_MAGNIFY,
- 0, delta, centerPoint);
- mPinchEvent.needDispatch = false;
- }
- else {
- handled = false;
- }
-
- //Disable mouse events when gestures are used, because they cause problems with
- //Fennec
- mLastMultiTouchTime.start();
- }
+void
+nsWindow::InitButtonEvent(WidgetMouseEvent& aMoveEvent,
+ QMouseEvent* aEvent,
+ int aClickCount)
+{
+ aMoveEvent.refPoint.x = nscoord(aEvent->pos().x());
+ aMoveEvent.refPoint.y = nscoord(aEvent->pos().y());
- gesture = event->gesture(gSwipeGestureId);
- if (gesture) {
- if (gesture->state() == Qt::GestureStarted) {
- event->accept();
- }
- if (gesture->state() == Qt::GestureFinished) {
- event->accept();
- handled = true;
-
- MozSwipeGesture* swipe = static_cast<MozSwipeGesture*>(gesture);
- nsIntPoint hotspot;
- hotspot.x = swipe->hotSpot().x();
- hotspot.y = swipe->hotSpot().y();
-
- // Cancel pinch gesture
- mGesturesCancelled = true;
- mPinchEvent.needDispatch = false;
-
- double distance = DistanceBetweenPoints(swipe->hotSpot(), mPinchEvent.touchPoint) * 2;
- double delta = distance - mPinchEvent.startDistance;
-
- DispatchGestureEvent(NS_SIMPLE_GESTURE_MAGNIFY, 0, delta / 2, hotspot);
-
- result = DispatchGestureEvent(NS_SIMPLE_GESTURE_SWIPE,
- swipe->Direction(), 0, hotspot);
- }
- mLastMultiTouchTime.start();
- }
-
- return result;
+ aMoveEvent.InitBasicModifiers(aEvent->modifiers() & Qt::ControlModifier,
+ aEvent->modifiers() & Qt::AltModifier,
+ aEvent->modifiers() & Qt::ShiftModifier,
+ aEvent->modifiers() & Qt::MetaModifier);
+ aMoveEvent.clickCount = aClickCount;
}
nsEventStatus
-nsWindow::DispatchGestureEvent(uint32_t aMsg, uint32_t aDirection,
- double aDelta, const nsIntPoint& aRefPoint)
+nsWindow::DispatchEvent(WidgetGUIEvent* aEvent)
+{
+ nsEventStatus status;
+ DispatchEvent(aEvent, status);
+ return status;
+}
+
+void
+nsWindow::DispatchActivateEvent(void)
+{
+ if (mWidgetListener) {
+ mWidgetListener->WindowActivated();
+ }
+}
+
+void
+nsWindow::DispatchDeactivateEvent(void)
+{
+ if (mWidgetListener) {
+ mWidgetListener->WindowDeactivated();
+ }
+}
+
+void
+nsWindow::DispatchActivateEventOnTopLevelWindow(void)
{
- WidgetSimpleGestureEvent mozGesture(true, aMsg, this, 0, 0.0);
- mozGesture.direction = aDirection;
- mozGesture.delta = aDelta;
- mozGesture.refPoint = LayoutDeviceIntPoint::FromUntyped(aRefPoint);
+ nsWindow* topLevelWindow = static_cast<nsWindow*>(GetTopLevelWidget());
+ if (topLevelWindow != nullptr) {
+ topLevelWindow->DispatchActivateEvent();
+ }
+}
+
+void
+nsWindow::DispatchDeactivateEventOnTopLevelWindow(void)
+{
+ nsWindow* topLevelWindow = static_cast<nsWindow*>(GetTopLevelWidget());
+ if (topLevelWindow != nullptr) {
+ topLevelWindow->DispatchDeactivateEvent();
+ }
+}
+
+void
+nsWindow::DispatchResizeEvent(nsIntRect &aRect, nsEventStatus &aStatus)
+{
+ aStatus = nsEventStatus_eIgnore;
+ if (mWidgetListener &&
+ mWidgetListener->WindowResized(this, aRect.width, aRect.height)) {
+ aStatus = nsEventStatus_eConsumeNoDefault;
+ }
+}
+
+///////////////////////////////////// OLD GECKO ECENTS need to Sort ///////////////////
+
+/* static */ bool
+isContextMenuKeyEvent(const QKeyEvent *qe)
+{
+ uint32_t kc = QtKeyCodeToDOMKeyCode(qe->key());
+ if (qe->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier)) {
+ return false;
+ }
+
+ bool isShift = qe->modifiers() & Qt::ShiftModifier;
+ return (kc == NS_VK_F10 && isShift) ||
+ (kc == NS_VK_CONTEXT_MENU && !isShift);
+}
- Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
+/* static */void
+InitKeyEvent(WidgetKeyboardEvent &aEvent, QKeyEvent *aQEvent)
+{
+ aEvent.InitBasicModifiers(aQEvent->modifiers() & Qt::ControlModifier,
+ aQEvent->modifiers() & Qt::AltModifier,
+ aQEvent->modifiers() & Qt::ShiftModifier,
+ aQEvent->modifiers() & Qt::MetaModifier);
+ aEvent.mIsRepeat =
+ (aEvent.message == NS_KEY_DOWN || aEvent.message == NS_KEY_PRESS) &&
+ aQEvent->isAutoRepeat();
+ aEvent.time = 0;
+
+ if (sAltGrModifier) {
+ aEvent.modifiers |= (MODIFIER_CONTROL | MODIFIER_ALT);
+ }
+
+ // The transformations above and in qt for the keyval are not invertible
+ // so link to the QKeyEvent (which will vanish soon after return from the
+ // event callback) to give plugins access to hardware_keycode and state.
+ // (An XEvent would be nice but the QKeyEvent is good enough.)
+ aEvent.pluginEvent = (void *)aQEvent;
+}
+
+NS_IMPL_ISUPPORTS_INHERITED1(nsWindow, nsBaseWidget, nsISupportsWeakReference)
+
+
- mozGesture.InitBasicModifiers(modifiers & Qt::ControlModifier,
- modifiers & Qt::AltModifier,
- modifiers & Qt::ShiftModifier,
- false);
- mozGesture.button = 0;
- mozGesture.time = 0;
+void
+nsWindow::ClearCachedResources()
+{
+ if (mLayerManager &&
+ mLayerManager->GetBackendType() == mozilla::layers::LayersBackend::LAYERS_BASIC) {
+ mLayerManager->ClearCachedResources();
+ }
+ for (nsIWidget* kid = mFirstChild; kid; ) {
+ nsIWidget* next = kid->GetNextSibling();
+ static_cast<nsWindow*>(kid)->ClearCachedResources();
+ kid = next;
+ }
+}
+
+NS_IMETHODIMP
+nsWindow::SetParent(nsIWidget *aNewParent)
+{
+ NS_ENSURE_ARG_POINTER(aNewParent);
- return DispatchEvent(&mozGesture);
+ nsCOMPtr<nsIWidget> kungFuDeathGrip(this);
+ nsIWidget* parent = GetParent();
+ if (parent) {
+ parent->RemoveChild(this);
+ }
+ ReparentNativeWidget(aNewParent);
+ aNewParent->AddChild(this);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsWindow::SetModal(bool aModal)
+{
+ LOG(("nsWindow::SetModal [%p] %d, widget[%p]\n", (void *)this, aModal, mWidget));
+ if (mWidget) {
+ mWidget->setModality(aModal ? Qt::WindowModal : Qt::NonModal);
+ }
+
+ return NS_OK;
}
-double
-nsWindow::DistanceBetweenPoints(const QPointF &aFirstPoint, const QPointF &aSecondPoint)
+NS_IMETHODIMP
+nsWindow::PlaceBehind(nsTopLevelWidgetZPlacement aPlacement,
+ nsIWidget *aWidget,
+ bool aActivate)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsWindow::SetSizeMode(int32_t aMode)
{
- double result = 0;
- double deltaX = abs(aFirstPoint.x() - aSecondPoint.x());
- double deltaY = abs(aFirstPoint.y() - aSecondPoint.y());
- result = sqrt(deltaX*deltaX + deltaY*deltaY);
- return result;
+ nsresult rv;
+
+ LOG(("nsWindow::SetSizeMode [%p] %d\n", (void *)this, aMode));
+ if (aMode != nsSizeMode_Minimized) {
+ mWidget->requestActivate();
+ }
+
+ // Save the requested state.
+ rv = nsBaseWidget::SetSizeMode(aMode);
+
+ // return if there's no shell or our current state is the same as
+ // the mode we were just set to.
+ if (!mWidget || mSizeState == mSizeMode) {
+ return rv;
+ }
+
+ switch (aMode) {
+ case nsSizeMode_Maximized:
+ mWidget->showMaximized();
+ break;
+ case nsSizeMode_Minimized:
+ mWidget->showMinimized();
+ break;
+ case nsSizeMode_Fullscreen:
+ mWidget->showFullScreen();
+ break;
+
+ default:
+ // nsSizeMode_Normal, really.
+ mWidget->show();
+ break;
+ }
+
+ mSizeState = mSizeMode;
+
+ return rv;
+}
+
+// Helper function to recursively find the first parent item that
+// is still visible (QGraphicsItem can be hidden even if they are
+// set to visible if one of their ancestors is invisible)
+/* static */
+void find_first_visible_parent(QWindow* aItem, QWindow*& aVisibleItem)
+{
+ NS_ENSURE_TRUE_VOID(aItem);
+
+ aVisibleItem = nullptr;
+ QWindow* parItem = nullptr;
+