summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/android/src/qandroidinputcontext.cpp28
-rw-r--r--src/plugins/platforms/android/src/qandroidplatformservices.cpp20
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm29
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.cpp1
-rw-r--r--src/plugins/platforms/ios/qiosbackingstore.mm1
-rw-r--r--src/plugins/platforms/ios/qioscontext.mm23
-rw-r--r--src/plugins/platforms/ios/qiosglobal.mm3
-rw-r--r--src/plugins/platforms/ios/qiosscreen.mm15
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp2
-rw-r--r--src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp2
10 files changed, 59 insertions, 65 deletions
diff --git a/src/plugins/platforms/android/src/qandroidinputcontext.cpp b/src/plugins/platforms/android/src/qandroidinputcontext.cpp
index 2180560b04..1981ac0b75 100644
--- a/src/plugins/platforms/android/src/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/src/qandroidinputcontext.cpp
@@ -237,13 +237,11 @@ static JNINativeMethod methods[] = {
QAndroidInputContext::QAndroidInputContext():QPlatformInputContext()
{
- JNIEnv *env = 0;
- if (QtAndroid::javaVM()->AttachCurrentThread(&env, NULL) < 0) {
- qCritical() << "AttachCurrentThread failed";
+ QtAndroid::AttachedJNIEnv env;
+ if (!env.jniEnv)
return;
- }
- jclass clazz = QtAndroid::findClass(QtNativeInputConnectionClassName, env);
+ jclass clazz = QtAndroid::findClass(QtNativeInputConnectionClassName, env.jniEnv);
if (clazz == NULL) {
qCritical() << "Native registration unable to find class '"
<< QtNativeInputConnectionClassName
@@ -251,14 +249,14 @@ QAndroidInputContext::QAndroidInputContext():QPlatformInputContext()
return;
}
- if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
+ if (env.jniEnv->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
qCritical() << "RegisterNatives failed for '"
<< QtNativeInputConnectionClassName
<< "'";
return;
}
- clazz = QtAndroid::findClass(QtExtractedTextClassName, env);
+ clazz = QtAndroid::findClass(QtExtractedTextClassName, env.jniEnv);
if (clazz == NULL) {
qCritical() << "Native registration unable to find class '"
<< QtExtractedTextClassName
@@ -266,44 +264,44 @@ QAndroidInputContext::QAndroidInputContext():QPlatformInputContext()
return;
}
- m_extractedTextClass = static_cast<jclass>(env->NewGlobalRef(clazz));
- m_classConstructorMethodID = env->GetMethodID(m_extractedTextClass, "<init>", "()V");
+ m_extractedTextClass = static_cast<jclass>(env.jniEnv->NewGlobalRef(clazz));
+ m_classConstructorMethodID = env.jniEnv->GetMethodID(m_extractedTextClass, "<init>", "()V");
if (m_classConstructorMethodID == NULL) {
qCritical() << "GetMethodID failed";
return;
}
- m_partialEndOffsetFieldID = env->GetFieldID(m_extractedTextClass, "partialEndOffset", "I");
+ m_partialEndOffsetFieldID = env.jniEnv->GetFieldID(m_extractedTextClass, "partialEndOffset", "I");
if (m_partialEndOffsetFieldID == NULL) {
qCritical() << "Can't find field partialEndOffset";
return;
}
- m_partialStartOffsetFieldID = env->GetFieldID(m_extractedTextClass, "partialStartOffset", "I");
+ m_partialStartOffsetFieldID = env.jniEnv->GetFieldID(m_extractedTextClass, "partialStartOffset", "I");
if (m_partialStartOffsetFieldID == NULL) {
qCritical() << "Can't find field partialStartOffset";
return;
}
- m_selectionEndFieldID = env->GetFieldID(m_extractedTextClass, "selectionEnd", "I");
+ m_selectionEndFieldID = env.jniEnv->GetFieldID(m_extractedTextClass, "selectionEnd", "I");
if (m_selectionEndFieldID == NULL) {
qCritical() << "Can't find field selectionEnd";
return;
}
- m_selectionStartFieldID = env->GetFieldID(m_extractedTextClass, "selectionStart", "I");
+ m_selectionStartFieldID = env.jniEnv->GetFieldID(m_extractedTextClass, "selectionStart", "I");
if (m_selectionStartFieldID == NULL) {
qCritical() << "Can't find field selectionStart";
return;
}
- m_startOffsetFieldID = env->GetFieldID(m_extractedTextClass, "startOffset", "I");
+ m_startOffsetFieldID = env.jniEnv->GetFieldID(m_extractedTextClass, "startOffset", "I");
if (m_startOffsetFieldID == NULL) {
qCritical() << "Can't find field startOffset";
return;
}
- m_textFieldID = env->GetFieldID(m_extractedTextClass, "text", "Ljava/lang/String;");
+ m_textFieldID = env.jniEnv->GetFieldID(m_extractedTextClass, "text", "Ljava/lang/String;");
if (m_textFieldID == NULL) {
qCritical() << "Can't find field text";
return;
diff --git a/src/plugins/platforms/android/src/qandroidplatformservices.cpp b/src/plugins/platforms/android/src/qandroidplatformservices.cpp
index 841a9d4d51..0df882f1f0 100644
--- a/src/plugins/platforms/android/src/qandroidplatformservices.cpp
+++ b/src/plugins/platforms/android/src/qandroidplatformservices.cpp
@@ -46,29 +46,25 @@
QAndroidPlatformServices::QAndroidPlatformServices()
{
- JNIEnv *env;
- if (QtAndroid::javaVM()->AttachCurrentThread(&env, NULL) < 0) {
- qCritical() << "AttachCurrentThread failed";
+ QtAndroid::AttachedJNIEnv env;
+ if (!env.jniEnv)
return;
- }
- m_openURIMethodID = env->GetStaticMethodID(QtAndroid::applicationClass(),
+ m_openURIMethodID = env.jniEnv->GetStaticMethodID(QtAndroid::applicationClass(),
"openURL",
"(Ljava/lang/String;)V");
}
bool QAndroidPlatformServices::openUrl(const QUrl &url)
{
- JNIEnv *env;
- if (QtAndroid::javaVM()->AttachCurrentThread(&env, NULL) < 0) {
- qCritical() << "AttachCurrentThread failed";
+ QtAndroid::AttachedJNIEnv env;
+ if (!env.jniEnv)
return false;
- }
- jstring string = env->NewString(reinterpret_cast<const jchar *>(url.toString().constData()),
+ jstring string = env.jniEnv->NewString(reinterpret_cast<const jchar *>(url.toString().constData()),
url.toString().length());
- env->CallStaticVoidMethod(QtAndroid::applicationClass(), m_openURIMethodID, string);
- env->DeleteLocalRef(string);
+ env.jniEnv->CallStaticVoidMethod(QtAndroid::applicationClass(), m_openURIMethodID, string);
+ env.jniEnv->DeleteLocalRef(string);
return true;
}
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index 8337e00eb6..36d7a49746 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -54,6 +54,7 @@
#include "qcocoamenu.h"
#include "qcocoamenubar.h"
#include "qcocoahelpers.h"
+#include "qcocoaautoreleasepool.h"
#include <QtCore/qfileinfo.h>
#include <QtGui/private/qguiapplication_p.h>
@@ -250,27 +251,17 @@ QPixmap QCocoaTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const
QPixmap QCocoaTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &size) const
{
- FSRef macRef;
- OSStatus status = FSPathMakeRef(reinterpret_cast<const UInt8*>(fileInfo.canonicalFilePath().toUtf8().constData()),
- &macRef, 0);
- if (status != noErr)
- return QPixmap();
- FSCatalogInfo info;
- HFSUniStr255 macName;
- status = FSGetCatalogInfo(&macRef, kIconServicesCatalogInfoMask, &info, &macName, 0, 0);
- if (status != noErr)
- return QPixmap();
- IconRef iconRef;
- SInt16 iconLabel;
- status = GetIconRefFromFileInfo(&macRef, macName.length, macName.unicode,
- kIconServicesCatalogInfoMask, &info, kIconServicesNormalUsageFlag,
- &iconRef, &iconLabel);
- if (status != noErr)
- return QPixmap();
+ QCocoaAutoReleasePool pool;
- QPixmap pixmap = qt_mac_convert_iconref(iconRef, size.width(), size.height());
- ReleaseIconRef(iconRef);
+ NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:QCFString::toNSString(fileInfo.canonicalFilePath())];
+ if (!iconImage)
+ return QPixmap();
+ NSRect iconRect = NSMakeRect(0, 0, size.width(), size.height());
+ CGImageRef cgImage = [iconImage CGImageForProposedRect:&iconRect
+ context:[NSGraphicsContext currentContext]
+ hints:nil];
+ QPixmap pixmap = QPixmap::fromImage(qt_mac_toQImage(cgImage));
return pixmap;
}
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp
index ebf8e4af85..cd92a07f00 100644
--- a/src/plugins/platforms/eglfs/qeglfswindow.cpp
+++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp
@@ -131,6 +131,7 @@ void QEglFSWindow::setGeometry(const QRect &)
QRect rect(screen()->availableGeometry());
QPlatformWindow::setGeometry(rect);
QWindowSystemInterface::handleGeometryChange(window(), rect);
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(rect));
}
void QEglFSWindow::setWindowState(Qt::WindowState)
diff --git a/src/plugins/platforms/ios/qiosbackingstore.mm b/src/plugins/platforms/ios/qiosbackingstore.mm
index f3c1af2b2d..6007e247f0 100644
--- a/src/plugins/platforms/ios/qiosbackingstore.mm
+++ b/src/plugins/platforms/ios/qiosbackingstore.mm
@@ -74,7 +74,6 @@ void QIOSBackingStore::beginPaint(const QRegion &)
m_context->makeCurrent(window());
- static_cast<QOpenGLPaintDevice *>(paintDevice())->setSize(window()->size());
QIOSWindow *iosWindow = static_cast<QIOSWindow *>(window()->handle());
static_cast<QOpenGLPaintDevice *>(paintDevice())->setSize(window()->size() * iosWindow->devicePixelRatio());
}
diff --git a/src/plugins/platforms/ios/qioscontext.mm b/src/plugins/platforms/ios/qioscontext.mm
index e2a6113010..807c75df54 100644
--- a/src/plugins/platforms/ios/qioscontext.mm
+++ b/src/plugins/platforms/ios/qioscontext.mm
@@ -52,20 +52,17 @@
QIOSContext::QIOSContext(QOpenGLContext *context)
: QPlatformOpenGLContext()
, m_eaglContext([[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2])
+ , m_format(context->format())
{
- // Start out with the requested format
- QSurfaceFormat format = context->format();
-
- format.setRenderableType(QSurfaceFormat::OpenGLES);
- format.setMajorVersion(2);
- format.setMinorVersion(0);
-
- // Even though iOS internally double-buffers its rendering, we
- // report single-buffered here since the buffer remains unchanged
- // when swapping unlesss you manually clear it yourself.
- format.setSwapBehavior(QSurfaceFormat::SingleBuffer);
-
- m_format = format;
+ m_format.setRenderableType(QSurfaceFormat::OpenGLES);
+ m_format.setMajorVersion(2);
+ m_format.setMinorVersion(0);
+
+ // iOS internally double-buffers its rendering using copy instead of flipping,
+ // so technically we could report that we are single-buffered so that clients
+ // could take advantage of the unchanged buffer, but this means clients (and Qt)
+ // will also assume that swapBufferes() is not needed, which is _not_ the case.
+ m_format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
}
QIOSContext::~QIOSContext()
diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm
index d26eca54e5..9abb4ba851 100644
--- a/src/plugins/platforms/ios/qiosglobal.mm
+++ b/src/plugins/platforms/ios/qiosglobal.mm
@@ -104,7 +104,8 @@ Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientat
break;
case UIDeviceOrientationFaceUp:
case UIDeviceOrientationFaceDown:
- qtOrientation = static_cast<Qt::ScreenOrientation>(-1); // not supported ATM.
+ // FIXME: Use cached device orientation, or fall back to interface orientation
+ qtOrientation = Qt::PortraitOrientation;
break;
default:
qtOrientation = Qt::PortraitOrientation;
diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm
index b73f9c3cbc..c1613c1af4 100644
--- a/src/plugins/platforms/ios/qiosscreen.mm
+++ b/src/plugins/platforms/ios/qiosscreen.mm
@@ -83,9 +83,18 @@
- (void) orientationChanged:(NSNotification *)notification
{
Q_UNUSED(notification);
- Qt::ScreenOrientation orientation = toQtScreenOrientation([UIDevice currentDevice].orientation);
- if (orientation != -1)
- QWindowSystemInterface::handleScreenOrientationChange(m_screen->screen(), orientation);
+
+ UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
+ switch (deviceOrientation) {
+ case UIDeviceOrientationFaceUp:
+ case UIDeviceOrientationFaceDown:
+ // We ignore these events, as iOS will send events with the 'regular'
+ // orientations alongside these two orientations.
+ return;
+ default:
+ Qt::ScreenOrientation screenOrientation = toQtScreenOrientation(deviceOrientation);
+ QWindowSystemInterface::handleScreenOrientationChange(m_screen->screen(), screenOrientation);
+ }
}
@end
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index c845b875bf..6291396e6e 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -630,7 +630,7 @@ void QXcbWindow::show()
const QWindow *tp = window()->transientParent();
if (isTransient(window()) || tp != 0) {
xcb_window_t transientXcbParent = 0;
- if (tp)
+ if (tp && tp->handle())
transientXcbParent = static_cast<const QXcbWindow *>(tp->handle())->winId();
// Default to client leader if there is no transient parent, else modal dialogs can
// be hidden by their parents.
diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
index 25d45eb81d..77a78d2140 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
+++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
@@ -430,6 +430,7 @@ void QGtk2FileDialogHelper::applyOptions()
if (!initialNameFilter.isEmpty())
selectNameFilter(initialNameFilter);
+#if GTK_CHECK_VERSION(2, 20, 0)
GtkWidget *acceptButton = gtk_dialog_get_widget_for_response(gtkDialog, GTK_RESPONSE_OK);
if (acceptButton) {
if (opts->isLabelExplicitlySet(QFileDialogOptions::Accept))
@@ -447,6 +448,7 @@ void QGtk2FileDialogHelper::applyOptions()
else
gtk_button_set_label(GTK_BUTTON(rejectButton), GTK_STOCK_CANCEL);
}
+#endif
}
void QGtk2FileDialogHelper::setNameFilters(const QStringList &filters)